1. 程式人生 > 實用技巧 >ROS中map、odom、base_link等座標系關係的理解

ROS中map、odom、base_link等座標系關係的理解

概述

關於base_link與base_footprint的關係請參考我的:amcl配置需要特別注意的問題這篇文章。

要回答的問題

1、map座標系在導航中是什麼,它與gazebo中世界座標系又有怎樣的聯絡?

2、map到odom的TF變化的意義是什麼?怎樣得到的?

3、odom到base_link的TF變化的意義是什麼?怎樣得到的

4、TF變化對於導航堆疊的意義是什麼?有什麼注意事項?

回答問題1

地圖是建出來的,在建圖過程中,以機器人出發的起點作為map座標系的原點。

從xacro檔案在gazebo中生成機器人時,機器人預設放置在gazebo中的世界座標原點,該世界座標遵循右手座標系,其座標軸朝向固定。其它link的座標系,如base_link(如果base_link是機器人最頂層座標系)的座標軸朝向預設與gazebo世界座標一致,這個預設的意思如圖:

在這裡插入圖片描述
oringin:表示該座標系相對於其父座標系的位置和朝向,六個0預設相同
注意:如果機器人本體的最頂層的座標系是base_link,這就意味著base_link的父座標系是gazebo中的世界座標系。
規範是使用robot_state_publisher釋出機器人本體一系列座標變化,如base_link->laser_link、base_link->wheel_link等等。
注意:gazebo不釋出世界座標系到base_link的變化,這樣做的目的是為了更好地使用導航堆疊,因為一個TF節點只能有一個父節點。

載入好gazebo後開始建圖,建圖的起點將是地圖的原點,地圖上的其它位置的座標都是相對這個原點而言的,單位m,與gazebo裡面座標單位一致。這樣地圖上的每一個點都有了自己的座標,還有一個座標原點。在使用gmapping建圖中,它會“貼”一個座標系在它的起點,這就是map座標系,它在建圖過程中保持不動,它會從鐳射雷達的資料、從TF樹計算出的鐳射雷達到map座標系的變化來建立有真實座標的地圖。導航時開啟地圖,記住地圖的原點在建圖起點,只要導航堆疊知道機器人相對於map座標系在什麼位置就可以導航了。

gazebo的世界座標系只在gazebo裡有效,地圖的map座標系原點始終在建圖起點,不管你把它放到gazebo的什麼位置開始建圖。它們的共同點是:單位都是m,座標系都是右手座標系,因此它們可以很好地協同工作。
注意:我們應該將導航堆疊裡面給定的的機器人在地圖裡面的初始位姿,和在gazebo環境下放置機器人的位姿設為一樣,這樣鐳射雷達掃到的環境才能與地圖貼合。

兩個預設:
導航堆疊預設map座標系在建圖的起點,且固定不動。
gazebo預設將機器人放置在其座標原點。

一般我們按照預設的執行建圖導航是沒有問題的,但如果你想讓機器人不從建圖的原點開動,就需要注意上述的設定原則了。

提示:amcl設定機器人在地圖中位置的引數是:

~initial_pose_x (double, default: 0.0 meters)
~initial_pose_y (double, default: 0.0 meters)
~initial_pose_a (double, default: 0.0 radians)
最後一個是相對於Z軸的旋轉角度(弧度,逆時針為正)
ROS中的單位都是統一的!

回答問題2

map到odom的座標變化一般來說是由amcl包估計出來的
在這裡插入圖片描述
amcl並不是必須,為什麼?
因為我們真正要的是map到odom的變換關係,即知道機器人在哪裡,所以如果你有其它好辦法知道機器人從建圖起點(map座標原點)開始行走之後的每一時間的真實位置,就完成了機器人的定位,導航是沒有問題的。但是實際情況往往沒有那麼樂觀。

在這裡插入圖片描述

通常情況下,我們自己計算的機器人相對於其出發點的座標變換不夠精準,但通常也不會偏得離譜,這個我們稱為odom->base_link的變換,注意幾點:odom座標系不在機器人上!!!;odom->base_link只是一個單純的TF變化,odom沒有固定在機器人起點(只是以起點座標為參考做計算),除map外其它一切座標系都不是固定的,它只是單純計算了從開始到現在自己走了多遠、旋轉了多少度,而對自己估計是否正確一無所知。所以上述“相對於其出發點”的描述是不合適的,會造成odom是真實的那個出發點的錯誤認知。
還有odom座標系與/odom話題是兩碼事,其存在的關聯與區別請參考我其它部落格。

odom->base_link一般來說會告訴amcl機器人從“起點”開始“大概走到哪裡了”,然後amcl根據鐳射雷達資料估計機器人實際是到達哪裡了,即它算出了map到base_link的變換,但是由於有一個odom->base_link的變換在釋出了,根據一個子座標系只能有一個父座標系的原則,amcl就只能釋出map->odom的變化,即所謂的估計“里程計的漂移”。

回答問題3

odom->base_link的變化對於導航堆疊沒有意義,但是對於amcl意義重大,因為知道了機器人大概在哪裡,amcl演算法就能更快地收斂到機器人真實位置。

回答問題4

導航堆疊必須有map到base_link的變換,有的本地規劃器還要求提供/odom
注意機器人的出發點以及ROS裡面的單位制。

小結

為什麼全用的base_link而不是base_footprint?
請參考我的:amcl配置注意事項

ROS裡面無論是gazebo與導航堆疊,真正作為固定的、提供座標參考的只有gazebo世界座標系與地圖中的map座標系。
其它座標系可以看作是為了描述機器人各個link間的關係、機器人位置等所使用的一種“虛擬座標系”,它的好處是簡化和規範了對空間相對位置的描述,不僅有利於程式設計,更有利於用系統的數學知識去處理它們。