# 8.1 認識TF
### 8.1.1 簡介
TF是一個ROS世界里的一個基本的也是很重要的概念,所謂TF(TransForm),就是坐標轉換.在現實生活中,我們做出各種行為模式都可以在很短的時間里完成,比如拿起身邊的物品,但是在機器人的世界里,則遠遠沒有那么簡單.觀察下圖,我們來分析機器人拿起身邊的物品需要做到什么,而TF又起到什么樣的作用.

觀察這個機器人,我們直觀上不認為拿起物品會又什么難度,站在人類的立場上,我們也許會想到手向前伸,抓住,手收回.就完成了這整個一系列的動作.但是如今的機器人遠遠沒有這么智能,它能得到的只是各種傳感器發送回來的數據,然后它再處理各種數據進行操作,比如手臂彎曲45度,再向前移動20cm等這樣的各種十分精確的數據,盡管如此,機器人依然沒法做到像人類一樣自如的進行各種行為操作.那么在這個過程中,TF又扮演著什么樣的角色呢?還拿該圖來說,當機器人的"眼睛"獲取一組數據,關于物體的坐標方位,但是相對于機器人手臂來說,這個坐標只是相對于機器人頭部的傳感器,并不直接適用于機器人手臂執行,那么物體相對于頭部和手臂之間的坐標轉換,就是TF.
坐標變換包括了位置和姿態兩個方面的變換,ROS中的tf是一個可以讓用戶隨時記錄多個坐標系的軟件包。tf保持緩存的樹形結構中的坐標系之間的關系,并且允許用戶在任何期望的時間點在任何兩個坐標系之間轉換點,矢量等.
### 8.1.2 ROS中的TF
tf的定義不是那么的死板,它可以被當做是一種標準規范,這套標準定義了坐標轉換的數據格式和數據結構.tf本質是樹狀的數據結構,所以我們通常稱之為**"tf tree"**,tf也可以看成是一個topic:`/tf`,話題中的message保存的就是tf tree的數據結構格式.維護了整個機器人的甚至是地圖的坐標轉換關系.tf還可以看成是一個package,它當中包含了很多的工具.比如可視化,查看關節間的tf,debug tf等等.tf含有一部分的接口,就是我們前面章節介紹的roscpp和rospy里關于tf的API.所以可以看成是話題轉換的標準,話題,工具,接口.

觀察上圖,我們可以看到ROS數據結構的一個抽象圖,ROS中機器人模型包含大量的部件,這些部件統稱之為**link**,每一個link上面對應著一個**frame**, 即一個坐標系.link和frame概念是綁定在一起的.像上圖pr2模型中我們可以看到又很多的frame,錯綜復雜的鋪置在機器人的各個link上,維護各個坐標系之間的關系,就要靠著tf tree來處理,維護著各個坐標系之間的聯通.如下圖:

上圖是我們常用的robot_sim_demo運行起來的tf tree結構,每一個圓圈代表一個frame,對應著機器人上的一個link,任意的兩個frame之間都必須是聯通的,如果出現某一環節的斷裂,就會引發error系統報錯.所以完整的tf tree不能有任何斷層的地方,這樣我們才能查清楚任意兩個frame之間的關系.仔細觀察上圖,我們發現每兩個frame之間都有一個broadcaster,這就是為了使得兩個frame之間能夠正確連通,中間都會有一個Node來發布消息來broadcaster.如果缺少Node來發布消息維護連通,那么這兩個frame之間的連接就會斷掉.broadcaster就是一個publisher,如果兩個frame之間發生了相對運動,broadcaster就會發布相關消息.
- 前言
- 第一章 ROS簡介
- 機器人時代的到來
- ROS發展歷程
- 什么是ROS
- 安裝ROS
- 安裝ROS-Academy-for-Beginners教學包
- 二進制與源碼包
- 安裝RoboWare Studio
- 單元測試一
- 第二章 ROS文件系統
- Catkin編譯系統
- Catkin工作空間
- Package軟件包
- CMakeLists.txt
- package.xml
- Metapacakge軟件元包
- 其他常見文件類型
- 單元測試二
- 第三章 ROS通信架構(一)
- Node & Master
- Launch文件
- Topic
- Msg
- 常見msg類型
- 單元測試三
- 第四章 ROS通信架構(二)
- Service
- Srv
- Parameter server
- Action
- 常見srv類型
- 常見action類型
- 單元測試四
- 第五章 常用工具
- Gazebo
- RViz
- Rqt
- Rosbag
- Rosbridge
- moveit!
- 單元測試五
- 第六章 roscpp
- Client Library與roscpp
- 節點初始、關閉與NodeHandle
- Topic in roscpp
- Service in roscpp
- Param in roscpp
- 時鐘
- 日志與異常
- 第七章 rospy
- Rospy與主要接口
- Topic in rospy
- Service in rospy
- Param與Time
- 第八章 TF與URDF
- 認識TF
- TF消息
- tf in c++
- tf in python
- 統一機器人描述格式
- 附錄:TF數學基礎
- 三維空間剛體運動---旋轉矩陣
- 三維空間剛體運動---歐拉角
- 三維空間剛體運動---四元數
- 第九章 SLAM
- 地圖
- Gmapping
- Karto
- Hector
- 第十章 Navigation
- Navigation Stack
- move_base
- costmap
- Map_server & Amcl
- 附錄:Navigation工具包說明
- amcl
- local_base_planner
- carrot_planner
- clear_costmap_recovery
- costmap_2d
- dwa_local_planner
- fake_localization
- global_planner
- map_server
- move_base_msg
- move_base
- move_slow_and_clear
- navfn
- nav_core
- robot_pose_ekf
- rotate_recovery