目录
6 TF
TF是ROS里的一个基本的也是很重要的概念, TF(TransForm),就是坐标转换.
tf本质是树状的数据结构,所以我们通常称之为”tf tree”, tf也可以看成是一个topic: /tf ,话题中的message保存的就是tf tree的数据结构格式.维护了整个机器人的甚至是地图的坐标转换关系.
6.1 TF/TF tree格式规范
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四元数表示旋转.
最终,许多的TransformStamped.msg发向tf,形成了TF树。
TF tree是由很多的frame之间TF拼接而成。那么TF tree是什么类型呢?如下:
- tf/tfMessage.msg
- tf2_msgs/TFMessage.msg
这里TF的数据类型有两个,主要的原因是版本的迭代。自ROS Hydro以来,tf第一代已被“弃用”,转而支持tf2。
如何查看自己使用的TF是哪一个版本,使用命令 rostopic info /tf 即可。
tf/tfMessage.msg或tf2_msgs/TFMessage标准格式规范如下:
geometry_msgs/TransformStamped[] transforms
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
一个TransformStamped数组就是一个TF tree。
6.2 TF相关工具命令
- 根据当前的tf树创建一个pdf图:
$ rosrun tf view_frames
这个工具首先订阅 /tf ,订阅5秒钟,根据这段时间接受到的tf信息,绘制成一张tf tree,然后创建成一个pdf图。
- 查看当前的tf树:
$ rosrun rqt_tf_tree rqt_tf_tree
该命令同样是查询tf tree的,但是与第一个命令的区别是该命令是动态的查询当前的tf tree,当前的任何变化都能当即看到,例如何时断开何时连接,捕捉到这些然后通过rqt插件显示出来。
- 查看两个frame之间的变换关系:
$ rosrun tf tf_echo[reference_frame][target_frame]
6.3 TF原理
6.3.1 ROS坐标系
- ROS的坐标系统使用 右手定义 :
所以,对于 ROS 机器人,如果以它为坐标系的原心,那么:
-
x轴:前方
-
y轴:左方
-
z轴:上方
- 在一个绕轴线上的旋转,也使用 右手定义:
用右手握住坐标轴,大拇指 的方向朝着坐标轴朝向的正方向,四指环绕的方向定义沿着这个坐标轴旋转的正方向
根据右手定义,围绕 z轴正旋转 是 逆时针旋转
- 绕 Z轴 旋转,称之为 航向角,使用yaw表示;
- 绕 X轴 旋转,称之为 横滚角,使用roll表示;
- 绕 Y轴 旋转,称之为 俯仰角,使用pitch表示;
举例:
我们通常用来表述小车运动的二维平面指的是 X-Y平面,也就是X轴和Y轴组成的平面,在这个平面中,用来描述 小车转弯的角就是绕Z轴的旋转,也就是经常说的航向角。Z轴朝上,所以按照右手法则可以知道小车向 左转为正,右转为负。
- 坐标系定义
空间中的同一位置,在不同坐标系下,其坐标值也不相同。
在上图中,有两个坐标系,分别为坐标系A和坐标系B,其中 橘红色坐标轴表示X轴(朝前),蓝色坐标轴表示Y轴(朝左)。对于坐标系A中,粉色的圆点的坐标为**(3, -3),对于坐标系B中,粉色的圆点的坐标为(5, 1)**
- 测量单位:
ROS使用公制 :
> 线速度:m/s
> 角速度:rad/s
线速度=0.5m/s 对于一个室内机器人来说是一个相当快的速度了。角速度=1.0rad/s 就是旋转一圈6秒钟。
Refer to:
https://www.cnblogs.com/hiram-zhang/p/10392877.html
https://blog.csdn.net/shixiaolu63/article/details/78496457
https://blog.csdn.net/autolabor/article/details/85120806
6.3.2 坐标系分类
一个机器人系统中通常会有多个三维参考坐标系,而且这些坐标系之间的相对关系随时间推移会变化。这里举一个实际的机器人应用场景例子,来说明这种关系和变化
- 全局世界坐标系:通常为激光slam构建出来的栅格地图的坐标系map。
- 机器人底盘坐标系:通常为机器人底盘的坐标系base_footprint或者base_link。
- 机器人上各部件自己的坐标系:比如激光雷达、imu等传感器自己的坐标系base_laser_link、imu_link。
这些坐标系之间的关系有些是静态的、有些是动态的。当机器人底盘移动的过程中,机器人底盘与世界的相对关系map->base_footprint是动态的;
而安装在机器人底盘上的激光雷达、imu这些传感器与机器人底盘的相对关系base_footprint->base_laser_link、base_footprint->imu_link是静态的。
6.3.3 setup Robot TF