一開始接觸 ROS2 時,我會很直覺地把它想成機器人的「大腦」,但更準確地說,ROS2 比較像是機器人各個程式模組之間的溝通系統。
例如:
這些功能不一定全部寫在同一個程式裡,而 ROS2 就負責讓它們彼此交換資料與指令。
ROS2 中常見的幾個基本概念包括:Node、Topic、Publisher、Subscriber。
可以把 Node 想成一個個獨立工作的程式,每個 Node 都有自己的工作。
例如:
Topic 可以想成資料傳遞的「頻道」,有點像不同 Node 之間共用的聊天室。
Publisher 把訊息發布到某個 Topic,而有訂閱這個 Topic 的 Subscriber 就能收到訊息。
Publisher 負責發布資料,而 Subscriber 則負責訂閱資料。
Camera Node → 發布影像 → /camera/image_raw (Topic)→ 我的程式訂閱影像
之後我的程式處理完影像後,也可以再透過 ROS2 發出控制機器人的指令。
ROS2 是在 ROS1 的基礎上重新設計的新一代架構。我目前使用的是 ROS2 Humble,
因此這裡先簡單記錄幾個差異:
| ROS1 | ROS2 |
|---|---|
| ROS Master 為核心 | 採 DDS 為基礎的分散式通訊 |
| 較早期的 ROS 架構 | 為較現代的機器人應用重新設計 |
| ROS Noetic 是 ROS1 最後版本 | Humble、Jazzy 等 ROS2 發行版 |
目前我還沒有深入研究 ROS1,因此這裡主要是先建立基本概念,之後如果有接觸到相關內容,再慢慢補充。
TurtleBot3 是一個常見的移動機器人平台,也有不同的版本與硬體配置。
我目前在模擬環境中使用的是 TurtleBot3 Waffle。
可以把 TurtleBot3 想成這個專題裡機器人的「身體」。之後不管是相機取得畫面、控制輪子移動,或是讓機器人跟著目標移動,最後都需要透過這個移動平台來執行。
Gazebo 可以簡單理解成一個讓機器人活動的「虛擬世界」。
它可以模擬現實中的一些物理環境,例如重力、碰撞、地面與障礙物,也能在裡面加入機器人與不同的感測器。因此能在虛擬世界先模擬一遍可能發生狀況。
它可以模擬:
Gazebo 提供模擬環境 → TurtleBot3 在環境中活動 → ROS2 負責資料與指令交換 → 我的程式利用這些資料控制機器人
可以想成Gazebo 是世界,TurtleBot3 是機器人的身體,ROS2 是程式與機器人之間的溝通橋樑。而我自己寫的 Python 程式,則負責讀取資料、處理影像,並決定接下來要發出什麼控制指令。
如果一開始就把還沒測試過的程式直接放到現實中的機器人上執行,在還不熟悉硬體設備、控制方式,以及周遭環境影響的情況下,讓機器人直接在地面上移動,其實可能會產生不少風險。例如我在程式中的速度設定錯誤、方向判斷異常,或是感測器資料沒有正確讀取,都可能讓機器人突然往錯誤的方向移動,甚至發生碰撞。
因此在真正使用實體機器人之前,我會先利用模擬環境測試程式與控制邏輯。簡單來說,就是先讓它在電腦裡撞牆,總比真的撞到東西好。
透過模擬環境,可以先觀察機器人的移動方式、測試程式碼,也比較方便反覆修改與除錯。
目前專題使用的開發環境如下:
目前先完成最基本的環境建立與測試:
現階段的目標還不是直接開始做視覺追蹤,而是先確認 ROS2、TurtleBot3 與 Gazebo 能夠正常運作,並理解它們彼此之間的關係。
環境建立完成後,接下來才會開始實際操作 TurtleBot3,看看 ROS2 裡有哪些 Topic,以及機器人的相機資料到底是怎麼傳出來的。