文章目录
简介
所谓TF(TransForm), 就是坐标转换,坐标变换包括了位置和姿态两个方面的变换, ROS中的tf是一个可以让用户随时记录多个坐标系的软件包。 tf保持缓存的树形结构中的坐标系之间的关系, 并且允许用户在任何期望的时间点在任何两个坐标系之间转换点, 矢量等。
tf的可以被当做是一种标准规范, 这套标准定义了坐标转换的数据格式和数据结构, tf本质是树状的数据结构,tf也可以看成是一个topic: /tf , 话题中的message保存的就是tf tree的数据结构格式. 维护了整个机器人的甚至是地图的坐标转换关系。
观察上图,可以看到ROS数据结构的一个抽象图, ROS中机器人模型包含大量的部件,这些部件统称之为link,每一个link上面对应着一个frame, 即一个坐标系, link和frame概念是绑定在一起的,像上图可以看到又很多的frame,错综复杂的铺置在机器人的各个link上, 维护各个坐标系之间的关系, 就要靠着tf tree来处理。
每两个frame之间都会有一个Node来发布消息来broadcaster,来发布消息维系坐标转换,进而维护着各个坐标系之间的联通。
TF消息
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
许多的TransformStamped.msg发向tf, 形成了TF树
TF树的数据类型
TF tree是由很多的frame之间TF拼接而成
- tf/tfMessage.msg
- tf2_msgs/TFMessage.msg
TF的数据类型有两个, 主要的原因是版本的迭代。 自ROS Hydro以来, tf第一代已被“弃
用”, 转而支持tf2。 tf2相比tf更加简单高效
使用命令 rostopic info /tf 查看tf版本
格式定义
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
一个TransformStamped数组就是一个TF tree。
tf in c++
TF不仅仅是一个标准、 话题, 它还是一个接口。
数据类型
C++中给我们提供了很多TF的数据类型,如下:
tf::StampedTransform只能用在C++里, 只是C++的一个类, 一种数据格式, 并不是一个消息。而geometry_msgs/TransformStamped.msg是一个message,它依赖于ROS, 与语言无关,
数据转换
TF里有可能会遇到各种各样数据的转换, 常见的四元数、 旋转矩阵、 欧拉角这三种数据之间的转换
定义空间点和空间向量
//计算两个向量的点积
tfScalar::tfDot(const Vector3 &v1, const Vector3 &v2)
//计算向量的模
tfScalar length()
//求与已知向量同方向的单位向量
Vector3 &normalize()
//计算两个向量的夹角
tfScalar::tfAngle(const Vector3 &v1, const Vector3 &v2)
//计算两个向量的距离
tfScale::tfDistance(const Vector3 &v1, const Vector3 &v2)
//计算两个向量的乘积
tfScale::tfCross(const Vector3 &v1,const Vector3 &v2)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
定义四元数
//由欧拉角计算四元数
setRPY(const tfScalar& yaw, const stScalar &pitch, const tfScalar &roll)
//由四元数得到旋转轴
Vector3 getAxis