welcom ! Handel home

2025年1月16日 星期四

在 Gazebo 中控制火星探測車(Mars Rover)的方法

 


整合 ROSGazebo 來控制 火星探測車(Mars Rover),可以透過 發布控制訊息 來操作機器人移動。以下是具體步驟與概念:


1. Gazebo 與 ROS 的整合

  • Gazebo 是獨立的機器人模擬軟體,但與 ROS 緊密整合,可讓開發者模擬機器人並存取資訊。

  • gazebo_ros_pkgs 是 ROS 套件,允許 Gazebo 與 ROS 進行通訊。

  • 可以使用 ROS 節點(nodes) 來與 Gazebo 模擬環境中的機器人互動。


2. 機器人模型描述(URDF/XACRO)

  • URDF (Unified Robot Description Format):描述機器人的結構,包括 連桿(links)關節(joints)

  • XACRO:XML 巨集語言,可動態生成 URDF,方便調整機器人元件位置。

  • Gazebo 模型是由 links(連桿)和 joints(關節) 組成。


3. 啟動 Gazebo 和機器人

3.1 使用 roslaunch 指令啟動 Gazebo

roslaunch gazebo_ros empty_world.launch

啟動一個空白的 Gazebo 世界。

3.2 在 Gazebo 中載入機器人

  • 使用 spawn_model 指令將機器人載入 Gazebo:

rosrun gazebo_ros spawn_model -file /path/to/your_robot.urdf -gazebo -x 0 -y 0 -z 0 -model mars_rover
  • 也可以透過 launch 檔案 設定自動載入機器人。


4. 控制機器人移動

4.1 使用 ROS 節點發布控制訊息

  • 機器人移動通常透過輪子的轉速控制

  • Gazebo plugin 可用來控制機器人的輪子轉速,如 diff_drive_controller

4.2 設定 diff_drive_controller 插件(適用於差速驅動機器人)

  • 可使用 gazebo_ros_control 插件來控制機器人的運動。

4.3 發布速度指令到 /cmd_vel topic

  • 使用 geometry_msgs/Twist 訊息類型:

rostopic pub /cmd_vel geometry_msgs/Twist '{linear: {x: 0.5, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.2}}'
  • 這將讓機器人以 0.5 m/s 的速度前進,並以 0.2 rad/s 的速度旋轉。

4.4 使用 Python 腳本控制機器人移動

import rospy
from geometry_msgs.msg import Twist

def move_rover():
    rospy.init_node('rover_controller', anonymous=True)
    pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
    rate = rospy.Rate(10)  # 10Hz
    
    move_cmd = Twist()
    move_cmd.linear.x = 0.5  # 向前移動速度
    move_cmd.angular.z = 0.2  # 旋轉速度
    
    for _ in range(50):  # 持續發送 5 秒的指令
        pub.publish(move_cmd)
        rate.sleep()
    
    move_cmd.linear.x = 0.0  # 停止機器人
    move_cmd.angular.z = 0.0
    pub.publish(move_cmd)
    
if __name__ == '__main__':
    move_rover()
  • 執行指令

rosrun myrobot_gazebo move_rover.py

5. 建立地圖(可選)

5.1 使用 gmapping 套件進行 2D 地圖建構

  • 啟動 PR2 機器人並使用 gmapping 進行地圖建構

roslaunch pr2_gazebo pr2_empty_world.launch
roslaunch pr2_teleop teleop_keyboard.launch  # 使用鍵盤控制機器人移動
roslaunch gmapping slam_gmapping.launch      # 啟動 gmapping 建立地圖

6. 範例程式碼與資源

  • GitHub 連結(提供範例程式碼)ROS_GAZEBO_examples

  • 該範例程式碼包含:

    • launch 檔案:用來啟動 Gazebo 和機器車。

    • Python 腳本:用來控制機器車的輪子轉速。

    • 如何為 Create 模型添加 diff_drive_controller 插件


7. 總結

控制 Gazebo 中的 火星探測車(Mars Rover) 需要以下步驟:

啟動 Gazebo 環境載入機器人模型(URDF/XACRO)建立 ROS 節點,發布 /cmd_vel 速度指令使用 diff_drive_controller 控制機器人的運動可選:使用 gmapping 進行 2D 地圖建構

這些步驟可確保機器人在 模擬環境 中精確移動,並可用於進一步開發如 導航、自動控制 等功能。

🔹 備註

  • 步驟可能因 ROS 版本和機器人模型不同而有變動

  • 請參閱 ROS 和 Gazebo 官方文件獲取最新資訊

ROS 如何整合 Gazebo 和 YOLOv8 進行視覺機器手臂控制

 

整合 ROSGazeboYOLOv8 來實現基於視覺的機器手臂控制,涉及 環境設定、模型訓練、控制邏輯 等多個步驟。以下是一個完整的指導方案。


1. 環境準備

1.1 安裝 ROS 和 Gazebo

  • 安裝 ROS (推薦 ROS Noetic 或更高版本)。
  • 安裝 Gazebo,確保與 ROS 相容。

1.2 安裝 YOLOv8

使用 Python Ultralytics YOLOv8 庫:

pip install ultralytics

2. 數據準備與模型訓練

2.1 準備數據集

  • 收集並標註圖像數據,確保包含多種場景與目標物體。
  • 使用 LabelImg 等工具進行標註。
  • YOLOv8 需要特定格式的數據集,包括圖片和對應的標籤文件。

2.2 訓練 YOLOv8 模型

from ultralytics import YOLO

model = YOLO('yolov8s.pt')  # 加載預訓練模型
results = model.train(data='path/to/data.yaml', epochs=100, imgsz=640)

🔹 注意

  • data.yaml 檔案應包含 訓練與驗證數據的路徑及類別資訊

3. 集成與控制邏輯

3.1 創建 ROS 節點

訂閱來自 Gazebo 中相機的圖像數據,並將其傳遞給 YOLOv8 模型處理。

3.2 設置 Gazebo 內的機械手臂模型

  • 選擇機械手臂(如 UR5、Panda Arm)。
  • 確保機械手臂能接收 ROS 控制指令

3.3 視覺回饋控制

YOLOv8 檢測物體後,將目標位置轉換為 機械手臂運動指令

示例代碼(訂閱相機數據並處理影像)

import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from ultralytics import YOLO

model = YOLO('path/to/your/yolov8_model.pt')
bridge = CvBridge()

def image_callback(msg):
    cv_image = bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')
    results = model(cv_image)  # 使用 YOLOv8 進行檢測
    # 處理檢測結果並控制機械手臂

rospy.init_node('vision_control_node')
image_subscriber = rospy.Subscriber('/camera/image_raw', Image, image_callback)
rospy.spin()

4. 在 Gazebo 中添加 YOLOv8 模型

4.1 修改 Gazebo 模型

  • URDF / SDF 文件中 添加相機傳感器,確保其能夠捕獲圖像並發送到 ROS。
  • 確保相機能夠發送影像到 /camera/image_raw topic。

4.2 啟動 Gazebo 並測試

使用 ROS launch 文件 啟動 Gazebo 仿真環境:

roslaunch your_package your_launch_file.launch

5. 測試與調優

5.1 測試系統

  • 在 Gazebo 運行仿真,觀察機械手臂是否能準確識別目標物體。
  • 確保系統可以根據識別結果生成適當的 運動控制指令

5.2 調優參數

  • YOLOv8 模型參數:調整 置信度閾值、NMS 閾值 等參數。
  • 相機參數:確保 解析度、曝光時間、視野範圍 適當。
  • 機械手臂控制參數:調整 關節速度、運動路徑,確保平穩運行。

6. YOLOv8 在 Gazebo 中的檢測效果分析

6.1 高精度與準確率

  • 多目標環境中,YOLOv8-SS 模型準確率達 91.00%
  • 相較於 YOLOv7,識別精度提升 10.11%

6.2 實時性能

  • YOLOv8-Extend 模型 可達 57.6 FPS,滿足 實時檢測需求

6.3 適應性強

  • 複雜環境(如光照變化、物體遮擋)下仍能高效識別。
  • 適用於農業場景,準確率提升 11.9%

6.4 多目標檢測能力

  • 搭配 ByteTrack 進行 多目標檢測與追蹤,準確率可達 94%

7. 總結

透過 ROS、Gazebo 和 YOLOv8,可以實現 基於視覺的機械手臂控制,具備以下優勢:

高精度目標檢測適用於動態環境高效能並行計算可擴展性強(適用於 工業自動化、智慧農業、機器人抓取 等場景)

這套技術堆疊將提升 機械手臂在複雜環境中的操作能力,推動智慧機器人技術的進一步發展。🚀


=================================

以下是一些推荐的视频,展示了如何在 Gazebo 中使用 YOLOv8 进行目标检测和相关应用:

  1. YOLOv8 Aerial Sheep Detection and Counting
    该视频演示了在 Gazebo 中使用 YOLOv8 进行羊只检测和计数的仿真。视频展示了如何设置环境以及模型的运行效果。
    观看视频 
    1
  2. Aerial Object Detection with PX4 Autopilot and ROS 2
    这个视频展示了如何使用 PX4 无人机和 ROS 2 在 Gazebo 中进行空中目标检测,利用 YOLOv8 进行实时识别。
    观看视频 
    3
  3. ROS与Gazebo中的YOLO仿真
    演示了如何在 ROS 环境下,将 Gazebo 和 YOLO 集成,实现小车的目标检测功能。适合想要了解 ROS 与 Gazebo 整合的用户。
    观看视频 
    5

这些视频为你提供了在 Gazebo 中集成 YOLOv8 的实践示例和详细步骤,帮助你更好地理解和应用这一技术。

Go (Golang) 語言優缺點分析

 


Go (又稱 Golang) 是 Google 開發的一種程式語言,具有簡潔的語法、強大的並行處理能力和高效能的特點。以下是 Go 語言的主要優勢與缺點分析。


Go 的優點

1. 簡潔、快速、安全

Go 以簡潔的語法設計,減少程式碼冗餘,並具備高效的編譯速度與內建的安全性機制。

2. 強大的並行處理能力

  • Go 採用 Tony Hoare 提出的交談循序程式 (CSP) 並行模型。

  • 提供 goroutinechannel 機制,可高效處理高並發應用。

  • Goroutine 是輕量級執行緒,可並行執行多個任務。

  • Channel 用於 goroutine 之間的通訊與同步。

3. 高效能

  • 適用於高效能分散式系統。

  • 在伺服器端開發中,能比許多其他語言更具效率。

4. 垃圾回收機制 (Garbage Collection, GC)

  • Go 具備自動記憶體管理功能,減少記憶體洩漏風險。

  • 透過增量式 GC 改善了應用程式的效能。

5. 豐富的內建類型與函數多回傳值

  • 內建 map (類似 Python 的 dict) 等資料結構。

  • 支援 函數多回傳值,提升程式靈活性。

6. 跨平台支援

  • Go 原生支援跨平台編譯,可產生適用於 Linux、macOS、Windows 等作業系統的執行檔。

7. 靜態型別與執行時效率

  • Go 是靜態型別語言,提供更安全的型別檢查。

  • 相較於動態語言,Go 具有更高的執行時效能。

8. 內建開發工具

  • 內建 gofmt 工具,可自動整理程式碼,確保統一的撰寫風格。

9. 模組化專案架構

  • 採用 module 概念,每個專案都是一個 module

  • 透過 go.mod 檔案來管理依賴庫,避免傳統 GOPATH 限制。


Go 的缺點

1. 泛型支援較晚

  • Go 在早期版本缺乏 泛型,直到 Go 1.18 才正式加入。

  • 部分開發者認為現有泛型支援仍不夠完善。

2. 垃圾回收機制的限制

  • 雖然 Go 1.8 之後改進了 GC,但仍不如 JVM (Java Virtual Machine)G1 GCZGC 高效。

  • 一些團隊因 GC 卡頓問題轉向 Rust

3. 缺乏某些功能

  • Go 不支援

    • 列舉 (enum)

    • 例外處理 (exception handling)

    • 繼承 (inheritance)

    • 斷言 (assertion)

    • 虛擬函式 (virtual function)

4. 程式撰寫風格限制

  • Go 強制要求大括號 {} 不能換行

  • gofmt 強制程式碼格式統一,對於某些開發者來說可能過於嚴格。


總結

Go 是一種 高效能、簡潔且具備強大並行處理能力 的程式語言,特別適合 高併發、雲端原生 (Cloud-native) 應用。雖然 Go 在泛型支援與垃圾回收方面仍有改進空間,但它在 Docker、Kubernetes、微服務架構 等領域仍然是最受歡迎的選擇之一。

Go 適用場景

  • 分散式系統 (Distributed Systems)

  • 微服務 (Microservices)

  • 雲端運算 (Cloud Computing)

  • 高併發網路應用 (High Concurrency Networking Apps)

  • 嵌入式開發 (Embedded Systems)

知名專案

  • Docker (容器技術)

  • Kubernetes (容器編排)

  • Prometheus (監控系統)

  • Etcd (分散式 Key-Value 資料庫)

  • Caddy (Web 伺服器)

Go 語言的簡潔性與高效能,使其成為現代開發者不可忽視的重要工具。

rosrun 進行動 範例機器人的範例

 在 Gazebo ROS 中,你可以使用 ros_gazebo 提供的 topics 來控制機器人的位置、方向,或改變連結狀態。以下提供具體範例,展示如何透過 ROS 指令或 Python 程式來控制機器人。


方法 1:使用 /gazebo/set_model_state 來移動機器人

這個方法可以讓你直接改變機器人的位置,而不需要透過控制器 (如 cmd_vel)。

1.1 使用 rostopic pub 指令來移動機器人

你可以用 rostopic pub 來將機器人傳送到指定位置,例如:

bash:
rostopic pub -1 /gazebo/set_model_state gazebo_msgs/ModelState '{ model_name: "robot_name", pose: { position: { x: 2.0, y: 3.0, z: 0.0 }, orientation: { x: 0.0, y: 0.0, z: 0.0, w: 1.0 } }, twist: { linear: { x: 0.0, y: 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: 0.0 } }, reference_frame: "world" }'

🔹 說明

  • model_name: "robot_name" → 這裡要填你的機器人名稱,可以在 /gazebo/model_states 找到。
  • pose.position.x/y/z → 設定機器人新位置。
  • pose.orientation.x/y/z/w → 設定機器人旋轉角度 (四元數)。
  • twist.linear / angular → 設定機器人的速度 (這裡設為 0.0 表示靜態移動)。
  • reference_frame: "world" → 參考座標系 (通常設為 "world")。

1.2 使用 Python 控制機器人移動

你也可以使用 Python 腳本來發送 set_model_state 指令:

python:
#!/usr/bin/env python3 import rospy from gazebo_msgs.msg import ModelState from gazebo_msgs.srv import SetModelState def move_robot(): rospy.init_node('move_robot', anonymous=True) rospy.wait_for_service('/gazebo/set_model_state') try: set_state = rospy.ServiceProxy('/gazebo/set_model_state', SetModelState) state_msg = ModelState() state_msg.model_name = "robot_name" # 替換為你的機器人名稱 state_msg.pose.position.x = 2.0 state_msg.pose.position.y = 3.0 state_msg.pose.position.z = 0.0 state_msg.pose.orientation.w = 1.0 state_msg.reference_frame = "world" resp = set_state(state_msg) if resp.success: print("Robot moved successfully") else: print("Failed to move robot") except rospy.ServiceException as e: print("Service call failed:", e) if __name__ == "__main__": move_robot()

🔹 執行方式

  1. 儲存為 move_robot.py
  2. 給予執行權限:
    bash:
    chmod +x move_robot.py
  3. 執行:
    bash:
    rosrun <your_package> move_robot.py

方法 2:使用 /cmd_vel 控制機器人移動

如果你的機器人使用 差速驅動 (如 TurtleBot),你可以透過 /cmd_vel 來讓機器人移動,而不只是改變位置。

2.1 發送速度指令

bash:
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{ linear: { x: 0.5, y: 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: 0.3 } }'

🔹 說明

  • linear.x = 0.5 讓機器人向前移動。
  • angular.z = 0.3 讓機器人向左旋轉。
  • -r 10 代表每秒發送 10 次指令。

2.2 使用 Python 發送速度指令

python:
#!/usr/bin/env python3 import rospy from geometry_msgs.msg import Twist def move(): rospy.init_node('robot_mover', anonymous=True) pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10) rate = rospy.Rate(10) # 10 Hz twist = Twist() twist.linear.x = 0.5 # 設定前進速度 twist.angular.z = 0.3 # 設定旋轉速度 for _ in range(50): # 發送 5 秒的速度指令 pub.publish(twist) rate.sleep() twist.linear.x = 0.0 # 停止移動 twist.angular.z = 0.0 pub.publish(twist) if __name__ == "__main__": move()

🔹 執行方式

  1. 儲存為 move_cmd_vel.py
  2. 給予執行權限:
    bash:
    chmod +x move_cmd_vel.py
  3. 執行:
    bash:
    rosrun <your_package> move_cmd_vel.py

方法 3:使用 /gazebo/set_link_state 移動機器人的部件

如果你只想移動機器人的某個 連結 (link),例如讓機械臂某個關節變動,可以使用 /gazebo/set_link_state

3.1 使用 rostopic pub 設定某個 Link 的狀態

bash:
rostopic pub -1 /gazebo/set_link_state gazebo_msgs/LinkState '{ link_name: "robot::arm_link", pose: { position: { x: 1.0, y: 0.5, z: 1.2 }, orientation: { x: 0.0, y: 0.0, z: 0.0, w: 1.0 } }, twist: { linear: { x: 0.0, y: 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: 0.0 } }, reference_frame: "world" }'

🔹 說明

  • link_name: "robot::arm_link" → 設定某個 link (替換成你的 link 名稱)。
  • pose.position.x/y/z → 設定新位置。
  • pose.orientation → 設定旋轉角度。

結論

方法適用情境指令
/gazebo/set_model_state直接改變機器人位置rostopic pub or Python
/cmd_vel讓機器人移動 (類似遙控車)rostopic pub or Python
/gazebo/set_link_state只改變某個連結的位置rostopic pub or Python

如果你想讓機器人立即跳躍到某個位置,用 /gazebo/set_model_state 會比較簡單;如果你想模擬機器人的移動行為,使用 /cmd_vel 會更貼近真實機器人的運動方式。

你可以根據你的需求選擇最適合的方法來控制 Gazebo 中的機器人!🚀

Gazebo ROS Topics 說明

 在 ROS (Robot Operating System) 中,Gazebo 透過 ROS topics 來與模擬環境進行資料傳輸。以下是 ros_gazebo 相關 topics 的用途與備註:


Gazebo ROS Topics 說明

Topic 名稱用途備註
/clock提供模擬時間Gazebo 使用模擬時間,與 ROS 的 ros::Time::now() 配合使用。
/gazebo/link_states發佈所有連結 (links) 的狀態資訊包括每個連結的名稱、位置、方向、速度等。
/gazebo/model_states發佈所有模型 (models) 的狀態資訊包括機器人或物體的位置、方向等,類似 /gazebo/link_states 但對應於整個模型。
/gazebo/parameter_descriptionsGazebo 參數的描述資訊用於描述 Gazebo 參數,通常與 parameter_updates 配合使用。
/gazebo/parameter_updatesGazebo 參數的更新資訊當 Gazebo 參數變更時,此 topic 會發佈更新資訊。
/gazebo/performance_metricsGazebo 模擬效能指標例如 FPS、CPU 使用率等,適用於監測模擬效能。
/gazebo/set_link_state設定 Gazebo 內某個連結的狀態允許透過 ROS 設定某個 link 的位置、方向等。
/gazebo/set_model_state設定 Gazebo 內某個模型的狀態允許透過 ROS 設定整個 model (機器人或物體) 的位置、方向等。
/rosoutROS 記錄訊息 (log)用於記錄 ROS 節點的輸出訊息。
/rosout_agg聚合後的 ROS 記錄訊息整合不同來源的 /rosout 訊息,方便查看。

應用範例

  1. 取得機器人當前的位置

    bash:
    rostopic echo /gazebo/model_states

    這將輸出所有模型的位置與方向。

  2. 設定機器人到特定位置

    bash:
    rostopic pub -1 /gazebo/set_model_state gazebo_msgs/ModelState '{model_name: "robot", pose: { position: { x: 1.0, y: 2.0, z: 0.0 } } }'

    這會將名為 "robot" 的模型移動到 (x=1.0, y=2.0, z=0.0)

  3. 監測模擬效能

    bash:
    rostopic echo /gazebo/performance_metrics

    這將顯示 FPS、CPU 使用率等資訊。


這些 Topics 在 Gazebo 與 ROS 整合時非常重要,讓模擬環境可以與 ROS 節點互動、獲取狀態資訊、修改模型位置,並監測模擬效能。

Ollama 研究指南

 

Ollama 研究指南

測驗

請以簡短的 2-3 句話回答下列問題:

  1. 什麼是 Ollama,它的主要用途是什麼?
  2. Ollama 支援哪些作業系統?
  3. Ollama 如何簡化大型語言模型 (LLM) 的使用?
  4. 如何在 Ollama 中下載和執行模型?
  5. 在 Ollama 中,ollama run llama3 指令的用途是什麼?
  6. 什麼是 Modelfile,它在 Ollama 中的作用是什麼?
  7. Ollama 使用的預設 API 端口是什麼?
  8. RESTful API 在 Ollama 的應用是什麼?
  9. 什麼是 GGUF,它與 Ollama 的關係是什麼?
  10. 什麼是 RAG,如何在 Ollama 中應用?

測驗答案

  1. Ollama 是一個開源的框架,主要用於在本機端輕鬆部署和運行大型語言模型 (LLM)。它簡化了下載、管理和執行 LLM 的流程。
  2. Ollama 支援 macOS、Linux 和 Windows 等主流作業系統,這讓它可以在不同的開發環境中使用。
  3. Ollama 透過提供一個簡單的 CLI 工具和 API 服務,使得使用者不必深入了解複雜的程式碼或模型架構,就能輕鬆使用 LLM。
  4. 使用 ollama pull <模型名稱> 指令下載模型,然後使用 ollama run <模型名稱> 指令執行模型。Ollama 會自動處理模型下載和部署。
  5. ollama run llama3 指令會下載名為 llama3 的模型(如果尚未下載),然後啟動一個互動式的對話界面,讓使用者與該模型互動。
  6. Modelfile 是 Ollama 用於定義自訂模型的格式檔,其中包含了模型來源、參數、系統提示和範本等資訊。它讓使用者能客製化模型。
  7. Ollama 的預設 API 端口是 11434,透過這個端口,你可以使用 API 與 Ollama 模型進行互動。
  8. 在 Ollama 中,RESTful API 可用於程式化地與模型進行互動,像是產生文本或進行聊天,而不是只能使用 CLI。使用者可以使用 HTTP 請求來呼叫模型,這讓整合到其他應用程式變得更加容易。
  9. GGUF (GPT-Generated Unified Format) 是一種專為大型語言模型設計的量化格式,可以提高在 CPU 或 GPU 上執行的效率,Ollama 支援 GGUF 格式,允許使用者載入和使用以這種格式儲存的模型。
  10. RAG (Retrieval-Augmented Generation) 是一種利用外部知識來增強語言模型生成能力的方法。在 Ollama 中,可以使用 RAG 來擴展模型的知識,使其能夠根據特定的數據或文件回答問題。

論述題

請針對下列題目,以論文格式回答(請勿提供答案)。

  1. 探討 Ollama 在本地 AI 開發中的重要性,並分析其相對於雲端服務的優缺點。
  2. 詳細比較在 Ollama 中使用 CLI、RESTful API 和 Python SDK 的差異,並說明各自的應用情境。
  3. 分析 Modelfile 的作用,並舉例說明如何使用 Modelfile 創建一個自訂的 LLM 模型。
  4. 探討 Ollama 與其他本地 LLM 部署工具(如 LM Studio)的差異,並說明各自的適用場景。
  5. 解釋 RAG 技術在本地 LLM 應用中的價值,並說明如何在 Ollama 中實作 RAG。

詞彙表

以下是本研究指南中出現的關鍵詞彙及其定義:

  • Ollama:一個開源的工具,允許使用者在本機端輕鬆部署和運行大型語言模型。
  • LLM (Large Language Model):大型語言模型,是一種基於大量文本數據訓練的人工智慧模型,能理解和生成人類語言。
  • CLI (Command Line Interface):命令列介面,一種透過輸入文字命令與電腦互動的方式。在 Ollama 中,CLI 用於下載、運行和管理模型。
  • RESTful API:一種軟體架構風格,用於建立網路服務。Ollama 提供 RESTful API,允許開發者透過 HTTP 請求與模型互動。
  • Modelfile:Ollama 用於定義模型配置的文件,包含模型來源、參數、系統提示和範本等。
  • GGUF (GPT-Generated Unified Format):一種用於儲存和載入大型語言模型的二進制檔案格式,可以提高在 CPU 或 GPU 上執行的效率。
  • RAG (Retrieval-Augmented Generation):檢索增強生成,是一種利用外部知識來增強語言模型生成能力的方法。
  • Model Quantization:模型量化,是一種降低模型參數精度的方法,可以減少模型大小,加快運行速度。
  • Hugging Face: 一個提供大量預訓練模型和數據集的人工智慧平台,許多 Ollama 模型都是從這裡衍生而來。
  • Docker: 一種容器化平台,可將應用程式及其依賴項打包成容器,方便部署和管理。Ollama 亦支援 Docker 部署。
  • Open WebUI: 一個可以與 Ollama 模型互動的網頁圖形介面。
  • API Key: 一個驗證使用者身份的唯一碼,通常用在與雲端服務互動時。Ollama 並不需要 API Key,因為它是在本機端運作。
  • System Prompt: 系統提示,是在使用 LLM 模型時,預先設定的一些指示或規範,用以引導模型的回應方式。
  • Template: 範本,在 Ollama 中,指的是定義 LLM 如何解釋輸入提示 (prompts) 的格式。它通常用於處理多輪對話或系統訊息。
  • Token: 在自然語言處理中,指的是文字的最小單位,例如單字或符號。LLM 模型會將輸入的文字分解成 token 來處理。
  • ollama serve: Ollama 的一個指令,用於啟動 Ollama 的 API 服務,以便其他應用程式可以使用這些模型。
  • ollama pull: Ollama 的一個指令,用於從 Ollama 模型庫下載模型到本機。
  • ollama run: Ollama 的一個指令,用於運行已下載的模型。
  • ollama list: Ollama 的一個指令,用於列出本機已下載的模型。
  • ollama rm: Ollama 的一個指令,用於刪除本機已下載的模型。
  • ollama cp: Ollama 的一個指令,用於複製模型。
  • OLLAMA_MODELS: 一個環境變數,可以用於指定 Ollama 模型儲存的路徑。
  • OLLAMA_API_BASE: 一個環境變數,用於指定 Ollama API 伺服器的網址。

YOLO8 自訓練

 

          YOLO8 自訓練 



YOLO8 安裝教學



YOLO8 訓練資料集 DIY











YOLOv8 自訓練指南

 YOLOv8 自訓練指南

YOLOv8 是一個多功能的 AI 視覺處理平台,不僅可用於物件偵測,還能處理圖像分類、分割、追蹤,以及姿態估計等任務。以下介紹 YOLOv8 自訓練時可使用的工具與相關流程。


1. 資料標記工具

  • Roboflow:線上數據管理平台,提供圖像標註、數據清理、轉換和管理功能,可輸出 YOLO 格式數據,並支援資料增強。

  • LabelImg:本地端圖像標註工具,可安裝於電腦並進行標註。

  • Labelme:適用於圖像分割任務,能產生 Mask 圖像。

  • Label Studio:開源數據標記工具,提供簡單 UI,支援圖像與影片標記。

  • CVAT:互動式影片與圖像標註工具。

  • Makesense.ai:免費線上標記工具,瀏覽器即可使用。


2. 資料集準備

  • 資料夾結構:YOLOv8 的資料集通常包含以下資料夾:

    • train/:存放訓練圖片與標籤檔。

    • valid/:存放驗證圖片與標籤檔。

    • test/ (非必要):存放測試圖片與標籤檔。

    • 各資料夾內需有 images/ (圖片) 與 labels/ (標籤檔)。

  • 標籤格式:使用 YOLOv5 PyTorch TXT 格式,標籤檔以 TXT 格式儲存,包含類別與邊界框資訊。

  • 資料分割:圖片分割比例通常為 8:2 (訓練集:驗證集) 或其他適當比例。


3. YAML 參數設定檔

data.yaml 用於描述資料集位置與類別資訊,包含以下內容:

path: /path/to/dataset
train: train/images
val: valid/images
test: test/images  # 非必要
nc: 類別數量
names: ['class1', 'class2', 'class3']

4. 模型訓練

  • 選擇模型

    • yolov8n (nano) - 適合資源受限環境。

    • yolov8s (small) - 速度與精度均衡。

    • yolov8m (medium) - 適合中等規模應用。

    • yolov8l (large) - 高精度模型。

    • yolov8x (extra-large) - 最精確但計算需求最高。

  • 訓練方式

    • 命令行模式

      yolo detect train data=data.yaml model=yolov8n.pt epochs=100 imgsz=640
    • Python 程式碼模式

      from ultralytics import YOLO
      model = YOLO('yolov8n.pt')
      model.train(data='data.yaml', epochs=100, imgsz=640)
  • 訓練參數

    • data:資料集 YAML 檔路徑。

    • model:選擇的 YOLOv8 預訓練模型。

    • epochs:訓練輪數。

    • imgsz:輸入圖像大小。

    • device:使用 CPU 或 GPU。

    • batch:批次大小。

    • workers:數據加載器的工作數。


5. 模型驗證與測試

  • 驗證

    • 訓練過程中,模型會定期在驗證集上評估性能,以調整參數並防止過擬合。

  • 測試

    • 訓練完成後,使用測試集評估最終性能。

  • 測試方式

    • 命令行模式

      yolo detect predict model=best.pt source=test/images
    • Python 程式碼模式

      results = model.predict(source='test/images')
  • 輸出結果

    • 包含帶有邊界框的圖像、標籤資訊與效能指標。


6. Ultralytics HUB

Ultralytics HUB 是一個 AI 平台,支援創建、訓練與部署機器學習模型,並可與 Roboflow 結合,方便管理數據與分析結果。


總結

YOLOv8 提供完整的自訓練流程,從資料標註到模型訓練與測試,均有相應工具可使用。

  • Roboflow 簡化資料標註與準備流程。

  • Ultralytics HUB 協助模型管理與部署。

  • 多種訓練方式 可依需求選擇命令行或 Python API。

使用者可根據需求選擇適合的工具與流程來訓練 YOLOv8 模型。

如何在 Gazebo 中添加新的世界和模型

 

如何在 Gazebo 中添加新的世界和模型


1. 添加新的世界

Gazebo 提供了一些 預設世界,但你也可以 自訂 .world 檔案,來建立自己的模擬環境。

1.1 使用預設世界

Gazebo 預設提供了一些 內建世界,例如:

  • empty_world.launch(空白世界)
  • willowgarage_world.launch(Willow Garage 環境)
  • mud_world.launch(泥地環境)

可以使用 roslaunch 啟動:

bash:
roslaunch gazebo_ros empty_world.launch

1.2 創建自訂世界

  1. 建立 .world 檔案

    • .world 檔案使用 SDF(Simulation Description Format) 格式來描述環境。
    • 內容示例:
      xml:
      <?xml version="1.0" ?> <sdf version="1.6"> <world name="my_world"> <include> <uri>model://ground_plane</uri> </include> <include> <uri>model://sun</uri> </include> </world> </sdf>
    • 這個 .world 檔案包含:
      • 地面 (ground_plane)
      • 太陽光源 (sun)
  2. .world 檔案存放至合適位置

    bash:
    mkdir -p ~/gazebo_worlds nano ~/gazebo_worlds/my_world.world
    • 可以將 .world 文件存放於 ROS 工作區(如 ~/catkin_ws/src/my_package/worlds/)。
  3. 建立 .launch 啟動檔

    xml:
    <launch> <arg name="world_file" default="$(find my_package)/worlds/my_world.world"/> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(arg world_file)"/> </include> </launch>
    • 這個 .launch 檔案 會載入 my_world.world 並啟動 Gazebo。
  4. 使用 roslaunch 啟動新世界

    bash:
    roslaunch my_package my_world.launch

2. 添加新的模型

Gazebo 允許載入內建模型,也可以 自訂模型(SDF 或 URDF 格式)。

2.1 使用內建模型

Gazebo 提供 官方和社群的內建模型,可以在 .world 檔案中直接引用:

xml:
<include> <uri>model://box</uri> <pose>0 0 0 0 0 0</pose> </include>

這樣會在 座標 (0,0,0) 處添加一個方形模型。


2.2 自訂模型

如果要 自己創建模型,需使用 SDF 或 URDF 格式。

  1. 建立 SDF 格式模型

    xml:
    <?xml version="1.0" ?> <sdf version="1.6"> <model name="my_box"> <static>false</static> <link name="base_link"> <collision name="collision"> <geometry> <box> <size>1 1 1</size> </box> </geometry> </collision> <visual name="visual"> <geometry> <box> <size>1 1 1</size> </box> </geometry> </visual> </link> </model> </sdf>
    • 這個模型是一個 1x1x1 的方塊,可以移動。
  2. 將 SDF 檔案放入 Gazebo 模型資料夾

    bash:
    mkdir -p ~/.gazebo/models/my_box nano ~/.gazebo/models/my_box/model.sdf

    模型結構

    javascript:
    ~/.gazebo/models/my_box/ ├── model.config ├── model.sdf
  3. 將模型載入世界

    • .world 檔案中:
      xml:
      <include> <uri>model://my_box</uri> <pose>0 0 0.5 0 0 0</pose> </include>

3. 使用 spawn_model 動態載入模型

Gazebo 支援透過 spawn_model 指令 在運行時 動態添加模型

bash:
rosrun gazebo_ros spawn_model -file ~/.gazebo/models/my_box/model.sdf -sdf -model my_box
  • 參數解釋
    • -file → 指定 SDF/URDF 檔案
    • -sdf → 指定模型格式(-urdf 代表 URDF 格式)
    • -model → 指定模型名稱

如果模型是 XACRO 格式,需先轉換為 URDF

bash:
rosrun xacro xacro my_robot.xacro > my_robot.urdf

4. 與 ROS 互動

當模型載入後,可以 透過 ROS topic 與 Gazebo 互動

4.1 監聽模型狀態

bash:
rostopic echo /gazebo/model_states

輸出範例

yaml:
name: ['ground_plane', 'my_box'] pose: - position: {x: 0, y: 0, z: 0} - position: {x: 1, y: 2, z: 0}

4.2 發送指令控制機器人

bash:
rostopic pub /cmd_vel geometry_msgs/Twist "linear: {x: 0.5, y: 0, z: 0}"

這樣會讓機器人向前移動。


5. 總結

步驟內容
添加世界    建立 .world 檔案,使用 roslaunch 啟動
使用預設世界  roslaunch gazebo_ros empty_world.launch
自訂世界   創建 .world,加入地形與光線
添加內建模型   在 .world 檔案中使用 <include> 加載模型
自訂模型   創建 SDF 或 URDF 模型,放入 ~/.gazebo/models/
動態載入模型    rosrun gazebo_ros spawn_model -file model.sdf -sdf -model my_box
與 ROS 互動   使用 rostopic 監聽 /gazebo/model_states,發送指令控制機器人

Gazebo 不僅支援預設世界和模型,也允許用戶自訂環境、載入新模型,並透過 ROS 進行控制,這使得它成為機器人開發與模擬的強大工具。 🚀