Apollo进阶课程㊱丨Apollo ROS深入介绍
原文鏈接:進階課程?丨Apollo ROS深入介紹?
ROS是一個強大而靈活的機器人編程框架,從軟件構架的角度說,它是一種基于消息傳遞通信的分布式多進程框架。ROS本身是基于消息機制的,可以根據功能把軟件拆分成為各個模塊,每個模塊只是負責讀取和分發消息,模塊間通過消息關聯。
上周阿波君為大家詳細介紹了「進階課程? | Apollo ROS原理—4」。
主要講解五個比較基礎的方面:第一是ROS Services;第二是ROS Actions;第三是ROS Time;第四是ROS Bags;第五是調試工具。
本周阿波君將繼續與大家分享Apollo ROS的相關課程。下面,我們一起進入進階課程第36期。
目前ROS僅適用于Apollo 3.0之前的版本,最新代碼及功能還請參照Apollo 3.5及5.0版本。
目錄
1. ROS Packages
2. Eclipse下編譯ROS基本工程
3.通過hello world了解ROS基本的運行邏輯
4. ROS提供的日志系統
5. ROS提供的subscriber和publisher功能
6. ROS除了message的另外兩種通信方式
6.1 service
6.2 parameter
7.ROS的可視化工具RViz
本節內容主要介紹ROS中一些不是特別常見的屬性。
1. ROS Packages
創建一個ROS開發環境和寫一個C++工程有點類似,通過catkin create可以創建一個簡單的工程。其中的文件組織方式如上圖所示,包括:
- SRC存放源文件;
- MSG存放節點之間進行通信的消息定義;
- SRV存放節點之間進行服務通信的時候的服務定義;
- CONFIG存放配置文件相關的信息;
- INCLUDE存放頭文件相關的信息;
- Launch存放節點啟動和它相關的節點之間的啟動文件。
上面介紹的package組織方式只是官方推薦的一種組織方式,使用catkin build編譯,當source完環境變量之后,通過Ros提供的命令比如ROS run或者ROS launch啟動時,package name可以自動補全,package里面包含的節點或者launch文件也是可以自動尋找,所以官方推薦使用這種組織方式。
DEVEL和BUILD這兩個目錄是build時自動產生的兩個臨時目錄。
此外,開發環境還有描述ROS Package相關工作區的兩個文件:Package.xml和Cmakelists.txt。
Package.xml定義了可執行文件依賴的一些庫,包括編譯和運行時依賴庫,同時定義了軟件版本信息等常見的描述文件。
Cmakelists.txt定義了怎么編譯ROS工程的規則,主要定義了以下幾個部分:
下面是Cmakelists文件的一個例子。
從上到下依次指定了Cmake的版本、project的名字、ROS工程所依賴的c++的版本、另外是依賴的庫文件,最后生成可執行文件以及這個文件所鏈接的依賴庫。
2. Eclipse下編譯ROS基本工程
工程建立好之后,catkin build可以直接對工程進行編譯。直接用 catkin build去編譯,會把整個工程目錄里面的所有的package進行統一編譯,如果是構建一個比較復雜的系統,可能一個文件夾包含了很多節點或者package包,編譯時間會比較久,可以通過指定package名,編譯某一個固定的package包,提升編譯效率。
下面介紹在Eclipse下如何編譯ROS基本工程
首先是設置工作ROS工作區,然后將ROS package導入到Eclipse設置的工作區。
通過Eclipse提供的build或者run等功能去調試ROS工程。同時Eclipse里面提供的快捷鍵在編譯程序里面同樣適用。
3.通過hello world了解ROS基本的運行邏輯
上圖的hello world程序展現了ROS框架寫Node所使用的核心要素:
Include 就是include ROS的一個基本環境;
Main函數里面有三行需要重點注意:
- init:引入ROS的一個基本環境,指定節點使用的node名字和一些參數信息;
- NodeHandle:node和整個ROS框架進行通信所使用的一個句柄指針;
- 數據發送的頻率:looprate(10)以10赫茲發送消息。
最底下的while循環以10赫茲的消息頻率進行發送,同時進行計數。
Spinonce:有一幀消息就把這消息立馬發送出去,同時進行下一輪的消息等待。
4. ROS提供的日志系統
在示例程序里面有一個ROS_INFO,它就是ROS提供的日志系統;
ROS的日志系統是分級的,即在編寫節點程序的時候對打印的信息進行分級,對不同的分級,ROS會提供不同的顏色和格式進行展示。分級的作用是為了幫助開發者快速地定位到關鍵信息,不會對整個節點的邏輯產生實質性的影響。
日志系統提供了兩種格式ROS_INFO與ROS_INFO_stream:
- ROS_INFO:默認把信息打印到當時運行的屏幕上。
- ROS_INFO_stream:它是流式數據,默認輸出到后臺這個節點所對應的日志文件。
5. ROS提供的subscriber和publisher功能
Subscriber與Publisher有三點明顯的區別:
1、回調函數:subscriber作為信息的接收方有一個回調函數,回調函數定義了它接收到的每一幀信息如何使用;上圖listener回調函數比較簡單,它接收到信息后只是進行了打印處理。Publisher沒有回調函數,它不需要對消息進行處理。
2、聲明的時候:subscriber把回調函數傳入到對應的node初始化程序里面。publisher聲明的時候只需要注冊要往哪一個topic上去發信息,同時還設置隊列長度。
3、Rosspin:在ROS構架里所有的回調函數都不是主動觸發的。Rosspin是阻塞性的,聲明Rosspin之后,就阻塞在此,程序不會退出,它會一直監聽自己對應的隊列里面是否有新消息的到達,若有新消息到達就會觸發回調函數處理。
如果Subscriber的主程序里除了訂閱消息之外還有其他的功能則可以采用rosspin once,對所有已達消息進行回調函數的處理。同時可以寫一個while循環,rosspin once按照一定的頻率去處理回調函數的消息。ROS提供Rosspin這兩種方式,就是為了滿足這兩種場景。第一種是阻塞,只有一個回調函數進行處理,第二種是訂閱回調函數消息以外,他還進行了一些封裝和處置。
看似很復雜的自動駕駛,節點整體寫下來都是比較簡單的,就是按照上圖Subscriber與Publisher方式來寫。但是在實際的自動駕駛系統里面,所有的模塊都不是簡單的一個角色,它可能既是消息的訂閱者也是消息的發送者,是一個復雜交互的功能,甚至是用到很多數據融合或者是消息對齊。
6. ROS除了message的另外兩種通信方式
ROS節點之間的通信除了基于message消息訂閱和發布模型之外還有另外兩種方式,雖然另外兩種方式使用的比較少,但是在某些特定的場合是比較有用的。
6.1 service
節點可以啟動service去注冊一項服務,另外一個節點在使用這項服務的時候可以直接call service完成一些實時的數據通訊交互。Message是一個被動的消息行為,發送者發送消息的時候并不知道消息會被誰去消費,接收者在接收消息的時候也不知道目前有幾個發送節點在發送,發送和接收之間是一個什么狀態也是不知道的,他們是一個松耦合和透明的關系。Service彌補了這種通信方式的不足,它需要及時回應。Client向server去發送service請求的時候,需要實時等待一個response,根據響應做出下一步的行為指示。
6.2 parameter
Parameter通信方式借鑒了service的原理。它啟動了Parameter service,Parameter service是一個全局的服務器,各個節點在進行參數設置和獲取的時候可以通過Parameter service的方式輕易完成。因為Parameter不像基于message消息通訊方式那么頻繁,一個參數在設置完成之后,在整個網絡拓撲運行期間所有的節點只需要在一個地方取此參數就行或者某個節點根據自己的運行狀態去改變這個參數。
Parameter對應有一套ROS所使用的基本命令行工具—rosparam。
rosparam其它工具相比,有兩個不同的地方:get和set。get是get某一個全局參數的值;set是設置某一個全局參數的值。
上圖展示的例子是通過node所提供的nodeHandler指針去調用它的getparam,得到某個參數的數值。當它進行一些運算之后,也可以通過setparam去設置參數的值。設置之后,整個系統參數服務器里面對應的這個參數就會被設置成對應的值,其他節點在得到這個值之后再作出相應的處理。
7.ROS的可視化工具RViz
自動駕駛節點比較多,網絡拓撲也比較復雜,每個節點在進行消息通訊的時候有很多channel同時運行,如果只是通過命令行工具去查看節點的狀態和節點之間的拓撲,會很麻煩。ROS提供了一些比較好用的可視化工具立體化展示某一個拓撲結構里面的拓撲網絡,RViz就是其中之一。
RViz在整個ROS生態里可以看成是一個節點,它定義了整個拓撲結構里面所有的消息,然后按照固定的格式進行圖形化展示,同時提供很多debug相關的功能。因為RViz也是一個普通的節點,所以在啟動的時候可以通過rosrun命令的方式去啟動RViz相關的功能。
RViz也提供了很多插件可以放到諸如eclipse這樣的功能插件里面,在進行eclipse開發時可以通過eclipse的plugin去調取RViz的相關功能,進行可視化調試。
總結
以上是生活随笔為你收集整理的Apollo进阶课程㊱丨Apollo ROS深入介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指定身故受益人的时候有哪些注意要点?受益
- 下一篇: 6.Random Forests