昨天先整理了 ROS2、TurtleBot3 與 Gazebo 之間的關係,也認識了 Node、Topic、Publisher 和 Subscriber。不過,知道 Topic 是資料傳遞的「頻道」之後,接下來還有一個很實際的問題:
機器人啟動後,我要怎麼知道有哪些頻道?又要去哪裡找到相機資料?
因為我的專題會用到視覺追蹤,所以今天先從終端機操作開始,查看系統中的 Node 與 Topic,找到之後程式要使用的影像資料通道。
開發環境:Ubuntu 22.04、ROS2 Humble、TurtleBot3 Waffle 與 Gazebo Classic。
第一個終端機,載入 ROS2 環境:
source /opt/ros/humble/setup.bash
如果 TurtleBot3 套件是放在自己編譯的工作空間中,也需要接著載入該工作空間的 install/setup.bash,路徑依自己的安裝位置而定。
接著指定機器人型號,並啟動模擬環境:
export TURTLEBOT3_MODEL=waffle
ros2 launch turtlebot3_gazebo empty_world.launch.py
TURTLEBOT3_MODEL 用來指定要載入的機器人型號;這裡使用 waffle。
empty_world.launch.py 則會啟動空白世界,並載入 TurtleBot3。
等模擬環境完成載入後,先保留這個終端機繼續執行
相關啟動方式可以參考 ROBOTIS 官方模擬教學。

第二個終端機查看Node、Topic:
source /opt/ros/humble/setup.bash
先載入環境如果有使用自己編譯的工作空間,這裡也依照前面的方式載入。
ros2 node list
這個指令會列出目前 ROS 2 能發現的節點名稱。
在昨天把 Node 想成各自負責一項工作的功能單位,例如取得感測器資料、處理機器人狀態,或控制移動。啟動 TurtleBot3 的模擬環境時,背後也會有多個 Node 分工。
以下列出兩個可以留意的節點名稱示例,實際清單依套件版本與啟動設定而有所不同:
| Node 名稱示例 | 主要工作 |
|---|---|
/robot_state_publisher |
根據機器人模型與關節狀態,發布各部位之間的座標轉換關係 |
/turtlebot3_diff_drive |
處理模擬機器人的輪子驅動,接收速度指令並發布里程計資訊 |
這裡我先認識與專題有關的功能就好。像是座標轉換、里程計的細節,之後實際用到時再慢慢補上。畫面上雖然只有一台機器人,背後其實有好幾個功能單位一起工作。
知道有哪些 Node 之後,接著查看它們使用的資料通道:
ros2 topic list
這個指令會列出目前 ROS 2 能發現的 Topic 名稱。如果沿用昨天「聊天室」的比喻,可以這樣記:
ros2 node list: 查看有哪些功能單位。ros2 topic list: 查看有哪些用來交換訊息的頻道在 TurtleBot3 模擬環境中,可以留意下面這幾種常見 Topic (仍以自己終端機列出的結果為準)。
| Topic 名稱示例 | 資料用途 |
|---|---|
/camera/image_raw |
相機的影像訊息 |
/cmd_vel |
機器人的速度控制指令,例如前進速度與旋轉速度 |
/odom |
里程計資訊,包含估計的位置、方向與速度 |
/scan |
雷射掃描取得的距離資料 |
這些 Topic 和專題的不同部分有關。
例如,視覺處理程式需要相機影像;之後要控制機器人移動,則會接觸到速度指令。
/camera/image_raw (重要)在 Gazebo 視窗裡,我們可以從外部觀察機器人與場景;機器人相機的影像,則來自模擬相機本身的位置與朝向。
要讓之後的 Python 程式取得這些影像,就需要先找到對應的 Topic。
以下以 /camera/image_raw 為例,這個指令可以查看訊息型別、發布端數量與訂閱端數量:
ros2 topic info /camera/image_raw
這個指令可以查看訊息型別、發布端數量與訂閱端數量。
下面是 用來說明欄位的示例,數字會隨實際啟動的程式而改變:
Type: sensor_msgs/msg/Image
Publisher count: 1
Subscription count: 0
Publisher count: 1,表示目前發現一個發布端。在相機的情境裡,發布端負責把影像送到這個 Topic。在 Gazebo Classic 模擬中,這通常由相機相關的 ROS 插件處理。
這個數字可以幫助我們檢查資料來源是否存在;要確認影像是否持續傳來,還需要後續實際接收訊息。
Subscription count: 0,表示目前沒有發現訂閱這個 Topic 的接收端。
如果還沒啟動影像顯示工具或自己的視覺處理程式,出現 0 是可能的。
之後當程式建立了對這個 Topic 的訂閱,訂閱端數量就可能增加。
這也剛好接回昨天的概念: Publisher 負責發布資料,Subscriber 負責接收資料。
另外,這兩個欄位計算的是發布端與訂閱端的數量,不一定等於 Node 數量,因為一個 Node 可以建立多個發布端或訂閱端。
不同相機、模型或啟動設定,可能會使用不同的 Topic 名稱。如果清單中沒有 /camera/image_raw,可以先列出名稱與訊息型別:
ros2 topic list -t
留意其中型別為 sensor_msgs/msg/Image 的項目,再依名稱與相機設定,判斷哪個是要使用的影像通道。彩色影像與深度影像都可能使用這個型別,因此也要確認資料用途。
找到實際名稱後,把前面 ros2 topic info 指令中的 /camera/image_raw 換成自己的 Topic 名稱即可。
如果完全沒有相機相關項目,則先回頭確認模擬環境是否完成載入、使用的模型是否有相機,以及兩個終端機是否使用相同的 ROS 2 通訊環境。
ros2 node list 查看目前有哪些節點。ros2 topic list 查看目前有哪些資料通道。ros2 topic info 判讀訊息型別、發布端與訂閱端數量。接下來會沿著找到的相機 Topic,嘗試接收影像並顯示畫面,看看機器人的相機視角,再逐步接到後續的視覺追蹤。
https://docs.robotis.com/docs/systems/turtlebot3/simulation/slam_simulation/#launch-simulation-world