AMCL(Adaptive Monte Carlo Localization),中文稱為自適應蒙特卡羅定位法,是一種猜測機體全局位置的方式。在ROS中,使用AMCL需要訂閱地圖和光達的資訊。 他和里程計會各自評估機體的位置。里程計使用積分方式持續累計自己走過的資訊,並提供map->base_link的轉換;而AMCL利用粒子散佈的方式估計自己最可能出現的區域,並提供map->base_link的轉換。 看到這邊,相信大家都有個疑惑:前面我們在[[6.TF]]中不是說,odom提供的是odom->base_footprint(base_link)的轉換,而AMCL提供的是map->odom的轉換嗎? 其實這原因和樹狀結構有點關係。樹狀結構中,每一個非根節點有且只有一個父節點。在TF樹的關係也是如此,我們很顯然可以看見AMCL和里程計實際上是提供相同的估算訊息,也就是對於base_link(車體)來說,這兩個訊息都可以直接影響他的座標系。但如果直接這樣做,則違反了樹狀結構的原則(兩個父節點)。 因此ROS在設計之初,就定義了這兩個座標系的先後順序,以讓TF樹符合樹狀結構的規範,才有了我們現在看到的這張圖: ![](https://hackmd.io/_uploads/SJou2EeTn.png) (示意圖,此為當事LIMO的TF樹) 回到AMCL上,我們知道了實際上里程計和AMCL都是估算位置。在理想的狀況下,這兩個點應該要距離很近或者重疊,但實際上這兩個點隨著時間越跑越久,誤差會越來越大(主要來自於里程計的誤差)。AMCL則正好相反,剛開始的時候誤差會比較大,隨時間估計次數夠多後反而會慢慢收斂: (剛開始跑AMCL時的粒子分布) ![](https://hackmd.io/_uploads/rJQK2Vxp2.png) (跑幾步路之後AMCL的粒子分布) ![](https://hackmd.io/_uploads/BkjY2Exa2.png) 當然,AMCL和里程計兩者只取其一還是有辦法導航的。這也就是為什麼有些ROS導航車連光達都沒有,僅依靠里程計就能開跑。但考慮到還需要額外避障以及兩者各自的優缺點,兩者併用的狀況還是佔絕對多數。