ROS與Navigation之0 TF基礎知識

2021-08-17 01:28:19 字數 2745 閱讀 4202

如下圖所示,在機械人身上各關節,轉輪中心都有乙個座標系,在機械人外部應該還會有其他的座標系,如地圖座標系,全域性座標系。tf庫的目的是實現系統中任乙個點在所有座標系之間的座標變換,也就是說,只要給定乙個座標系下的乙個點的座標,就能獲得這個點在其他座標系的座標。

為了達到這個目的,就需要確定各個座標系之間的關係,也就是獲得任一座標係在其他任乙個座標系下的描述。

假設有n個座標系,那麼他們之間的組合關係有c(n,2)個,如果n=4,那就是6種,如果n=100,那就是4950個,好多呀。不過,世界沒那麼複雜,我們可以給這些座標系之間構建乙個結構,比如單叉樹或者單層多叉樹,那麼100個座標系之間的關係,就可以用99個樹杈搞定。tf裡的選擇則是多層多叉樹。

維護一顆樹,需要先設計乙個樹的結構,也就是一定要在樹被風吹來吹去變換的時候,讓小樹杈找個大樹杈依附,讓大樹杈找個樹幹依附,讓樹幹有個根固定(所謂變換,就是找到倆樹枝變換之間的通路,這個通路很可能要先找到根,再從根找到目標樹枝)。(如果打算用tf解決你的座標變換問題,請一定要先清晰的畫出這棵樹的結構,再開始寫程式;因為這個結構是維護和使用的基礎)。

那麼該如何使用這棵樹呢?如,座標系a到座標系b的變換是什麼呢?很簡單,用tf的tflisener監聽某乙個指定的從乙個a frame到b frame的變換即可,當然前提是樹上的樹杈們能把a,b聯通,並已經準備好。再重複一次,這個變換是a frame到b frame的變換,也表示了b frame在a frame的描述,也代表了把乙個點在b frame裡的座標變換成在a frame裡的座標的座標變換。有了這個變換,你就可以盡情的變換了。

這個結構的建立和維護靠的是tf提供的tfbroadcastor類的sendtransform介面。在tb第一次發布乙個從已有的parent frame到新的child frame的座標系變換時,這棵樹就會新增乙個樹枝,之後就是維護。這裡,提醒一下,在用tf時,一定要細心照料整棵大樹,時刻保持這棵大樹能夠描述整個外部世界裡的關係,不能有斷裂。這樣才能保證在風吹時,整個樹都擺來擺去還保持穩定。

tf的實現的基本原理是,tb的類(broadcastor)裡有個publisher,tl的類(listener)裡有個subscriber,前者發布名為/tf的topic,後者訂閱該topic,傳送的訊息tfmessage裡包含了parent frameid和child frameid的資訊。這個機制意味著,所有的tb會發布某一特定的parent到child的變換,而所有tl會收到所有的這些變換,然後tl利用乙個tfbuffercore的資料結構維護乙個完整的樹結構及其狀態。也就是說每乙個tb都會廣播乙個變換,而tl會接收到所有這些變換,而每接收到乙個,就要更新自己維護的這個樹。基於此,tl在使用這棵樹時,會用lookuptransform或waitfortransform來獲得任意座標系之間的變換。非常簡單,對吧,但粗暴的也非常顯然。那就是只要是乙個tl,就要跟所有tb建立連線,就要收取所有的/tf訊息,來維護一棵完整的樹,並且,還要負責搜尋這棵樹,找到一條變換的路徑,然後乘呀乘,並且每次都要如此。

上圖例子描述了三個參考係之間的聯絡。三個節點分別是三個參考係,而/world是其他兩個烏龜參考係的父參考係。還包含一些除錯需要的傳送頻率、最近時間等資訊。tf提供了乙個tf_echo工具來檢視兩個廣播參考係之間的關係。我們可以看一下第二隻烏龜座標在第一只烏龜座標系的關係:

上圖是在前乙個圖的基礎上增加了乙個座標系,這個座標系是在turtle1下面的,也就是說,carrot1座標系是建立在turtle1座標系基礎上的,或者說tb發布的是乙個turtle1座標系到carrot1座標系的變換。

tf庫的優點,能用且易上手,主要如下:

a、各種數值計算的細節,你不用考慮,tf庫可以幫你;

b、介面很簡潔,會廣播和監聽就ok;

c、問題找的很準,那就是需要維護座標系之間的關係;

d、提供了很多任務具程式;

e、考慮了與時間相關的變換;

f、支援tf-prefix,可以在多機械人上用

g、基本能用,且不需要深入理解,死搬硬套就能用起來。

tf庫的缺點還是那句話,簡單粗暴!

a、樹的結構很簡單,但有時候很笨拙。舉個例子吧。有部電影叫手機,葛優扮演的叫石頭,范偉演的叫磚頭,兩個人是叔伯兄弟,從小到大的小夥伴,應該很熟悉,關係也很明確,但要放到樹的結構下,就需要從下到上找共同先輩,然後從這個先輩再往下找,進而確定二者的關係,這個比較笨拙(這是因為tb廣播的一般都是乙個父座標系和子座標系的關係)。於是有了范偉坐在門檻上的一句台詞:恁這是弄啥勒,恁奶不是俺奶?!

b、每個tl都要維護同一顆樹,這樣的開銷太大,主要是網路傳輸的負荷比較大。這一點,tf的設計者是完全承認的。舉個例子吧,北方的有些地方的農村過年時要拜年,拜年要磕頭,磕頭的物件是寫有逝去的先輩名字的樹狀圖,乙個同姓大家族裡有很多小家庭,每個家裡都有那麼一張圖,挨家拜年,街上人來人往,每個人都磕了很多頭,磕的其實是同一張。如果有個祠堂,集中處理,維護一張圖,就不用看到早早起床、滿街跑的情況,效率也會高多了。

c、很難滿足實時性的要求,這一點比較顯然。要不tf也不會每個變換存10秒鐘的資料,不過原始碼裡好像是開了乙個存100個訊息的佇列。

d、還有很多細節不易理解。比如,now()和time(0);比如,技術文件裡的一些術語名詞;比如,採用了機械人裡的習慣,與飛行器,慣導,車輛裡的習慣區別較大,使用時不能想當然。

重要)

SLAM 之ROS安裝,配置與初試

我的系統是ubuntu 15.04 vivid,安裝ros jade。sudo sh c echo deb lsb release sc main etc apt sources.list.d ros latest.list sudo apt key adv keyserver hkp recv k...

ROS學習之引數

ros學習之引數 除 了 前 面 介 紹 過 的 消 息 傳 遞 ros 還 提 供 另 一 種 參 數 parameters 機制用於獲取節點的資訊。其主要思想是使用集中引數伺服器 parameter server 維護乙個變數集的值,包括整數 浮點數 字串以及其他資料型別,每乙個變數用乙個較短的...

ROS學習之服務

ros學習之服務 1 服務是點對點的,乙個節點傳送訊息,還需要等待接受節點的響應。而訊息發布後沒有響應之說,誰訂閱了這個話題,誰就可以讀取到此訊息。2 服務是一對一的,訊息可以多對多。0.1服務專業術語 客戶端 用來向伺服器傳送請求的。伺服器 接受伺服器請求,並採取一定處理回饋給客戶端。服務資料型別...