ROS可以說是⽬前機器⼈相關開源社區最流⾏的項⽬之⼀,它是⼀個易⽤且完備的機器⼈開發框架、⽣態乃⾄社區,海量的機器⼈開源項⽬(涵蓋感知、規划、控制、定位、SLAM和建圖、可視化等⼏乎所有機器⼈領域)均使⽤ROS作為基礎。
以⾃動駕駛汽⻋為代表的新的機器⼈應⽤場景對於中間層和開發框架在實時性、可靠性、伸縮性、跨平台可移植等⽅⾯提出了⼤量新的需求,ROS 顯然不能滿⾜這些需求,ROS2因此產⽣,在經歷了若⼲年的迭代后,ROS2項⽬⽬前已經相對完備和穩定,對於我們開發者⽽⾔,是時候擁抱ROS2了。
1.為什么轉向ROS
ROS⾃2007年發布以來,為機器⼈社區提供了⼀套相對完善的中間層、⼯具、軟件乃⾄通⽤的接⼝和標准,可以說,憑借ROS,機器⼈⼯業領域的開發者能夠快速開發系統原型並做測試和驗證。⾃動駕駛本質上是機器⼈研究的⼀個應⽤領域,在產品原型快速開發的過程中也通常會采⽤ROS。
如果說ROS1為科研和原型開發提供了很好的⽣態的話,那么ROS2就是⽤於實際產品的部署環境的開發架構和相應⼯具鏈。
2. ROS1的天然缺陷
ROS1項⽬的初衷是為了給科研機器⼈Willow Garage PR2提供⼀個開發環境和相應的⼯具,為了讓這套軟件在更多的機器⼈上運⾏,ROS為機器⼈開發構建了應⽤層的抽象和通⽤的消息接⼝,最終在機器⼈社區中⼴為使⽤並發展為⽬前最流⾏的機器⼈軟件⽣態體系之⼀。然⽽,ROS1研發的初衷就注定了該架構存在以下缺陷:
- ⽆實時性(real-time)
- 嵌⼊式設備不友好
- 對於⽹絡通信的重依賴(需要⼤帶寬且穩定的⽹絡連接)
- 多⽤於學術應⽤
- 超⾼的靈活性帶來的不規范的編程模式
- 原⽣的ROS僅⽀持單機器⼈
然⽽如今ROS已在⼤量⼯業領域的應⽤,包括科研機器⼈、⼯業機器⼈、輪式機器⼈、⾃動駕駛汽⻋乃⾄航天⽆⼈駕駛設備,其原來的功能設計已經不能滿⾜海量應⽤對於某些性能(如實時性、安全性、嵌⼊式移植等)的需求,ROS2即在這樣的背景下被設計和開發。
3. ROS2相較於ROS1的提升和改進
相較於ROS1,ROS2在設計之初就考慮了在產品環境下⾯臨的⼀些挑戰,具體來說,ROS2采⽤(或者計划采⽤)以下策略以提升其在產品環境的適⽤度:
- ⽀持多機器⼈
- 對⼩型嵌⼊式設備和微控制器的⽀持
- 實時系統:⽀持實時控制,包括進程間和機器間通信的實時性
- ⽀持⾮理想⽹絡環境:在低質量⾼延遲等⽹絡環境下系統仍然能夠⼯作
- 對產品環境的⽀持的能力
- 規范的編程模型以⽀持基於ROS的⼤規模⽬的構建、開發和部署
4. ROS2中的DDS中間層
ROS1的核⼼是⼀個基於master中⼼節點的匿名發布-訂閱通信中間層,相⽐之下,ROS2采⽤基於RTSP(Real-Time Publish-Subscribe)協議的DDS作為中間層,DDS(Data-Distribution Service)是⼀種⽤於實時和嵌⼊式系統發布-訂閱式通信的⼯業標准,這種點到點的通信模式類似於ROS1的中間層,但是DDS不需要像ROS1那樣借由master節點來完成兩個節點間通信,這使得系統更加容錯和靈活,DDS 被⼴泛應⽤於關鍵系統中,包括戰艦、⼤型基礎設施(如⽔電站)、⾦融系統、空間系統、航空系統等場景,這些⽤例也證實了DDS的可靠性。
多個⼚商提供多種DDS實現,⼀般來說DDS的底層通信機制基於UDP協議或者共享內存機制(當然也有 ⼚商提供基於TCP的DDS實現),⽽ROS2⽀持多種DDS實現,⽤⼾可以根據實際情況選擇DDS中間層, ⽬前來說ROS2 Foxy完整⽀持以下DDS中間層:
- eProsima的Fast RTPS(當前ROS2版本默認的DDS實現)
- RTI的Connext DDS
- Eclipse Cyclone DDS
了解更多DDS相關背景,可以參考這篇⽂章:
https://design.ros2.org/articles/ros_on_dds.html
ROS2的內部架構:

ROS2的內部接⼝主要包括兩個層:
- rmw (ros middleware interface): 相對底層的接⼝層,直接和DDS交互,C語⾔實現
- rcl (ros cliend libraries): 對rmw相對⾼層的抽象,c/c++實現
此外上圖中還有⼀個ros_to_dds組件,該組件主要為⽤⼾直接訪問DDS層提供接⼝。
更多關於rmw和rcl等中間層的實現機制以及ROS msg,DSS idl⽂件和python、c++和C上的類(或者結 構體)的轉換可以參考ROS2官⽅⽂檔:
https://docs.ros.org/en/foxy/Concepts/About-Internal-Interfaces.html
5. ROS2中的QoS策略
ROS2中引⼊了Quality of Service, QoS(服務質量)的策略⽤於配置節點間通信,進⽽提升了ROS2適應於不同應⽤場景的靈活性。ROS1只⽀持基於TCP的通信,通過配置QoS,ROS2可以表現出TCP的可靠性,也可以表現出UDP那樣的⾼實時性。⽤⼾可以通過選擇不同的QoS配置⽂件以實現不同的通信表現,QoS配置⽂件為策略的集合,ROS2提供了預設的QoS配置⽂件,如下所⽰:
- 發布-訂閱機制的QoS設定
- 服務 (Service) 的QoS設定
- 傳感器數據的QoS設定
- 參數的QoS設定
- DDS中間層默認的QoS設定
6. ROS2的安裝和開發環境准備
ROS2⽬前⼏乎每半年會release⼀個版本,不同的版本會有對應的代號(類似與ROS1中的Kinetic, Melodic和Noetic等版本代號),以下是ROS2的⼀些歷史版本:
- Crystal: 2018年12⽉
- Dashing: 2019年5⽉底
- Eloquent: 2019年11⽉
- Foxy: 2020年6⽉
- Galactic: 2021年5⽉
我們以最新的Galactic為例,ROS2是跨平台的架構,同時⽀持Linux, MacOS和Windows,但是依據我們在ROS1上開發的經驗,我依然推薦⼤家在Linux的Ubuntu發⾏版上從事相應的ROS2 Application開發⼯作。在Ubuntu上,安裝ROS2可以通過binary安裝或者源代碼編譯安裝,在Ubuntu上,最簡單的安裝⽅式是通過Debian packages安裝(也就是apt安裝),我們以此為例,在Ubuntu 20.04上使⽤apt 安裝ROS2的Galactic版本。
7. ROS2在Ubuntu下的安裝
在你的Ubuntu 20.04系統中,配置ROS2的apt源:
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/s
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-k
更新apt索引:
sudo apt update
使⽤apt安裝完整的ROS2:
sudo apt install ros-galactic-desktop
安裝完成后,在~/.bashrc⽂件中添加ros2的環境變量:
echo "source /opt/ros/galactic/setup.bash" >> ~/.bashrc
簡單地驗證⼀下安裝情況,新建⼀個terminal,運⾏demo的talker:
ros2 run demo_nodes_cpp talker
在另⼀個terminal中,運⾏listener:
ros2 run demo_nodes_py listener
可以看到,⼀個類似於ROS1的Publisher-Subscriber通信demo就運⾏起來了:

不難發現,ROS2並不需要像ROS1那樣啟動roscore(即master節點),ROS2這種去中⼼化的策略能讓其適應更多⼯業應⽤和產品級應⽤場景的需求。
NOTE:ROS1和ROS2可以並存於同⼀台電腦,你只需要source不同的setup.bash即可完成環境的選擇。
8. ROS2的基本工具和命令
和ROS1⼀樣,ROS2也提供了⼤量的開發調試⼯具,如Rviz, Rqt等⼯具均已經可以在ROS2中使⽤,運行rqt,可以看到我們剛剛運⾏的兩個demo節點:

運⾏ rviz2 可以啟動ROS2環境下的rviz軟件。
同時,ROS2也提供類似於ROS1的命令⾏指令,指令和ROS1略有區別:
- ros2 node : 輸出node相關信息
- ros2 topic : topic相關指令,包括list,hz,echo等
- ros2 service :service相關指令,如list,call,type等
- ros2 bag : rosbag相關指令, 錄包,播包,打印數據包信息等
- ros2 bag :package相關指令
- ros2 param: 參數相關
- ros2 launch:運⾏launch⽂件
- ros2 run:運⾏單個節點
完整的ros2命令如下所⽰:

絕⼤多數指令基本是將ros1中的rosxxxx拆分成了ros2 xxxx。
參考文檔:
https://docs.ros.org/en/galactic/index.html
作者簡介
申澤邦,奔馳高級自動駕駛工程師,Google Developer Expert(機器學習方向),蘭州大學自動駕駛團隊創始人,CSDN博客專家,《無人駕駛原理與實踐》書籍作者。