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界面裡面看到坐標系框架之間的跟隨運動。


推薦閱讀:
相关文章