Apollo进阶课程㉟丨Apollo ROS原理—4
原文鏈接:進(jìn)階課程?丨Apollo ROS原理—4?
ROS是一個(gè)強(qiáng)大而靈活的機(jī)器人編程框架,從軟件構(gòu)架的角度說,它是一種基于消息傳遞通信的分布式多進(jìn)程框架。
ROS本身是基于消息機(jī)制的,可以根據(jù)功能把軟件拆分成為各個(gè)模塊,每個(gè)模塊只是負(fù)責(zé)讀取和分發(fā)消息,模塊間通過消息關(guān)聯(lián)。
上周阿波君為大家詳細(xì)介紹了「進(jìn)階課程?Apollo ROS原理—3」。
此課程主要講解四個(gè)比較基礎(chǔ)的方面:第一是TF坐標(biāo)系轉(zhuǎn)換,它在自動(dòng)駕駛中用的非常廣泛;第二是RQT用戶接口;第三是機(jī)器人模型;第四是仿真描述。
本周阿波君將繼續(xù)與大家分享Apollo ROS原理—4的相關(guān)課程。下面,我們一起進(jìn)入進(jìn)階課程第35期。
目前ROS僅適用于Apollo 3.0之前的版本,最新代碼及功能還請(qǐng)參照Apollo 3.5及5.0版本。
目錄
1. ROS Services
2. ROS Actions
3. ROS Time
4. ROS Bags
5. 調(diào)試工具
本節(jié)主要介紹幾個(gè)在實(shí)際開發(fā)調(diào)試過程中使用比較廣泛的一些概念。
1. ROS Services
ROS提供了三種節(jié)點(diǎn)之間通信的方式:
- 第一種是大家最常用的基于消息的訂閱發(fā)布模型;
- 第二種就是ROS Service;
- 第三種Param,它借鑒了Service的思想;
Service在自動(dòng)駕駛系統(tǒng)里面使用的比較廣泛,與基于消息發(fā)布訂閱模型類似, Service有一個(gè)service name,同時(shí)Service底層是一個(gè)SRV描述文件,它和MSG描述文件比較類似,不同是SRV描述文件定義了兩種消息:請(qǐng)求信息的消息格式和響應(yīng)格式。請(qǐng)求是Client向Server發(fā)出請(qǐng)求的消息定義格式,與Response邏輯類似。
對(duì)應(yīng)Service,Rosservice提供了一系列命令行工具,例如常用的像List、Call等一些基本的功能響應(yīng)。
這是一個(gè)SRV文件,可以看到所有的Service對(duì)應(yīng)的SRV文件描述都有一個(gè)Request和Response方式。當(dāng)然這兩個(gè)都可以置為空,置空就沒有意義了。此外,也可以寫一些具體的類型,比如我向你發(fā)送一個(gè)什么樣的消息請(qǐng)求,你在接受我的對(duì)應(yīng)消息請(qǐng)求之后會(huì)返回一個(gè)什么樣的響應(yīng)的數(shù)據(jù)格式指令。
上面結(jié)合一個(gè)實(shí)際的例子,給出Service具體的使用方法。Service啟動(dòng)的時(shí)候,需要提前啟動(dòng)Roscore,即節(jié)點(diǎn)管理器。第二步啟動(dòng)Service的一個(gè)例子程序,之后通過List和Type命令可以看到在啟動(dòng)某一個(gè)節(jié)點(diǎn)后,這個(gè)節(jié)點(diǎn)里面注冊(cè)了某個(gè)Service的一個(gè)實(shí)際展示。
與前面提到的Rostopic對(duì)應(yīng),ROS也提供了命令行方式調(diào)用一個(gè)Service,當(dāng)然命令行方式調(diào)用Service也是把它當(dāng)成了一個(gè)節(jié)點(diǎn)的方式進(jìn)行Service、Client鏈路的建立和響應(yīng)。
這個(gè)是結(jié)合實(shí)際的C++例子,描述Service的具體使用方法,可以看到Service和普通的Publisher、Subscriber比較類似,尤其是和Subscriber比較類似。但不同的是它有一個(gè)Service方法,定義了節(jié)點(diǎn)提供的服務(wù)類型。以及當(dāng)Client向它發(fā)出請(qǐng)求時(shí),節(jié)點(diǎn)會(huì)做出什么樣的行為同時(shí)把這個(gè)結(jié)果再發(fā)送給Client。第二個(gè)不同點(diǎn)是在注冊(cè)Service時(shí),把Service的Name,和Service所提供的函數(shù)注冊(cè)即可。與注冊(cè)Server的節(jié)點(diǎn)對(duì)應(yīng),Client的節(jié)點(diǎn)也比較簡單,只需要進(jìn)行兩步就可以完成一個(gè)Service的使用,第一步是聲明Client對(duì)象,第二步是直接去調(diào)用Service,傳入對(duì)應(yīng)的Request就可以拿到對(duì)應(yīng)的Response結(jié)果。
2. ROS Actions
ROS還提供了另外一種通訊方式,這種不常見通訊方式就是Actions,相比Service,它多了一個(gè)取消的功能和帶有反饋機(jī)制。對(duì)于Service,發(fā)起一個(gè)Service請(qǐng)求需要等到返回一個(gè)正確的Response結(jié)果才會(huì)退出。Actions在發(fā)送一個(gè)Service請(qǐng)求之后,它可以發(fā)送取消的命令,取消這個(gè)Service請(qǐng)求,可用于一些較長時(shí)間的Service場景。當(dāng)然目前這種場景在Apollo自動(dòng)駕駛系統(tǒng)里面比較少。ROS Actions
在.action文件里定義了action,跟srv其實(shí)類似,只不過是在.action文件里面,定義了更多的類型。
3. ROS Time
ROS系統(tǒng)供了一套time機(jī)制,這個(gè)time的時(shí)間源來自于PC機(jī)的系統(tǒng)時(shí)間。Rostime基于此提供了一個(gè)重要的功能點(diǎn):仿真時(shí)間。用ROS系統(tǒng)進(jìn)行自動(dòng)駕駛開發(fā)的時(shí)候,仿真模擬是一個(gè)不可缺少的環(huán)節(jié)。如剛才提到的Rviz、Gazebo都是為開發(fā)者進(jìn)行離線仿真和模擬的強(qiáng)大調(diào)試工具,在使用這些調(diào)試工具的時(shí)候,實(shí)驗(yàn)數(shù)據(jù)可能是很早之前錄制的,也有可能是在其他地方錄制的。這種之前的數(shù)據(jù)在仿真環(huán)境下進(jìn)行模擬時(shí),如何回放當(dāng)時(shí)的場景,或者是如何把當(dāng)時(shí)的時(shí)間轉(zhuǎn)化到現(xiàn)在的時(shí)間?Rostime就供了虛擬時(shí)鐘功能,保證在回放一些歷史實(shí)驗(yàn)數(shù)據(jù),或者其他地方實(shí)驗(yàn)數(shù)據(jù)時(shí),讓整個(gè)仿真系統(tǒng)認(rèn)為現(xiàn)在的場景就是所需要的那個(gè)系統(tǒng)時(shí)間和系統(tǒng)場景。
4. ROS Bags
ROS Bags有兩個(gè)比較重要的功能,第一個(gè)是把實(shí)際車上調(diào)試的數(shù)據(jù)或者是把自動(dòng)駕駛進(jìn)行道路測試的原始傳感器數(shù)據(jù)按一定格式錄制到某個(gè)bag文件里。實(shí)驗(yàn)室或者開發(fā)環(huán)境可以根據(jù)bag文件不斷的回放,去復(fù)現(xiàn)當(dāng)時(shí)的網(wǎng)絡(luò)場景。例如,有一個(gè)場景,車在某一個(gè)特定的地方做了一個(gè)錯(cuò)誤的決策,我們想改一版算法去驗(yàn)證這個(gè)場景有沒有被覆蓋,這時(shí)可以拿那個(gè)Rosbag回放,驗(yàn)證新版算法的輸出是不是符合預(yù)期。另外Rosbag數(shù)據(jù)對(duì)算法進(jìn)行模型訓(xùn)練和調(diào)優(yōu)也是非常有必要的。
5. 調(diào)試工具
最后了解一下調(diào)試工具,如下圖所示,ROS提供了一些簡單的功能,比如說ROS WTF這種功能,可以讓用戶很簡單地查看當(dāng)前系統(tǒng)是環(huán)境變量設(shè)置的問題,還是其他的一些核心庫鏈接的位置問題,還是其他的問題導(dǎo)致的一些運(yùn)行失敗,通過WTF都可以很快的定位,同時(shí),ROS也提供了一些其他的Debug診斷功能供開發(fā)者在實(shí)際開發(fā)過程當(dāng)中去使用。
總結(jié)
以上是生活随笔為你收集整理的Apollo进阶课程㉟丨Apollo ROS原理—4的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lsassa.exe是什么进程 有什么用
- 下一篇: 计算机英语第六单元,计算机专业英语第六版