# 8.2 TF消息
### 8.2.1 TransformStamped.msg

上一節在介紹ROS中的TF時候我們已經初步的認識了TF和TF樹,了解了在每個frame之間都會有broadcaster來發布消息維系坐標轉換.那么這個消息到底是什么樣子的呢?這個消息TransformStampde.msg,它就是處理兩個frame之間一小段tf的數據格式.
### 8.2.2 格式規范
TransformStamped.msg的格式規范如下:
```
std_mags/Header header
uint32 seq
time stamp
string frame_id
string child_frame_id
geometry_msgs/Transform transform
geometry_msgs/Vector3 translation
float64 x
float64 y
float64 z
geometry_msgs/Quaternion rotation
float64 x
float64 y
flaot64 z
float64 w
```
觀察標準的格式規范,首先header定義了序號,時間以及frame的名稱.接著還寫了child\_frame,這兩個frame之間要做那種變換就是由geometry\_msgs/Transform來定義.Vector3三維向量表示平移,Quaternion四元數表示旋轉.像下圖TF樹中的兩個frame之間的消息,就是由這種格式來定義的.odom就是frame\_id,baselink\_footprint就是child\_frame\_id.我們知道,一個topic上面,可能會有很多個node向上面發送消息。如圖所示,不僅有我們看到的frame發送坐標變換個tf,還有別的frame也在同樣的向它發送消息。最終,許多的TransformStamped.msg發向tf,形成了TF樹。

### 8.2.3 TF樹的數據類型
上面我們講了,TF tree是由很多的frame之間TF拼接而成。那么TF tree是什么類型呢?如下:
* tf/tfMessage.msg
* tf2_msgs/TFMessage.msg
這里TF的數據類型有兩個,主要的原因是版本的迭代。自ROS Hydro以來,tf第一代已被“棄用”,轉而支持tf2。tf2相比tf更加簡單高效。此外也添加了一些新的功能。
由于tf2是一個重大的變化,tf API一直保持現有的形式。由于tf2具有tf特性的超集和一部分依賴關系,所以tf實現已經被移除,并被引用到tf2下。這意味著所有用戶都將與tf2兼容。官網建議新工作直接使用tf2,因為它有一個更清潔的界面,和更好的使用體驗。
如何查看自己使用的TF是哪一個版本,使用命令`rostopic info /tf`即可。
### 8.2.4 格式定義
tf/tfMessage.msg或tf2_msgs/TFMessage標準格式規范如下:
```
geometry_msgs/TransformStamped[] transforms
std_msgs/Header header
uint32 seq
time stamp
string frame_id
string child_frame_id
geometry_msgs/Transform transform
geometry_msgs/Vector3 translation
float64 x
float64 y
float64 z
geometry_msgs/Quaternion rotation
float64 x
float64 y
flaot64 z
float64 w
```
如上,一個TransformStamped數組就是一個TF tree。
- 前言
- 第一章 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