Apollo进阶课程㉛丨Apollo ROS概述
原創(chuàng): 阿波君 Apollo開發(fā)者社區(qū) 1周前
ROS提供一些標(biāo)準(zhǔn)操作系統(tǒng)服務(wù),例如硬件抽象、底層設(shè)備控制、常用功能實(shí)現(xiàn)、進(jìn)程間消息以及數(shù)據(jù)包管理。ROS是基于一種圖狀架構(gòu),從而不同節(jié)點(diǎn)的進(jìn)程能接受、發(fā)布、聚合各種信息(如傳感、控制、狀態(tài)、規(guī)劃等)。
上周阿波君為大家詳細(xì)介紹了「進(jìn)階課程?Apollo ROS背景介紹」。
主要引入ROS的背景介紹,講述了自動駕駛系統(tǒng)的組成及發(fā)展,此外還詳細(xì)地講解了選擇ROS的原因,其原因有三個方面:首先ROS是一個比較強(qiáng)大、靈活的機(jī)器人編程框架;其次ROS基于消息機(jī)制,開發(fā)者可以根據(jù)功能把軟件拆分成獨(dú)立的子模塊;最后ROS是學(xué)術(shù)界廣泛使用的一個框架,對實(shí)驗(yàn)各種新算法提供了一些支持。
本周阿波君將繼續(xù)與大家分享Apollo ROS概述的相關(guān)課程。下面,我們一起進(jìn)入進(jìn)階課程第31期。
目前ROS僅適用于Apollo 3.0之前的版本,最新代碼及功能還請參照Apollo 3.5及5.0版本。
目錄
1.ROS的歷史
2.ROS的特征
3.ROS的幾個核心概念
4.ROS的實(shí)踐
啟動Roscore
啟動一個簡單的Talker程序
通過命令查看Talker node
啟動一個Listen節(jié)點(diǎn)
再次通過命令查看Node
5.ROS的Catkin編譯系統(tǒng)
6.ROS的仿真功能Gazebo
1.ROS的歷史
ROS是2007年在斯坦福大學(xué)里面的一個實(shí)驗(yàn)室學(xué)生開發(fā)出來的一套機(jī)器人通用的一個框架,2013年被納入OSRF機(jī)構(gòu)統(tǒng)一管理,如今被很多公司和大學(xué)的研究所廣泛地使用到一些科研項(xiàng)目中。
2.ROS的特征
ROS有5個比較明顯的特征如下:
點(diǎn)對點(diǎn):兩個Node之間進(jìn)行消息通訊是一個點(diǎn)對點(diǎn)的行為。
它支持分布式:在部署多機(jī)之間的消息通訊時,ROS提供了一個天然的支持。
它是跨語言,它并不關(guān)注每個節(jié)點(diǎn)之間是用什么語言來寫的。你只需要按照ROS提供的一些接口完成消息的訂閱和分發(fā)即可以完成一個消息之間的通信。
它是一個輕量級的ROS程序,用戶只需要關(guān)注自己核心模塊的算法邏輯,不需要關(guān)注底層是如何通信、如何斷開通信、如何進(jìn)行Service 和Param之間的一些交互的。
它是一個開源的框架,大家都可以往ROS里面貢獻(xiàn)自己的一些想法和代碼。
3.ROS的幾個核心概念
- 松耦合:ROS是一個松耦合的框架,松耦合就是各個節(jié)點(diǎn)之間的通信是一個解耦合的關(guān)系。
- 節(jié)點(diǎn):一個算法模塊,比如自動駕駛系統(tǒng)里面的感知模塊、定位模塊、決策模塊或者控制模塊,這些模塊就是一個簡單的算法集合,在ROS里面被稱為一個節(jié)點(diǎn)。
- 節(jié)點(diǎn)管理器:在ROS里面被定義為Master,用來集中式管理各個獨(dú)立的、松耦合、無序節(jié)點(diǎn)之間的邏輯關(guān)系,它是輕量級的介入,當(dāng)各個節(jié)點(diǎn)啟動完成以后,他們在通信連接完成之前起到中轉(zhuǎn)也就是類似于交換機(jī)的作用。
- Topic:兩個節(jié)點(diǎn)之間的通信主題。Topic內(nèi)部使用的數(shù)據(jù)格式是Message。Message是一系統(tǒng)簡單的數(shù)據(jù)類型或者是一些自定義的復(fù)雜數(shù)據(jù)類型,所組裝成的一個描述文件。
以上幾個概念之間的相互關(guān)系,如下圖所示:
感知模塊Perception,感知車輛周圍的一些障礙物信息,用CNN或者RNN算法將障礙物信息提取出來,即Obstacle。再將這些信息輸出給下游Planning節(jié)點(diǎn)。這兩個節(jié)點(diǎn)之間的通信連接就需要Roscore,即節(jié)點(diǎn)管理器。
Perception、Planning在啟動的時候沒有先后關(guān)系,這是松耦合的一個具體體現(xiàn)。Perception先啟動并向Roscore發(fā)送一個注冊信息,同時會訂閱名為Obstacle的Topic;Planning節(jié)點(diǎn)啟動后也向Roscore發(fā)送一個注冊信息,同時會訂閱名為Obstacle的Topic;在這種情況下,Roscore會發(fā)送一個通知信息給Planning,在它發(fā)送注冊信息之前已經(jīng)有一個節(jié)點(diǎn)啟動了。此時Planning會向Perception發(fā)送消息請求通信連接,Planning收到消息之后會在Planning和Perception兩個節(jié)點(diǎn)中間建立一個實(shí)時通信鏈路。當(dāng)通信鏈路建立之后,Roscore的功能就暫時完成了。
所以,松耦合在此有兩種體現(xiàn):
Perception和Planning兩者之間的啟動沒有先后關(guān)系。
當(dāng)通信鏈路建立之后,Roscore的功能就暫時完成了。
這些概念在ROS系統(tǒng)都有一整套的命令工具支持如下:
1. Roscore:啟動一個節(jié)點(diǎn)管理器。
2. 節(jié)點(diǎn)常用命令:
Rosnode list:可以列出當(dāng)前系統(tǒng)里面所存在的節(jié)點(diǎn)。
Rosnode info:查看某一節(jié)點(diǎn)的具體的一些信息。
3. Topic常用命令:
Rostopic list:可以查看所存在Topic的一些列表。
Rostopic info:可以查看到發(fā)送這個Topic的發(fā)送方,訂閱這個Topic的訂閱方。
Rostopic type:查看Topic內(nèi)部所使用的MSG的數(shù)據(jù)結(jié)構(gòu)。
Rostopic pub:調(diào)試計(jì)算節(jié)點(diǎn)模塊的一些基本功能。
4.ROS的實(shí)踐
下面是一個簡單的實(shí)踐:
啟動Roscore
啟動Roscore,通過一個簡單的命令行Roscore就可以啟動一個節(jié)點(diǎn)管理器。不需要進(jìn)行任何參數(shù)的傳入,也不需要進(jìn)行任何配置。
如果有很多個節(jié)點(diǎn)啟動的時候,會使用Roslaunch。Roslaunch就是把所有啟動節(jié)點(diǎn)的行為放到統(tǒng)一的描述文件里,在啟動的時候會在描述文件里找到定義的各個節(jié)點(diǎn)的位置,然后啟動節(jié)點(diǎn)。
啟動一個簡單的Talker程序
Talker就是一個發(fā)送節(jié)點(diǎn)的程序。單獨(dú)啟動一個節(jié)點(diǎn),除了Roscore啟動之外,其它的節(jié)點(diǎn)啟動ROS提供了一個Rosrun命令。Rosrun,前面是Package包,后面是實(shí)際的可執(zhí)行文件。通過這樣簡單的一個命令可以直接啟動一個Talker。
通過命令查看Talker node
當(dāng)啟動這個節(jié)點(diǎn)之后,用Rosnode list,見上圖Talker的Node文件,還有一個Rosout的程序節(jié)點(diǎn)。Roscore默認(rèn)啟動的時候啟動了一個隱藏節(jié)點(diǎn),它是一個記錄日志相關(guān)的節(jié)點(diǎn),所有節(jié)點(diǎn)發(fā)生的Log都會被Roscore啟動的Rosout所訂閱,訂閱完之后會根據(jù)一些特定的規(guī)則把這些Log分級,然后分模塊、分文件打印到對應(yīng)的模塊日志里。
Rosnode info查看Talker相關(guān)的一些節(jié)點(diǎn),Talker發(fā)送的Topic以及它發(fā)送的Service。它有兩個Service:Setlogger、Getlogger。這兩個是每一個節(jié)點(diǎn)都會默認(rèn)啟動的兩個Service,這兩個Service的作用是設(shè)置這一個節(jié)點(diǎn)里面的日志層級,如果日志層級是INFO,那么它打印的Debug信息就不會記錄在Roscore的Rosout節(jié)點(diǎn)里面。
Rostopic info,通過這個命令我們能看到Topic的發(fā)送方和接收方。
Rostopic?type是查看Topic的一個Message的消息類型。
Rostopic?echo是相當(dāng)于起了一個Listener節(jié)點(diǎn),去展示Talker發(fā)的Topic包含的具體信息。
Rostopic還提供了HZ和BW功能,HZ是統(tǒng)計(jì)Talker節(jié)點(diǎn)發(fā)送Obstacle topic的頻率,根據(jù)此頻率能簡單的探測系統(tǒng)是否按照我們所預(yù)期的方向來執(zhí)行,例如自動駕駛整個車系統(tǒng)里面每一個傳感器有一定的頻率,激光雷達(dá)是十赫茲,即一秒鐘轉(zhuǎn)十圈,會發(fā)十幀點(diǎn)云圖像,我們可以通過Rostopic HZ去檢測Topic是不是一秒鐘發(fā)送十赫茲,如果低于十赫茲,說明當(dāng)前系統(tǒng)肯定是有異常,要么是激光雷達(dá)掃描的過程受到影響,要么是頂層的Driver節(jié)點(diǎn)在處理激光雷達(dá)頂層信息的時候中間出現(xiàn)了一些故障,此時我們就需要具體探測問題出現(xiàn)在哪個地方。
啟動一個Listen節(jié)點(diǎn)
現(xiàn)在啟動一個Listener節(jié)點(diǎn),啟動Listener節(jié)點(diǎn)之后整個拓?fù)鋾幸粋€比較明顯的變化,Listener啟動向Roscore發(fā)送一個注冊信息,同時會訂閱Topic,Roscore會發(fā)送一個通知信息給Listener:在它發(fā)送注冊信息之前已經(jīng)有一個節(jié)點(diǎn)啟動了。此時,Listener會向Talker發(fā)送消息請求通信連接,Listener收到消息之后會在Listener和Talker兩個節(jié)點(diǎn)中間建立一個實(shí)時通信鏈路。這個通信鏈路是基于TCP的,TCP建立起來之后Talker就持續(xù)不斷的發(fā)送信息,Listener接到信息之后去做回調(diào)處理供實(shí)際的決策和執(zhí)行。
再次通過命令查看Node
在啟動Talker節(jié)點(diǎn)之后,通過Rosnode list看到增加的一個節(jié)點(diǎn)就是Listener,它包含了一個完整的拓?fù)?#xff1a;包含發(fā)送節(jié)點(diǎn)和接收節(jié)點(diǎn)。
5.ROS的Catkin編譯系統(tǒng)
ROS是基于Cmake編寫的Catkin編譯系統(tǒng)。建立一個工程包,在ROS里面寫一個節(jié)點(diǎn),通過Catkin create 可以簡單創(chuàng)建一個文件夾,這個文件夾里面會預(yù)先設(shè)置一些文件目錄,通過Catkin build編譯建立軟件包的過程。Catkin build執(zhí)行之后,里面會多兩個文件夾:DEVEL、BUILD 。BUILD是編譯中間過程產(chǎn)生的文件。編譯完成之后,通過Source devel下面的Setup bash就可以把自己編寫的節(jié)點(diǎn)程序給Source到ROS的環(huán)境里面,然后去執(zhí)行我們節(jié)點(diǎn)里面的一些基本功能。
以上是三個比較重要的文件夾,第一個是SRC用來放源文件的一些目錄;第二個是BUILD,第三個是DEVEL,這兩個是在Catkin build的過程當(dāng)中產(chǎn)生的臨時文件夾。想重編譯的話可以直接Catkin build,如果環(huán)境里面有一些沖突,可以通過Catkin clean 簡單的去把編譯產(chǎn)生的臨時文件和之前的一些產(chǎn)出文件直接清除掉。
Catkin config指定了命令行編譯的一些方式,這些方式可以在Cmakelists里面進(jìn)行編寫。Cmakelists里面指定了這個文件編譯過程當(dāng)中所依賴的一些庫、產(chǎn)出的一些可執(zhí)行文件和這些可執(zhí)行文件鏈接了一些什么庫,Cmakelists里面都有一些很清晰的定義。
在啟動節(jié)點(diǎn)的時候使用了Roslaunch,Roslaunch是一個Shell腳本文件,Shell腳本文件里面根據(jù)語言定義的一些Xml格式去找到運(yùn)行的一系列節(jié)點(diǎn)所在的位置然后執(zhí)行它。它的執(zhí)行格式是前面加上Package Name,后面加上實(shí)際的Launch文件。
6.ROS的仿真功能Gazebo
這個是Gazebo的Simulator仿真工具。我們在實(shí)際進(jìn)行開發(fā),不管是機(jī)器人還是自動駕駛相關(guān)的一些具體功能的時候,我們不可能就是開發(fā)一個功能然后到實(shí)體的機(jī)器人或者是自動駕駛的汽車上去進(jìn)行模擬實(shí)驗(yàn)。ROS提供了仿真功能Gazebo,我們定義的節(jié)點(diǎn)在里面是實(shí)體的存在,通過控制一些參數(shù)和變量去模擬他們之間的一些交互,去驗(yàn)證算法在實(shí)際的運(yùn)行中是否按預(yù)期進(jìn)行表現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的Apollo进阶课程㉛丨Apollo ROS概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lao.exe是什么进程 有什么用 la
- 下一篇: 招行信用卡积分怎么算 积分这三点用途你要