對於移動機器人來講,最吸引人的莫過於SLAM,堪稱Moving Robot 皇冠上的明珠。Perception 服務於 SLAM,Motion Plan基於SLAM。SLAM在移動機器人整個問題框架中,起着最爲核心的做用。爲了專一於Mapping,此章咱們假設 Location 是已知的。算法
軌跡規劃任務是再Metric Map的基礎上完成的。固然,層次最高的是語意圖,語意圖是將來研究的熱點方向。獲取Metric Map 的難度最大之處在於:一、傳感器噪聲(May be solved by PGM; 二、機器人在移動(Location 問題);數據結構
常見的MAP是基於UGV而言的, 使用的地圖是Occupancy Map,與以前在軌跡規劃欄目中的圖同樣,以 0 表示沒法到達的區域,以 1 表示能夠達到的區域。app
解決傳感器噪聲問題的方法是對傳感器進行建模,其模型爲機率模型:框架
對於給定的觀測,其factor 如上,當連續N次觀測到同一個xy的值時,利用 factor product,便可得到n次觀測的Joint CPD ,在Joint CPD 上運行MAP算法,便可得到最終的地圖了。在通解的基礎上,確實是這樣設計算法的,可是咱們目前面對的Mapping 問題還太Naive,不須要如此複雜的手段。設計
此處定義了一個odd,表示發生與否可能性的比值。換言之,就是傳感器出錯的機率比,這是一個能夠估計的量。好比傳感器測出有物體的odd是2,沒物體的odd是3.blog
依據Beyes 公式把Odd展開:博客
其中,p(m = 1|z)/p(m = 0/z) 表示的是測量完成後 odd 的值,它等於 這次測量值 + 以前的odd。it
換言之,咱們只要定義好先驗圖與log-odd-meas,就能夠了。io
全部的東西老是提及來容易作起來難。即便是如此Naive的Map,真正Coding仍是很難的。尤爲是如何高效的實現Map的更新,此外,機器人每次發出的激光線達上千條,每一個位姿都要更新上前個點。對此問題,我設計了並行算法,即便在並行的條件下,生成一次Map也要近20s.基礎
算法流程以下:
一、將激光擊中的點變換到全局座標系下
二、利用Breshenman 算法,獲取激光經過的路徑
三、獲取Occupied Map 與 Free Map
四、更新Map.
左圖是單次測量的圖,也就是機器人一個位姿的測量結果。顯然,在靠近機器人的地方,噪聲嚴重。右圖是機器人在空間中移動後最終的Map。
對於2維地圖,咱們採用 free+occupy 的形式儲存空間中的障礙物。然而有障礙物的地方畢竟仍是少數,或者說,地圖是稀疏的。
對於3維數據而言,咱們用3維的空間來描述顯然不划算,由其是當空間巨大時。此時咱們選擇的地圖,或者說是數據結構是kd-tree 與 OcTree. 此部份內容在點雲相關博客中有過介紹,不贅述。