1. 程式人生 > >如何設計一款基於ROS的移動機器人?

如何設計一款基於ROS的移動機器人?

編者按:本文是EAI科技創始人兼CEO李金榜在硬創公開課的文字稿,感謝作者和雷鋒網授權轉載。

 

最近幾年各種移動機器人開始湧現出來,不論是輪式的還是履帶式的,如何讓移動機器人移動都是最核心的工作。要讓機器人實現環境感知、機械臂控制、導航規劃等一系列功能,就需要作業系統的支援,而ROS就是最重要的軟體平臺之一,它在科研領域已經有廣泛的應用。

不過有關ROS的書籍並不多,國內可供的學習社群就更少了。本期硬創公開課就帶大家瞭解一下如何利用ROS來設計移動機器人。

分享嘉賓李金榜:EAI科技創始人兼CEO,畢業於北京理工大學,碩士學位。 曾在網易、雪球、騰訊技術部有多年linux底層技術研發經驗。2015年聯合創立EAI科技,負責SLAM演算法研發及相關定位導航軟體產品開發。EAI科技,專注機器人移動,提供消費級高效能鐳射雷達、slam演算法和機器人移動平臺。

移動機器人的三個部分

 

所謂的智慧移動, 是指機器人能根據周圍的環境變化,自主地規劃路線、避障,到達目標地。

機器人是模擬人的各種行為,想象一下,人走動需要哪些器官的配合?  首先用眼睛觀察周圍環境,然後用腦去分析如何走才能到達目標地,接著用腿走過去, 周而復始,直到到達目標地址為至。機器人如果要實現智慧移動,也需要眼、腦和腿這三部分的緊密配合。

 

“腿”是機器人移動的基礎。機器人的“腿”不侷限於類人或類動物的腿,也可以是輪子、履帶等,能讓機器人移動起來的部件,都可以籠統地稱為“腿”。

 

類人的腿式優點是:既可以在複雜路況(比如爬樓梯)下移動、也可以更形象地模仿人的動作(比如跳舞),缺點是:結構和控制單元比較複雜、造價高、移動慢等。

所以大部分移動的機器人都是輪式機器人,其優勢在於輪子設計簡單、成本低、移動快。而輪式的也分為多種: 兩輪平衡車、三輪、四輪和多輪等等。目前最經濟實用的是兩個主動輪+一個萬向輪。

眼睛

 

roboeye

機器人的眼睛其實就是一個感測器。它的作用是觀察周圍的環境,適合做機器人眼睛的有鐳射雷達、視覺(深度相機、單雙相機)、輔助(超聲波測距、紅外測距)等。

“腦”

機器人的大腦就負責接收“眼睛”傳輸的資料,實時計算出路線,指揮腿去移動。

其實就是要把看到的東西轉換為資料語言。針對如何描述資料,如何實現處理邏輯等一系列問題。 ROS系統給我們提供一個很好的開發框架。

 

 robobrain

ROS簡介

 

ROS是建立在linux之上的作業系統。它的前身是斯坦福人工智慧實驗室為了支援斯坦福智慧機器人而建立專案,主要可以提供一些標準作業系統服務,例如硬體抽象,底層裝置控制,常用功能實現,程序間訊息以及資料包管理。

ROS是基於一種圖狀架構,從而不同節點的程序能接受、釋出、聚合各種資訊(例如感測,控制,狀態,規劃等等)。目前ROS主要支援Ubuntu作業系統。

有人問ROS能否裝到虛擬機器裡,一般來說是可以的,但是我們建議裝個雙系統,用Ubuntu專門跑ROS。

rosintro

實際上,ROS可以分成兩層,低層是上面描述的作業系統層,高層則是廣大使用者群貢獻的實現不同功能的各種軟體包,例如定位繪圖,行動規劃,感知,模擬等等。ROS(低層)使用BSD許可證,所有是開源軟體,並能免費用於研究和商業用途,而高層的使用者提供的包則使用很多種不同的許可證。

用ROS實現機器人的移動

 

對於二維空間,使用線速度 + 角速度可以實現輪式機器的隨意移動。

線些速度:描述機器人前後移動的速度大小

角速度:描述機器人轉動的角速度大小

所以控制機器人移動主要是要把線速度角速度轉換為左右輪的速度大小,然後,通過輪子直徑和輪間距,可以把線速度和角速度轉化為左輪和右輪的速度大小。

這裡有一個關鍵問題就是編碼器的選擇和pid的調速。

編碼器的選擇:一般編碼器和輪子是在一個軸上,目前來說,速度在0.7m/s以下的話,編碼器選600鍵到1200鍵之間都ok。不過需要注意的是,編碼器最好用雙線的,A、B兩線輸出,A向和B向輸出相差90度,這樣可以防抖動。防抖動就是可以在之後里程計算時可以更準確。

左輪和右輪的速度大小的控制,通過輪子編碼器反饋,通過PID實時調整電機的PMW來實現。實時計算出小車的里程計(odom),得到小車移動位置的變化。

計算車的位置變化是通過編碼器來計算的,如果輪子打滑等情況,那麼計算的變化和實際的變化可能不同。要解決這個問題,其實是看哪個問題更嚴重。要走5米只走了4.9米重要,還是要走180度只走了179度重要。

其實角度的不精確對小車的影響更大。一般來說,小車的直線距離精確度可以控制在釐米範圍內,在角度方面可以控制精準度在1%~2%。因為角度是比較重要的引數,所以很多人就用陀螺儀來進行矯正。

所以有時候大家問小車精度有多高?其實現在這樣已經精度比較高了,難免打滑等問題,不可能做到百分之百的精準。

小車在距離和角度方面做到現在這樣對於自建地圖導航已經是可以接受的,要提高更高的精度可能就要其他裝置輔助,比如鐳射雷達來進行輔助,鐳射雷達可以進行二次檢測進行糾正。

鐳射雷達資料的儲存格式,它首先會有一個大小範圍,如果超出範圍是無效的。還有就是有幾個取樣點,這樣就可以鐳射雷達可以告訴你隔多少度有一個取樣點。
laserscan

另外最後那個Intensities是告訴大家資料的準確率,因為鐳射雷達也是取最高點的資料,是有一定的準確率的。上面的ppt其實就是用鐳射雷達掃了一個牆的形狀。

鐳射雷達掃出一個靜態形狀其實沒有意義,雷達建圖的意義其實在於建立房間的地圖。

如何繪製地圖?

第一步是收集眼睛資料: 

針對鐳射雷達,ROS在sensor_msgs 包中定義了專用了資料結構來儲存鐳射訊息的相關資訊,成為LaserScan。

它指定了鐳射的有效範圍、掃描點取樣的角度及每個角度的測量值。鐳射雷達360度實時掃描,能實時測出障礙物的距離、形狀和實時變化。

第二步就是把眼睛看到的資料轉化為地圖:

scanmap

 

ROS的gmapping把鐳射雷達的/scan資料轉換為柵格map資料,其中黑色代表障礙物、白色代表空白區域,可以順利通行、灰色 :未知領域。隨著機器人的移動,鐳射雷達可以在多個不同方位觀測同一個位置是否有障礙物,如果存在障礙物的閾值超過設定值是,就標定此處是存在障礙物;否則標定不存在障礙物。 把障礙物、空白區域和未知領域的尺寸用不同灰度表示出來,就是柵格地圖。便於下一步定位和導航。

有時候會出現很直的牆,機器人卻無法直著行走,這時的問題可能就是機器人的輪子出現打滑等其他問題,而走歪了,這時繪製出的地圖也可能是歪的。這種情況可以通過加一個陀螺儀來避免這個情況。因為鐳射雷達的特性,有時候遇到黑色或鏡面會導致測距不準。

目前的解決方法就是不用鐳射雷達,或者用鐳射雷達和超聲波進行輔助處理。

ROS的地圖是分多層的,我可以在不同高度放多臺鐳射雷達來一起疊加,共同繪製一張地圖。地圖繪製結束之後,就可以進行定位和導航等工作。

如何定位和導航?

定位:其實是概率性的定位,而不是100%的精度。根據鐳射雷達掃描周圍障礙物的形狀,與地圖的形狀做匹配,判斷機器人所在位置的概率。

機器人的定位是否成功,與地圖特徵有很大關係,如果區域特徵明顯,那麼機器人就很容易判斷自己的位置。如果出現難以定位的問題,可能需要人給指定初始位置,或者加led來進行位置識別,或者其他的定位裝置來協助定位。

目前的視覺通過色彩或者光的技術越來越多。

導航:全域性路徑規劃+區域性調整(動態避障)

導航其實就是全域性定位,首先根據現有地圖進行規劃,但是在執行過程中會進行區域性的路線規劃。但是總體還是根據全域性路徑來走。

導航中工作量還很大,比如掃地機的路徑規劃和服務機器人的路徑規劃是不一樣的,掃地機器人可能要全覆蓋的有牆角的地圖,而服務機器人主要圍繞指定的路徑或者最短路徑來進行規劃,這部分是ROS工作量最大的一塊。

路徑規劃根據不同應用場景變化比較大,但是ROS提供基礎的路徑規劃的開發包,在這個基礎上我們會做自己的路徑規劃。

機器人描述和座標系變換

urdf

在導航時,哪些區域可以通過,取決於機器人形狀等資訊,ROS通過URDF(UnifiedRobot Description Format) 就是描述機器人硬體尺寸佈局,比如輪子的位置、底盤大小、鐳射雷達安裝位置,這些都會影響到座標系的轉換。

座標系遵循的前提是每個幀只能有一個父幀,再往上進行一些眼神或者關聯。

鐳射雷達的安裝位置直接影響/scan輸出資料。所以鐳射雷達和機器人的相對位置是需要做座標變換,才能把鐳射雷達的資料轉化為機器人視角的資料。

ROS的座標系,最終歸結為三個標準框架,可以簡化許多常見的機器人問題:

1)全域性準確,但區域性不連續的幀(’map”)

2)全域性不準確,但區域性光滑框架(’odom”)

3)機器人自身框架(’base_link”)

多種感測器(像鐳射雷達、深度攝像頭和陀螺儀加速度計等)都可以計算base_link和odom的座標關係,但由於“每個幀只能有一個父幀”,所以只能有一個節點(比如 robot_pose_ekf 融合多感測器)釋出base_link和odom的座標關係。

Base link自身的座標系,因為不同元件裝在機器人上不同位置,都要對應到base link的座標系中,因為所有的感測器都是要通過機器人的視角來“看”。

有些朋友問我,鐳射雷達在建地圖的時候,小車移動後地圖就亂了,這是因為小車的底盤座標系和鐳射雷達的座標系沒有標定準確。

map和odom之間的關聯

因為小車移動需要一個區域性聯絡,比如小車在向前走,不停的累加,這是里程計的作用,map起到全域性的、不連續的作用,經過鐳射雷達和map對應。

如果要學習ROS的話,座標系的變化是重要的點。座標系的變換還有一個點,就是每個幀都只有一個父幀,有時候兩個座標都和它有關聯的話,就是A和B關聯,B再和C關聯,而不是B/C都和A關聯。

三個座標幀的父子關係如下:

map –> odom –> base_link

其實, map和odom都應該和base_link關聯,但為了遵守“每個幀只能有一個父幀”的原則,根據map和base_link 以及 odom->base_link的關係,計算出map與odom的座標關係併發布。

odom->base_link的座標關係是由里程計節點計算併發布的。

map -> base_link的座標關係是由定位節點計算出來,但並不釋出,而是利用接收odom->base_link的座標關係,計算出map->odom的座標關係,然後釋出。

只有里程計的時候,沒有鐳射雷達,也可以跑,但是要先根據預設地圖進行簡單避障。

精彩問答

 

Q:還有ROS的實時性有什麼改進進展嗎 ?

A:實時改進要看ROS2.0的設計,其實ROS2.0的進展網上有公開。但是實際上他的進展離實際應用還有一定距離,至少今年下半年還達不到穩定,不過可以去研究下他的程式碼,他對記憶體管理,執行緒管理,在實時性上有了很大改善。

Q:vSLAM對記憶體和CPU要求頗高。實際工程中,李老師使用的是什麼硬體配置?可以做多大的地圖呢?

A:確實如此,目前來說我們還是使用鐳射雷達和感測器輔助來進行,這個和地圖大小沒有太大關係,主要是與地形障礙物複雜程度有關。

 

本文出處:程弢 @硬創公開課