最近幾年各種移動(dòng)機(jī)器人開(kāi)始涌現(xiàn)出來(lái),不論是輪式的還是履帶式的,如何讓移動(dòng)機(jī)器人移動(dòng)都是最核心的工作。要讓機(jī)器人實(shí)現(xiàn)環(huán)境感知、機(jī)械臂控制、導(dǎo)航規(guī)劃等一系列功能,就需要操作系統(tǒng)的支持,而ROS就是最重要的軟件平臺(tái)之一,它在科研領(lǐng)域已經(jīng)有廣泛的應(yīng)用。
不過(guò)有關(guān)ROS的書籍并不多,國(guó)內(nèi)可供的學(xué)習(xí)社區(qū)就更少了。本文就帶大家了解一下如何利用ROS來(lái)設(shè)計(jì)移動(dòng)機(jī)器人。
移動(dòng)機(jī)器人的三個(gè)部分
所謂的智能移動(dòng), 是指機(jī)器人能根據(jù)周圍的環(huán)境變化,自主地規(guī)劃路線、避障,到達(dá)目標(biāo)地。
機(jī)器人是模擬人的各種行為,想象一下,人走動(dòng)需要哪些器官的配合? 首先用眼睛觀察周圍環(huán)境,然后用腦去分析如何走才能到達(dá)目標(biāo)地,接著用腿走過(guò)去, 周而復(fù)始,直到到達(dá)目標(biāo)地址為至。機(jī)器人如果要實(shí)現(xiàn)智能移動(dòng),也需要眼、腦和腿這三部分的緊密配合。
腿
“腿”是機(jī)器人移動(dòng)的基礎(chǔ)。機(jī)器人的“腿”不局限于類人或類動(dòng)物的腿,也可以是輪子、履帶等,能讓機(jī)器人移動(dòng)起來(lái)的部件,都可以籠統(tǒng)地稱為“腿”。
類人的腿式優(yōu)點(diǎn)是:既可以在復(fù)雜路況(比如爬樓梯)下移動(dòng)、也可以更形象地模仿人的動(dòng)作(比如跳舞),缺點(diǎn)是:結(jié)構(gòu)和控制單元比較復(fù)雜、造價(jià)高、移動(dòng)慢等。
所以大部分移動(dòng)的機(jī)器人都是輪式機(jī)器人,其優(yōu)勢(shì)在于輪子設(shè)計(jì)簡(jiǎn)單、成本低、移動(dòng)快。而輪式的也分為多種: 兩輪平衡車、三輪、四輪和多輪等等。目前最經(jīng)濟(jì)實(shí)用的是兩個(gè)主動(dòng)輪+一個(gè)萬(wàn)向輪。
眼睛
機(jī)器人的眼睛其實(shí)就是一個(gè)傳感器。它的作用是觀察周圍的環(huán)境,適合做機(jī)器人眼睛的有激光雷達(dá)、視覺(jué)(深度相機(jī)、單雙相機(jī))、輔助(超聲波測(cè)距、紅外測(cè)距)等。
“腦”
機(jī)器人的大腦就負(fù)責(zé)接收“眼睛”傳輸?shù)臄?shù)據(jù),實(shí)時(shí)計(jì)算出路線,指揮腿去移動(dòng)。 其實(shí)就是要把看到的東西轉(zhuǎn)換為數(shù)據(jù)語(yǔ)言。針對(duì)如何描述數(shù)據(jù),如何實(shí)現(xiàn)處理邏輯等一系列問(wèn)題。 ROS系統(tǒng)給我們提供一個(gè)很好的開(kāi)發(fā)框架。
ROS簡(jiǎn)介
ROS是建立在linux之上的操作系統(tǒng)。它的前身是斯坦福人工智能實(shí)驗(yàn)室為了支持斯坦福智能機(jī)器人而建立項(xiàng)目,主要可以提供一些標(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ī)劃等等)。目前ROS主要支持Ubuntu操作系統(tǒng)。
有人問(wèn)ROS能否裝到虛擬機(jī)里,一般來(lái)說(shuō)是可以的,但是我們建議裝個(gè)雙系統(tǒng),用Ubuntu專門跑ROS。
實(shí)際上,ROS可以分成兩層,低層是上面描述的操作系統(tǒng)層,高層則是廣大用戶群貢獻(xiàn)的實(shí)現(xiàn)不同功能的各種軟件包,例如定位繪圖,行動(dòng)規(guī)劃,感知,模擬等等。ROS(低層)使用BSD許可證,所有是開(kāi)源軟件,并能免費(fèi)用于研究和商業(yè)用途,而高層的用戶提供的包則使用很多種不同的許可證。
用ROS實(shí)現(xiàn)機(jī)器人的移動(dòng)
對(duì)于二維空間,使用線速度 + 角速度可以實(shí)現(xiàn)輪式機(jī)器的隨意移動(dòng)。
線些速度:描述機(jī)器人前后移動(dòng)的速度大小
角速度:描述機(jī)器人轉(zhuǎn)動(dòng)的角速度大小
所以控制機(jī)器人移動(dòng)主要是要把線速度角速度轉(zhuǎn)換為左右輪的速度大小,然后,通過(guò)輪子直徑和輪間距,可以把線速度和角速度轉(zhuǎn)化為左輪和右輪的速度大小。
這里有一個(gè)關(guān)鍵問(wèn)題就是編碼器的選擇和pid的調(diào)速。
編碼器的選擇:一般編碼器和輪子是在一個(gè)軸上,目前來(lái)說(shuō),速度在0.7m/s以下的話,編碼器選600鍵到1200鍵之間都o(jì)k。不過(guò)需要注意的是,編碼器最好用雙線的,A、B兩線輸出,A向和B向輸出相差90度,這樣可以防抖動(dòng)。防抖動(dòng)就是可以在之后里程計(jì)算時(shí)可以更準(zhǔn)確。
左輪和右輪的速度大小的控制,通過(guò)輪子編碼器反饋,通過(guò)PID實(shí)時(shí)調(diào)整電機(jī)的PMW來(lái)實(shí)現(xiàn)。實(shí)時(shí)計(jì)算出小車的里程計(jì)(odom),得到小車移動(dòng)位置的變化。
計(jì)算車的位置變化是通過(guò)編碼器來(lái)計(jì)算的,如果輪子打滑等情況,那么計(jì)算的變化和實(shí)際的變化可能不同。要解決這個(gè)問(wèn)題,其實(shí)是看哪個(gè)問(wèn)題更嚴(yán)重。要走5米只走了4.9米重要,還是要走180度只走了179度重要。
其實(shí)角度的不精確對(duì)小車的影響更大。一般來(lái)說(shuō),小車的直線距離精確度可以控制在厘米范圍內(nèi),在角度方面可以控制精準(zhǔn)度在1%~2%。因?yàn)榻嵌仁潜容^重要的參數(shù),所以很多人就用陀螺儀來(lái)進(jìn)行矯正。
所以有時(shí)候大家問(wèn)小車精度有多高?其實(shí)現(xiàn)在這樣已經(jīng)精度比較高了,難免打滑等問(wèn)題,不可能做到百分之百的精準(zhǔn)。
小車在距離和角度方面做到現(xiàn)在這樣對(duì)于自建地圖導(dǎo)航已經(jīng)是可以接受的,要提高更高的精度可能就要其他設(shè)備輔助,比如激光雷達(dá)來(lái)進(jìn)行輔助,激光雷達(dá)可以進(jìn)行二次檢測(cè)進(jìn)行糾正。
激光雷達(dá)數(shù)據(jù)的存儲(chǔ)格式,它首先會(huì)有一個(gè)大小范圍,如果超出范圍是無(wú)效的。還有就是有幾個(gè)采樣點(diǎn),這樣就可以激光雷達(dá)可以告訴你隔多少度有一個(gè)采樣點(diǎn)。
另外最后那個(gè)Intensities是告訴大家數(shù)據(jù)的準(zhǔn)確率,因?yàn)榧す饫走_(dá)也是取最高點(diǎn)的數(shù)據(jù),是有一定的準(zhǔn)確率的。上面的ppt其實(shí)就是用激光雷達(dá)掃了一個(gè)墻的形狀。
激光雷達(dá)掃出一個(gè)靜態(tài)形狀其實(shí)沒(méi)有意義,雷達(dá)建圖的意義其實(shí)在于建立房間的地圖。
如何繪制地圖?
第一步是收集眼睛數(shù)據(jù):
針對(duì)激光雷達(dá),ROS在sensor_msgs 包中定義了專用了數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)激光消息的相關(guān)信息,成為L(zhǎng)aserScan。
它指定了激光的有效范圍、掃描點(diǎn)采樣的角度及每個(gè)角度的測(cè)量值。激光雷達(dá)360度實(shí)時(shí)掃描,能實(shí)時(shí)測(cè)出障礙物的距離、形狀和實(shí)時(shí)變化。
第二步就是把眼睛看到的數(shù)據(jù)轉(zhuǎn)化為地圖:
ROS的gmapping把激光雷達(dá)的/scan數(shù)據(jù)轉(zhuǎn)換為柵格map數(shù)據(jù),其中黑色代表障礙物、白色代表空白區(qū)域,可以順利通行、灰色 :未知領(lǐng)域。隨著機(jī)器人的移動(dòng),激光雷達(dá)可以在多個(gè)不同方位觀測(cè)同一個(gè)位置是否有障礙物,如果存在障礙物的閾值超過(guò)設(shè)置值是,就標(biāo)定此處是存在障礙物;否則標(biāo)定不存在障礙物。 把障礙物、空白區(qū)域和未知領(lǐng)域的尺寸用不同灰度表示出來(lái),就是柵格地圖。便于下一步定位和導(dǎo)航。
有時(shí)候會(huì)出現(xiàn)很直的墻,機(jī)器人卻無(wú)法直著行走,這時(shí)的問(wèn)題可能就是機(jī)器人的輪子出現(xiàn)打滑等其他問(wèn)題,而走歪了,這時(shí)繪制出的地圖也可能是歪的。這種情況可以通過(guò)加一個(gè)陀螺儀來(lái)避免這個(gè)情況。因?yàn)榧す饫走_(dá)的特性,有時(shí)候遇到黑色或鏡面會(huì)導(dǎo)致測(cè)距不準(zhǔn)。
目前的解決方法就是不用激光雷達(dá),或者用激光雷達(dá)和超聲波進(jìn)行輔助處理。
ROS的地圖是分多層的,我可以在不同高度放多臺(tái)激光雷達(dá)來(lái)一起疊加,共同繪制一張地圖。地圖繪制結(jié)束之后,就可以進(jìn)行定位和導(dǎo)航等工作。
如何定位和導(dǎo)航?
定位:其實(shí)是概率性的定位,而不是100%的精度。根據(jù)激光雷達(dá)掃描周圍障礙物的形狀,與地圖的形狀做匹配,判斷機(jī)器人所在位置的概率。
機(jī)器人的定位是否成功,與地圖特征有很大關(guān)系,如果區(qū)域特征明顯,那么機(jī)器人就很容易判斷自己的位置。如果出現(xiàn)難以定位的問(wèn)題,可能需要人給指定初始位置,或者加led來(lái)進(jìn)行位置識(shí)別,或者其他的定位設(shè)備來(lái)協(xié)助定位。
目前的視覺(jué)通過(guò)色彩或者光的技術(shù)越來(lái)越多。
導(dǎo)航:全局路徑規(guī)劃+局部調(diào)整(動(dòng)態(tài)避障)
導(dǎo)航其實(shí)就是全局定位,首先根據(jù)現(xiàn)有地圖進(jìn)行規(guī)劃,但是在運(yùn)行過(guò)程中會(huì)進(jìn)行局部的路線規(guī)劃。但是總體還是根據(jù)全局路徑來(lái)走。
導(dǎo)航中工作量還很大,比如掃地機(jī)的路徑規(guī)劃和服務(wù)機(jī)器人的路徑規(guī)劃是不一樣的,掃地機(jī)器人可能要全覆蓋的有墻角的地圖,而服務(wù)機(jī)器人主要圍繞指定的路徑或者最短路徑來(lái)進(jìn)行規(guī)劃,這部分是ROS工作量最大的一塊。
路徑規(guī)劃根據(jù)不同應(yīng)用場(chǎng)景變化比較大,但是ROS提供基礎(chǔ)的路徑規(guī)劃的開(kāi)發(fā)包,在這個(gè)基礎(chǔ)上我們會(huì)做自己的路徑規(guī)劃。
機(jī)器人描述和坐標(biāo)系變換
在導(dǎo)航時(shí),哪些區(qū)域可以通過(guò),取決于機(jī)器人形狀等信息,ROS通過(guò)URDF(UnifiedRobot Description Format) 就是描述機(jī)器人硬件尺寸布局,比如輪子的位置、底盤大小、激光雷達(dá)安裝位置,這些都會(huì)影響到坐標(biāo)系的轉(zhuǎn)換。
坐標(biāo)系遵循的前提是每個(gè)幀只能有一個(gè)父幀,再往上進(jìn)行一些眼神或者關(guān)聯(lián)。
激光雷達(dá)的安裝位置直接影響/scan輸出數(shù)據(jù)。所以激光雷達(dá)和機(jī)器人的相對(duì)位置是需要做坐標(biāo)變換,才能把激光雷達(dá)的數(shù)據(jù)轉(zhuǎn)化為機(jī)器人視角的數(shù)據(jù)。
ROS的坐標(biāo)系,最終歸結(jié)為三個(gè)標(biāo)準(zhǔn)框架,可以簡(jiǎn)化許多常見(jiàn)的機(jī)器人問(wèn)題:
1)全局準(zhǔn)確,但局部不連續(xù)的幀(’map”)
2)全局不準(zhǔn)確,但局部光滑框架(’odom”)
3)機(jī)器人自身框架(’base_link”)
多種傳感器(像激光雷達(dá)、深度攝像頭和陀螺儀加速度計(jì)等)都可以計(jì)算base_link和odom的坐標(biāo)關(guān)系,但由于“每個(gè)幀只能有一個(gè)父幀”,所以只能有一個(gè)節(jié)點(diǎn)(比如 robot_pose_ekf 融合多傳感器)發(fā)布base_link和odom的坐標(biāo)關(guān)系。
Base link自身的坐標(biāo)系,因?yàn)椴煌b在機(jī)器人上不同位置,都要對(duì)應(yīng)到base link的坐標(biāo)系中,因?yàn)樗械膫鞲衅鞫际且ㄟ^(guò)機(jī)器人的視角來(lái)“看”。
有些朋友問(wèn)我,激光雷達(dá)在建地圖的時(shí)候,小車移動(dòng)后地圖就亂了,這是因?yàn)樾≤嚨牡妆P坐標(biāo)系和激光雷達(dá)的坐標(biāo)系沒(méi)有標(biāo)定準(zhǔn)確。
map和odom之間的關(guān)聯(lián)
因?yàn)樾≤囈苿?dòng)需要一個(gè)局部聯(lián)系,比如小車在向前走,不停的累加,這是里程計(jì)的作用,map起到全局的、不連續(xù)的作用,經(jīng)過(guò)激光雷達(dá)和map對(duì)應(yīng)。
如果要學(xué)習(xí)ROS的話,坐標(biāo)系的變化是重要的點(diǎn)。坐標(biāo)系的變換還有一個(gè)點(diǎn),就是每個(gè)幀都只有一個(gè)父幀,有時(shí)候兩個(gè)坐標(biāo)都和它有關(guān)聯(lián)的話,就是A和B關(guān)聯(lián),B再和C關(guān)聯(lián),而不是B/C都和A關(guān)聯(lián)。
三個(gè)坐標(biāo)幀的父子關(guān)系如下:
map –》 odom –》 base_link
其實(shí), map和odom都應(yīng)該和base_link關(guān)聯(lián),但為了遵守“每個(gè)幀只能有一個(gè)父幀”的原則,根據(jù)map和base_link 以及 odom-》base_link的關(guān)系,計(jì)算出map與odom的坐標(biāo)關(guān)系并發(fā)布。
odom-》base_link的坐標(biāo)關(guān)系是由里程計(jì)節(jié)點(diǎn)計(jì)算并發(fā)布的。
map -》 base_link的坐標(biāo)關(guān)系是由定位節(jié)點(diǎn)計(jì)算出來(lái),但并不發(fā)布,而是利用接收odom-》base_link的坐標(biāo)關(guān)系,計(jì)算出map-》odom的坐標(biāo)關(guān)系,然后發(fā)布。 只有里程計(jì)的時(shí)候,沒(méi)有激光雷達(dá),也可以跑,但是要先根據(jù)預(yù)設(shè)地圖進(jìn)行簡(jiǎn)單避障。
評(píng)論
查看更多