Introduction to tf
ROS 機器人開發的過程中,經常需要用到tf坐標變換,那麼什麼是tf呢?
1 什麼是tf
tf是一個讓用戶隨時間跟蹤多個參考系的功能包,它使用一種樹型數據結構,根據時間緩衝並維護多個參考系之間的坐標變換關係,可以幫助用戶在任意時間,將點、向量等數據的坐標,在兩個參考系中完成坐標變換.
2 tf可以做什麼
一個機器人系統通常有很多三維的參考系,而且會隨著時間的推移發生變化,例如全局參考系(world frame),機器人中心參考系(base frame),機械夾參考系(gripper frame),機器人頭參考系(head frame)等等。tf可以以時間為軸,跟蹤這些參考系(默認是10秒之內的),並且允許用戶提出如下的申請:
- 五秒鐘之前,機器人頭參考系相對於全局參考系的關係是什麼樣的?
- 機器人夾取的物體相對於機器人中心參考系的位置在哪裡?
- 機器人中心參考系相對於全局參考系的位置在哪裡?
tf可以在分散式系統中進行操作,也就是說一個機器人系統中所有的參考系變換關係,對於所有節點組件,都是可用的,所有訂閱tf消息的節點都會緩衝一份所有參考系的變換關係數據,所以這種結構不需要中心伺服器來存儲任何數據。
3 tf的使用流程
想要使用tf功能包,總體來講可以分為以下兩個步驟:
(1) 監聽tf變換 接收並緩存系統中發布的所有參考系變換,並從中查詢所需要的參考系變換。 (2) 廣播tf變換 向系統中廣播參考系之間的坐標變換關係。系統中更可能會存在多個不同部分的tf變換廣播,每個廣播都可以直接將參考系變換關係直接插入tf樹中,不需要再進行同步。4 tf demo
(1) 安裝有關包
$ sudo apt-get install ros-kinetic-ros-tutorials ros-kinetic-geometry-tutorials ros- kinetic-rviz ros-kinetic-rosbash ros-kinetic-rqt-tf-tree
(2)運行demo
$ roslaunch turtle_tf turtle_tf_demo.launch
$ rosrun turtlesim turtle_teleop_key
會發現有兩個小海龜出現,我們通過鍵盤控制,會發現另一個小海龜會跟隨我們控制的小海龜移動。
這個demo演示使用tf庫創建三個坐標框架:世界框架,turtle1框架和turtle2框架。 本教程使用tf廣播器發布烏龜坐標框架和tf監聽器來計算烏龜框架的差異,並移動一隻烏龜來跟隨另一隻烏龜。5 使用rqttf_tree
rqt_tf_tree是一個運行時工具,可用於可視化通過ROS廣播的幀樹。只需簡單地通過圖表左上角的刷新按鈕進行刷新。
rosrun rqt_tf_tree rqt_tf_tree
6 使用rqt tf_echo
tf_echo可以演示任何兩個通過ros廣播的坐標系之間的變換
用法:rosrun tf tf_echo [reference_frame] [target_frame]
那麼,在上述demo里,turtle1和turtle2的坐標系框架之間的關係如下:
$ rosrun tf tf_echo turtle1 turtle2
可以通過控制turtle1來觀察坐標變換的差異。
7 rviz和tf
rviz是一個可視化工具,可用於檢查tf坐標。使用rviz的-d選項及turtle_tf配置文件啟動rviz:
用法:rosrun rviz rviz -d rospack find turtle_tf/rviz/turtle_rviz.rviz
在rviz裡面添加tf,然後通過鍵盤控制turtle1移動,我們將在rviz界面裡面看到坐標系框架之間的跟隨運動。
推薦閱讀: