什麼是 ROS2?為何要有 ROS2
- ros2
- ros1
- dds
- middleware
問題定義
如果你在 2020 年之前開始學機器人軟體開發,第一個學的框架大概率是 ROS1。但如果你現在打開 ROS 官方文件或任何一門新課程,會發現所有新內容都在講 ROS2。這會讓人很自然地問:ROS1 到底出了什麼問題,非得重新設計一套新框架不可?
答案不是「ROS1 做得不好」,而是「ROS1 的核心架構,撐不住現在機器人產業實際需要的場景」——多機器人協作、嵌入式即時控制、跨網域部署。這些需求在 ROS1 設計的年代(2007 年前後)根本還不存在。
核心概念說明
ROS1 的根本限制:單點故障的 Master
ROS1 的通訊架構依賴一個叫 roscore 的中心化節點(Master)。每個節點啟動時都要向 Master 註冊自己,其他節點要發布或訂閱主題時,也要先問 Master「誰在監聽這個主題」。
這個設計簡單好懂,但有一個致命問題:Master 就是單點故障(single point of failure)。一旦 Master 程序掛掉,整個系統裡的節點就再也無法互相發現彼此——即使他們原本已經建立好的連線還能繼續運作,任何「新的」連線都建立不起來。對一台需要長時間穩定運行的機器人(例如工廠裡的移動機器人、戶外的巡邏機器人)來說,這是不能接受的風險。
ROS2 的解法:DDS 去中心化通訊
ROS2 把底層通訊機制整個換掉,改用工業界行之有年的 DDS(Data Distribution Service) 標準。DDS 最關鍵的特性是去中心化的節點發現機制(discovery):節點之間透過多播(multicast)互相廣播自己的存在,不需要一個中心節點來仲裁。
這代表:
- 沒有單一故障點,任何一個節點掛掉都不影響其他節點之間的通訊
- 原生支援多機器人、跨網域(domain)的通訊隔離
- DDS 本身是即時系統(real-time system)業界常用的標準,讓 ROS2 有機會用在對時序要求嚴格的場景(工業手臂、無人機飛控)
QoS:從「有沒有收到」到「用什麼方式收」
DDS 帶來的另一個重要能力是 QoS(Quality of Service)設定。ROS1 的主題通訊只有一種行為模式;ROS2 可以針對每個主題個別設定:
- Reliability:訊息遺失時要不要重傳(
reliablevsbest_effort) - Durability:新加入的訂閱者要不要收到「加入之前」發布過的訊息(
transient_localvsvolatile) - History:要保留多少筆歷史訊息
舉例來說,感測器的即時資料流(例如雷射掃描)通常用 best_effort——訊息遺失就算了,反正下一筆很快就來;但機器人的地圖資料就會用 transient_local——確保晚加入的節點也能拿到目前的地圖,而不是只能等下一次更新。這部分在後面的 QoS 設定深入解析 會有專門的章節,這裡先知道「ROS2 的通訊行為是可以精細控制的」就好。
實作範例:確認你的環境是「真的能跑」的系統
在深入寫程式碼之前,ROS2 提供一個很好用的健檢指令,可以確認你的安裝與環境設定是否正常:
ros2 doctor --report
在一個安裝正確的環境下,你會看到類似這樣的輸出(節錄關鍵區塊):
ROS DISTRO : lyrical
ROS VERSION : 2
ROS DOMAIN ID : 0 (default)
RMW MIDDLEWARE : rmw_fastrtps_cpp
PLATFORM INFORMATION
system : Linux
platform info : Linux-6.8.0-lyrical-generic-x86_64-with-glibc2.39
release : 6.8.0-lyrical-generic
NETWORK CONFIGURATION
interface name : eth0
ip address : 192.168.1.42
TOPIC LIST
/parameter_events
/rosout
Please note that being 'OK' in the following results does not mean there is
no problem.
All Statuses:
NETWORK CONFIG : OK
PLATFORM : OK
QOS COMPATIBILITY LIST : OK
RMW MIDDLEWARE : OK
TOPIC LIST : OK
看到最後幾行都是 OK,就代表你的 ROS2 環境(發行版設定、中介軟體、網路設定)沒有明顯異常,可以放心繼續往下走。如果 ros2 指令根本找不到,代表環境變數還沒設好,可以先參考 安裝與環境設置。
常見錯誤與除錯技巧
錯誤一:ros2: command not found
bash: ros2: command not found
原因:目前的終端機視窗還沒載入 ROS2 的環境變數(setup.bash)。ROS2 不像一般套件安裝後直接加進 PATH,每次開新的終端機都需要重新 source 一次。
排除方式:
source /opt/ros/lyrical/setup.bash
如果不想每次開終端機都手動打這行,可以加進 ~/.bashrc:
echo "source /opt/ros/lyrical/setup.bash" >> ~/.bashrc
錯誤二:兩台機器上的節點互相看不到彼此
現象:在同一個區網下,機器 A 的節點發布了主題,但機器 B 用 ros2 topic list 卻看不到。
常見原因:兩台機器的 ROS_DOMAIN_ID 設定不一樣。ROS2 用 domain ID 來隔離不同的 ROS2 系統(避免同個網路裡多組人的機器人互相干擾),如果沒有明確設定,預設值雖然都是 0,但只要有一方被改過(例如照著某篇教學設了 export ROS_DOMAIN_ID=30)而另一方沒改,兩邊就會處於不同的邏輯網路,完全看不到對方。
排除方式:確認兩台機器的環境變數一致:
echo $ROS_DOMAIN_ID
兩邊回傳的數字要相同(或都沒設定、都是預設值)。
小結
ROS2 不是 ROS1 的介面翻新,而是把底層通訊機制換成去中心化的 DDS,解決了 ROS1「Master 是單點故障」的根本問題,同時帶來 QoS 精細控制、原生多機器人與即時系統支援。這些改變是接下來所有章節的地基——從下一節開始,我們會實際把環境架起來,寫出第一個能跑的 ROS2 節點。
延伸閱讀
常見問題
- ROS1 真的完全不能用了嗎?
- ROS1 的最後一個發行版 Noetic Ninjemys 已經停止官方維護,代表不會再有安全性更新與新功能。既有系統還能繼續運作,但新專案幾乎不會再選 ROS1,長期維護的產品線也都在規劃遷移。
- ROS2 是不是比 ROS1 難學?
- 核心概念(節點、主題、服務)幾乎一樣,真正的差異在底層通訊機制與一些新增的模式(動作、生命週期節點、QoS)。如果你是從零開始學,直接學 ROS2 不會比學 ROS1 更難,還能省去之後遷移的成本。
- ROS2 可以跟 ROS1 混用嗎?
- 可以透過 ros1_bridge 讓兩者的節點互相通訊,通常用於漸進式遷移(部分子系統先換成 ROS2,舊系統暫時保留 ROS1)。但這只是過渡方案,不建議長期依賴。
- 為什麼不是所有機器人公司都馬上換成 ROS2?
- 既有產品線如果已經用 ROS1 穩定運行多年,重寫整套系統的成本與風險都不小。多數公司採取的是「新專案用 ROS2、舊系統維持到自然汰換」的策略,而不是一次性遷移。