TF介绍(一)
TF:机器人不停部位之间的坐标转换。坐标转换包括位置和姿态两方面,ROS中的tf是一个让用户随时记录多个坐标系的软件包。tf保持缓存的树形结构中的坐标系之间的关系,并允许用户在任何期望的时间点在任何两个坐标系之间转换点、矢量等。
tf可以被当做是一种标准规范,定义了坐标转换的数据格式和数据结构。tf本质是树状的数据结构(通常称之为tf tree),可以看成是一个topic:/tf,message保存的是tf tree的数据结构格式,维护了整个机器人(甚至是地图)的坐标转换关系。也可以看做package,包含了很多工具,比如可视化、查看关节的tf、debug tf等。tf含有一部分的接口(rospy、roscpp关于tf的API),可看成话题转换的标准、话题、工具、接口。
ROS中机器人包含大量部件,称之为link,每一个link上面对应这一个frame(即一个坐标)。许多frame错综复杂地铺在机器人的各个link上,tf tree维护各个坐标系之间的关系、联通。
TF树:
圆圈代表frame,对应机器人上的一个link,任意两个frame必须是联通的,若出现某一环节的断裂,就会error报错,故完整的tf tree不能有任何断层的地方。每两个frame之间都有一个broadcaster,为了令两个frame之间能正常连接,中间会有一个node来发布消息来broadcaster。如果没有node发布消息维护连通,那么两个frame之间的连接就会断掉。broadcaster是一个publisher,若两个frame之间发生了相对运动,broadcaster就会发布相关消息,broadcaster发布的消息就是TransformStampede.msg
TransformStampede.msg:
std_msgs/Header header
uint32 seq
time stamp
string frame_id
string child_frame_id
geometry_msgs/Transfrom transform
geometry_msgs/Vector3 translation
float64 x
float64 y
float64 z
geometry_msgs/Quaternion rotation
float64 x
float64 y
float64 z
float64 w
header定义了序号、时间和frame名称,又写了child_frame,这两个frame之间的坐标变换由geometry_msgs/Transform定义(Vector3三维向量表示平移,Quaternion四元数表示旋转)。
odom就是frame_id,base0link_footprint就是child_frame_id,向tf发送消息。很多个TransformStampede.msg向tf发送坐标变换信息,形成tf tree。
TF树的数据类型
TFtree是由很多frame之间的TF拼接而成,TF tree类型:
tf/tfMessage.msg
tf2_msgs/TFMessage.msg
这里TF的数据类型有两个,主要的原因是版本的迭代。
上面我们讲了,TF tree是由很多的frame之间TF拼接而成。那么TF tree是什么类型呢?如下:
tf/tfMessage.msg
tf2_msgs/TFMessage.msg
tf/tfMessage.msg或tf2_msgs/TFmesasge.msg准格式规范:
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
一个TransformStampede数组就是一个TF tree。