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