ROS学习笔记(5): TF(Transform)坐标转换和原理分析

  • Post author:
  • Post category:其他



目录


6 TF


6.1 TF/TF tree格式规范


6.2 TF相关工具命令


6.3 TF原理


6.3.1 ROS坐标系


6.3.2 坐标系分类


6.3.3  setup Robot TF



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轴正旋转 是 逆时针旋转

  1. 绕 Z轴 旋转,称之为 航向角,使用yaw表示;
  2. 绕 X轴 旋转,称之为 横滚角,使用roll表示;
  3. 绕 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 坐标系分类

一个机器人系统中通常会有多个三维参考坐标系,而且这些坐标系之间的相对关系随时间推移会变化。这里举一个实际的机器人应用场景例子,来说明这种关系和变化

  1. 全局世界坐标系:通常为激光slam构建出来的栅格地图的坐标系map。
  2. 机器人底盘坐标系:通常为机器人底盘的坐标系base_footprint或者base_link。
  3. 机器人上各部件自己的坐标系:比如激光雷达、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


http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF


https://www.ros.org/reps/rep-0105.html



版权声明:本文为lclfans1983原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。