1.5 ROS2體系框架【萬字干貨來啦,快來碼住】
1.5 ROS2體系框架
在1.1.2 ROS2組成體系一節(jié)中,我們已經簡單了解了ROS2的體系框架,并且隨著前面介紹了ROS2功能包的編寫、編譯、執(zhí)行流程,也對ROS2應用程序的構建有了基本的認識。本節(jié)會進一步從微觀和宏觀兩個維度來介紹ROS2的不同部分,以幫助大家了解ROS2的學習、工作內容以及以后可選擇的發(fā)展方向。
微觀上會介紹ROS2的文件系統(tǒng)、ROS2的核心模塊(通信與工具),這些都是官方提供的標準內容。宏觀上會介紹關于ROS2的技術支持、ROS2的應用方向,這部分則是得益于ROS2的強大社區(qū)。
1.5.1 ROS2文件系統(tǒng)
立足系統(tǒng)架構,如下圖所示,ROS2可以劃分為三層:
操作系統(tǒng)層(OS Layer)
如前所述,ROS雖然稱之為機器人操作系統(tǒng),但實質只是構建機器人應用程序的軟件開發(fā)工具包,ROS必須依賴于傳統(tǒng)意義的操作系統(tǒng),目前ROS2可以運行在Linux、Windows、Mac或RTOS上。中間層(Middleware Layer)
主要由數據分發(fā)服務DDS與ROS2封裝的關于機器人開發(fā)的中間件組成。DDS是一種去中心化的數據通訊方式,ROS2還引入了服務質量管理 (Quality of Service)機制,借助該機制可以保證在某些較差網絡環(huán)境下也可以具備良好的通訊效果。ROS2中間件則主要由客戶端庫、DDS抽象層與進程內通訊API構成。應用層(Application Layer)
是指開發(fā)者構建的應用程序,在應用程序中是以功能包為核心的,在功能包中可以包含源碼、數據定義、接口等內容。

對于一般開發(fā)者而言,工作內容主要集中在應用層,開發(fā)者一般通過實現具有某一特定功能的功能包來構建機器人應用程序。對應的我們所介紹的ROS2文件系統(tǒng)主要是指在硬盤上以功能包為核心的目錄與文件的組織形式。
1.概覽
功能包是ROS2應用程序的核心,但是功能包不能直接構建,必須依賴于工作空間,一個ROS2工作空間的目錄結構如下:


上述這些目錄也可以定義為其他名稱,或者根據需要創(chuàng)建其他一些目錄。
2.源文件說明
在1.3 ROS2快速體驗中,實現第一個ROS2程序時,都需要創(chuàng)建節(jié)點,無論是C++實現還是Python實現,都是直接實例化的Node對象。
C++實例化Node示例如下:

Python實例化Node示例如下:

但是在ROS2中,上述編碼風格是不被推薦的,更推薦以繼承Node的方式來創(chuàng)建節(jié)點對象。
C++繼承Node實現示例如下:

Python繼承Node實現示例如下:

之所以繼承比直接實例化Node更被推薦,是因為繼承方式可以在一個進程內組織多個節(jié)點,這對于提高節(jié)點間的通信效率是很有幫助的,但是直接實例化則與該功能不兼容。
3.配置文件說明
在ROS2功能包中,經常需要開發(fā)者編輯一些配置文件以設置功能包的構建信息,功能包類型不同,所需修改的配置文件也有所不同。C++功能包的構建信息主要包含在package.xml與CMakeLists.txt中,Python功能包的構建信息則主要包含在package.xml和setup.py中,接下來我們就簡單了解一下這些配置文件。
1.package.xml
不管是何種類型的功能包,package.xml的格式都是類似的,在該文件中包含了包名、版本、作者、依賴項的信息,package.xml可以為colcon構建工具確定功能包的編譯順序。一個簡單的package.xml示例如下:
<?xml version="1.0"?>?
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>?
<package format="3">
?
? <name>pkg01_helloworld_cpp</name>
?
? <version>0.0.0</version>
?
? <description>TODO: Package description</description>
?
? <maintainer email="ros2@todo.todo">ros2</maintainer>
?
? <license>TODO: License declaration</license>? ? ? ?
? <buildtool_depend>ament_cmake</buildtool_depend>? ? ? ??<depend>rclcpp</depend>??
? <test_depend>ament_lint_auto</test_depend>? ? ? ? ? ? ? ? ? ?? ? ? ? ?<test_depend>ament_lint_common</test_depend>? ? ??
<export>
? ?
? ?<build_type>ament_cmake</build_type>
?
? </export>?
</package>
1.根標簽
<package>:該標簽為整個xml文件的根標簽,format屬性用來聲明文件的格式版本。
2.元信息標簽
<name>:包名;
<version>:包的版本號;
<description>:包的描述信息;
<maintainer>:維護者信息;
<license>:軟件協(xié)議;
<url>:包的介紹網址;
<author>:包的作者信息。
3.依賴項
<buildtool_depend>:聲明編譯工具依賴;
<build_depend>:聲明編譯依賴;
<build_export_depend>:聲明根據此包構建庫所需依賴;
<exec_depend>:聲明執(zhí)行時依賴;
<depend>:相當于<build_depend>、<build_export_depend>、<exec_depend>三者的集成;
<test_depend>:聲明測試依賴;
<doc_depend>:聲明構建文檔依賴。
2.CMakeLists.txt
C++功能包中需要配置CMakeLists.txt文件,該文件描述了如何構建C++功能包,一個簡單的CMakeLists.txt示例如下:

在示例中關于文件的使用已經通過注釋給出了簡短說明,其實關于CMakeLists.txt的配置是比較復雜的,后續(xù)隨著學習的深入,還會給出更多的補充說明。
3.setup.py
Python功能包中需要配置setup.py文件,該文件描述了如何構建Python功能包,一個簡單的setup.py示例如下:C

使用語法可參考上述示例中的注釋。
4.操作命令
ROS2的文件系統(tǒng)核心是功能包,我們可以通過編譯指令colcon
和ROS2內置的工具指令ros2
來實現功能包的創(chuàng)建、編譯、查找與執(zhí)行等相關操作。
1.創(chuàng)建
新建功能包語法如下:
ros2 pkg create 包名 --build-type 構建類型 --dependencies 依賴列表 --node-name 可執(zhí)行程序名稱
格式解釋:
--build-type:是指功能包的構建類型,有cmake、ament_cmake、ament_python三種類型可選;
--dependencies:所依賴的功能包列表;
--node-name:可執(zhí)行程序的名稱,會自動生成對應的源文件并生成配置文件。
2.編譯
編譯功能包語法如下:
colcon build
或
colcon build --packages-select 功能包列表
前者會構建工作空間下的所有功能包,后者可以構建指定功能包。
3.查找
在ros2 pkg
命令下包含了多個查詢功能包相關信息的參數。
ros2 pkg executables [包名] # 輸出所有功能包或指定功能包下的可執(zhí)行程序。
ros2 pkg list # 列出所有功能包
ros2 pkg prefix 包名 # 列出功能包路徑
ros2 pkg xml # 輸出功能包的package.xml內容
4.執(zhí)行
執(zhí)行命令語法如下:
ros2 run 功能包 可執(zhí)行程序 參數
小提示:
可以通過
命令 -h
或命令 --help
來獲取命令的幫助文檔。
1.5.2 ROS2核心模塊
通信與工具是ROS2的核心模塊,也是我們以后學習和工作的重點所在,本節(jié)將會介紹通信和工具中涉及到的一些知識點。
1.通信模塊
通信模塊是整個ROS2架構中的重中之重,比如你可能想要了解在ROS2中是如何控制機器人底盤運動的?雷達、攝像頭、imu、GPS等這些傳感器數據是如何傳輸到ROS2系統(tǒng)的?人機交互時調用者如何下發(fā)指令,機器人又是如何反饋數據的?導航、機械臂等系統(tǒng)性實現不同模塊之間是如何交互數據的......等等,其實這些都離不開通信模塊。另外,開發(fā)者構建應用程序時,通信部分在工作內容中占有相當大的比重。
2.功能包應用
功能包的應用主要有三種方式:
1.二進制安裝
ROS官方或社區(qū)提供的功能包可以很方便的通過二進制方式安裝,安裝命令如下:
sudo apt install ros-ROS2版本代號-功能包名稱
小提示:
可以調用
apt search ros-ROS2版本代號-* | grep -i 關鍵字
格式的命令,根據關鍵字查找所需的功能包。
2.源碼安裝
也可以直接下載官方、社區(qū)或其他第三方提供的源代碼,一般我們會從github獲取源碼,下載命令如下:
git clone 倉庫地址
源碼下載后,需要自行編譯。
3.自實現
開發(fā)者按照業(yè)務需求自己編寫功能包實現。
3.分布式
ROS2是一個分布式架構,不同的ROS2設備之間可以方便的實現通信,這在多機器人設備協(xié)同中是極其重要的。
4.終端命令與rqt
在ROS2中提供了豐富的命令行工具,可以方便的調試程序、提高開發(fā)效率。
rqt是一個圖形化工具,它的功能與命令行工具類似,但是圖形化的交互方式更為友好。
示例1:使用命令行工具在turtlesim_node中生成一只新烏龜。

示例2:使用rqt在turtlesim_node中生成一只新烏龜。

5.launch文件
通過launch文件,可以批量的啟動ROS2節(jié)點,這是在構建大型項目時啟動多節(jié)點的常用方式。
示例:一次性啟動多個turtlesim_node節(jié)點。

6.TF坐標變換
TF坐標變換可以實現機器人不同部件或不同機器人之間的相對位置關系的轉換。
示例1:發(fā)布機器人不同部件之間的坐標系關系。

示例2:使用turtlesim_node模擬多機器人編隊。

7.可視化
ROS2內置了三維可視化工具rviz2,它可以圖形化的方式顯示機器人模型或顯示機器人系統(tǒng)中的一些抽象數據。
示例1:顯示傳感器數據。

示例2:顯示機器人模型。

1.5.3 ROS2技術支持
ROS社區(qū)提供了多種技術支持機制,主要包括:包文檔、問答、論壇、包索引以及問題跟蹤,每種機制都有自己的用途,合適的選擇技術支持機制可以避免問題的重復提問、減少問題解決時間并對新思想的交流很有幫助。
ROS包文檔
ROS核心包的文檔以及包的特定內容托管在ROS包文檔上,可以查找到ROS的官方教程、文檔和API文檔。
ROS問答
如果在學習和工作中,遇到解決不了的問題,那么可以訪問ROS問答,在ROS問答模塊已經涉及到60000多個問題且大部分都給出了答案。開發(fā)者可以先搜索遇到的問題,如果該問題尚未提出,那么可以自行發(fā)布相關問題(在發(fā)布之前請先查看問題發(fā)布指南)。
ROS論壇
在ROS論壇我們可以了解ROS社區(qū)的最新動態(tài)。請注意:論壇是發(fā)布公告、新聞和討論共同愛好的地方,請不要在此提出技術問題或提交異常報告。
ROS包索引
在ROS包索引可以查找特定功能包的信息。
問題跟蹤器
當用戶發(fā)現系統(tǒng)BUG或者想請求新功能時,可以在問題跟蹤器上提交報告。如果是報告BUG,那么請務必提供問題的詳細描述、問題產生的環(huán)境以及可能有助于開發(fā)人員重現問題的任何細節(jié),最好能夠提供調試回溯。
除了上述多種技術支持之外,ROS社區(qū)還會舉辦一年一度的ROSCon(ROS開發(fā)者大會),ROSCon為所有級別的 ROS 開發(fā)人員(從初學者到專家)提供了一個機會,所有的開發(fā)者可以建立聯(lián)系、相互學習、分享想法或是向專家請教。ROSCon一般為期兩天,主要包括技術講座和一些ROS教程,期間將介紹新的工具和庫,也會介紹已有的工具和庫的深層次知識。
ROS官方的目標是讓ROSCon代表整個ROS社區(qū),這個社區(qū)是全球性和多樣化的。無論你是誰,無論你做什么,無論在哪,只要對ROS感興趣,那么都希望能夠加入ROSCon。尤其鼓勵女性、少數派成員和其他不具代表性的群體成員參加ROSCon。
1.5.4 ROS2應用方向
許多ROS團隊伴隨ROS成長到今日,其規(guī)模已經發(fā)展到足以被認為是獨立組織的程度了。在導航、機械臂、無人駕駛、無人機等諸多領域大放異彩,下面列出了其中的一些團隊項目,這些項目對我們以后的進階發(fā)展,也提供了指導。
NAV2
NAV2項目繼承自ROS Navigation Stack。該項目旨在可以讓移動機器人從A點安全的移動到B點。它也可以應用于涉及機器人導航的其他應用,例如跟隨動態(tài)點。NAV2將用于實現路徑規(guī)劃、運動控制、動態(tài)避障和恢復行為等一系列功能。
OpenCV
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫。OpenCV旨在為計算機視覺應用程序提供通用基礎架構,并加速機器感知在商業(yè)產品中的使用。OpenCV允許企業(yè)輕松地使用和修改代碼。
MoveIt
MoveIt是一組ROS軟件包, 主要包含運動規(guī)劃、碰撞檢測、運動學、3D感知、操作控制等功能。它可以用于構建機械臂的高級行為。MoveIt現在可以用于市面上的大多數機械臂,并被許多大公司使用。
The Autoware Foundation
Autoware Foundation是ROS下屬的非營利組織,支持實現自動駕駛的開源項目。Autoware基金會在企業(yè)發(fā)展和學術研究之間創(chuàng)造協(xié)同效應,為每個人提供自動駕駛技術。
F1 Tenth
F1 Tenth是將模型車改為無人車的競速賽事,是一個由研究人員、工程師和自主系統(tǒng)愛好者組成的國際社區(qū)。它最初于 2016 年在賓夕法尼亞大學成立,但后來擴展到全球許多其他機構。
microROS
在基于ROS的機器人應用中,micro-ROS正在彌合性能有限的微控制器和一般處理器之間的差距。micro-ROS在各種嵌入式硬件上運行,使ROS能直接應用于機器人硬件。
Open Robotics
Open Robotics與全球ROS社區(qū)合作,為機器人創(chuàng)建開放的軟件和硬件平臺,包括 ROS1、ROS2、Gazebo模擬器和Ignition模擬器。Open Robotics使用這些平臺解決一些重要問題,并通過為各種客戶組織提供軟件和硬件開發(fā)服務來幫助其他人做同樣的事情。
PX4
PX4是一款用于無人機和其他無人駕駛車輛的開源飛行控制軟件。該項目為無人機開發(fā)人員提供了一套靈活的工具,用于共享技術并為無人機應用程序創(chuàng)建量身定制解決方案。
ROS-Industrial
ROS-Industrial是一個開源項目,將 ROS 軟件的高級功能擴展到工業(yè)相關硬件和應用程序。
1.5.4 ROS2應用方向
許多ROS團隊伴隨ROS成長到今日,其規(guī)模已經發(fā)展到足以被認為是獨立組織的程度了。在導航、機械臂、無人駕駛、無人機等諸多領域大放異彩,下面列出了其中的一些團隊項目,這些項目對我們以后的進階發(fā)展,也提供了指導。
NAV2
NAV2項目繼承自ROS Navigation Stack。該項目旨在可以讓移動機器人從A點安全的移動到B點。它也可以應用于涉及機器人導航的其他應用,例如跟隨動態(tài)點。NAV2將用于實現路徑規(guī)劃、運動控制、動態(tài)避障和恢復行為等一系列功能。
OpenCV
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫。OpenCV旨在為計算機視覺應用程序提供通用基礎架構,并加速機器感知在商業(yè)產品中的使用。OpenCV允許企業(yè)輕松地使用和修改代碼。
MoveIt
MoveIt是一組ROS軟件包, 主要包含運動規(guī)劃、碰撞檢測、運動學、3D感知、操作控制等功能。它可以用于構建機械臂的高級行為。MoveIt現在可以用于市面上的大多數機械臂,并被許多大公司使用。
The Autoware Foundation
Autoware Foundation是ROS下屬的非營利組織,支持實現自動駕駛的開源項目。Autoware基金會在企業(yè)發(fā)展和學術研究之間創(chuàng)造協(xié)同效應,為每個人提供自動駕駛技術。
F1 Tenth
F1 Tenth是將模型車改為無人車的競速賽事,是一個由研究人員、工程師和自主系統(tǒng)愛好者組成的國際社區(qū)。它最初于 2016 年在賓夕法尼亞大學成立,但后來擴展到全球許多其他機構。
microROS
在基于ROS的機器人應用中,micro-ROS正在彌合性能有限的微控制器和一般處理器之間的差距。micro-ROS在各種嵌入式硬件上運行,使ROS能直接應用于機器人硬件。
Open Robotics
Open Robotics與全球ROS社區(qū)合作,為機器人創(chuàng)建開放的軟件和硬件平臺,包括 ROS1、ROS2、Gazebo模擬器和Ignition模擬器。Open Robotics使用這些平臺解決一些重要問題,并通過為各種客戶組織提供軟件和硬件開發(fā)服務來幫助其他人做同樣的事情。
PX4
PX4是一款用于無人機和其他無人駕駛車輛的開源飛行控制軟件。該項目為無人機開發(fā)人員提供了一套靈活的工具,用于共享技術并為無人機應用程序創(chuàng)建量身定制解決方案。
ROS-Industrial
ROS-Industrial是一個開源項目,將 ROS 軟件的高級功能擴展到工業(yè)相關硬件和應用程序。

B站有完整的ros系列教程視頻,可以觀看完整內容ros課程ROS2理論與實踐
更多內容將在猛獅知識星球社區(qū)更新最新課程,后續(xù)將推出更多優(yōu)質內容——詳情可關注猛獅集訓營公眾號和猛獅集訓營官方網站。