目录
- 一、TF树介绍
- 二、TF2与TF
- 三、构建TF树
- 四、rviz查看TF坐标关系
一、TF树介绍
在机器人系统中,存在运动学模型和动力学模型。对于刚体机器人,动力学模型基于刚体动力学,代表机器人系统在运动过程中力/力矩与其运动状态的变化关系。而运动学模型则由一系列固连在不同位置的坐标系来表示,仅仅代表机器人的运动状态。例如,对于多自由度机械臂,其运动学模型为末端位置到各个关节角的坐标变换关系;对于旋翼无人机,主要的运动学关系是机体固连坐标系与世界坐标系之间的变换。
TF树在ROS中的作用就是对应于这些不同位置固连坐标系之间的变换关系,以显示机器人的运动状态。TF树的广播器和监听器的基本书写形式可以通过实际例子进行分析,从中可以展示如何提取和应用TF变换的信息。总的来说,TF树是ROS中非常重要的一部分,它维护了整个机器人甚至地图的坐标转换关系。
对于一个完整的机器人来说,会有很多个坐标系,如下图:
每广播一个坐标关系,ROS都会把他加入到一个列表中维护起来,这个列表就是TF树。
TF树是ROS中管理坐标系变换关系的一种数据结构,它对应于机器人不同位置固连坐标系之间的变换关系,以显示机器人的运动状态。TF的本质是一个树状的数据结构,所以被称为TF树。
此外,TF库也是ROS中的一个重要组成部分,它允许用户随时记录并管理多个坐标系之间的变换关系。tf库维护了坐标系之间的关系,并在时间上缓冲这种关系,使用户能够在任何所需的时间点在任何两个坐标系之间转换点、向量等。
二、TF2与TF
TF主要用于机器人在不同坐标系下的运动和感知的控制和导航等任务。然而,TF2已经取代了TF,并且是TF的超集。因此,对于新用户来说,建议学习TF2而非TF。
在行为和API方面,TF1.x和TF2有根本区别。这些区别主要体现在执行方式(TF2中的Eager Execution)、变量、控制流、张量形状和张量相等性比较上,TF2使用了一组不同的运行时。此外,TF2增强了内聚性,不同类型的API实现做了分包处理。具体来说,TF对应的是tf包,而TF2对应的是tf2和tf2_ros包。
在实现效率上,TF2也更胜一筹。例如,在Tensorflow 1.x中,图执行模式主要通过“直接构建计算图 + tf.Session"进行操作。而在TF2中,这种操作方式得到了优化。总的来说,TF2在功能上比TF更为强大和高效。
三、构建TF树
使用以下命令可以把TF树保存为pdf文档(如果没有安装 tf2_tools
需要先安装 sudo apt install ros-noetic-tf2-tools
):
rosrun tf2_tools view_frames.py
执行后会打印入下日志:
[INFO] [1704000786.800796]: Listening to tf data during 5 seconds...
[INFO] [1704000791.808397]: Generating graph in frames.pdf file...
实验步骤:
- 运行前文编译的静态坐标转换节点:
rosrun tf2_learning tf2_learning_broadcast
- 运行前文编译的动态坐标转换节点:
rosrun tf2_learning tf2_learning_dynamic_broadcast
- 启动小乌龟,发布小乌龟的世界坐标位姿:
rosrun turtlesim turtlesim_node
- 保存TF树pdf文档:
rosrun tf2_tools view_frames.py
- 查看pdf文档:
evince frames.pdf
(也可以直接双击打开文档)
可以发现,我们发布了两组坐标关系bask_link -> laser
和 world -> turtle1
,base_link
与 world
的坐标关系没有发布,所以有两棵TF树,现在我们发布base_link
与 world
的坐标关系来看看效果。
ROS为我们封装了单次发布坐标关系的节点,使用方法如下:
rosrun tf2_ros static_transform_publisher param0 param1 param2 param3 param4 param5 param6 param7
后面有8个参数,依次表示:
x偏移量 y偏移量 z偏移量 z偏航角度 y俯仰角度 x翻滚角度 父级坐标系 子级坐标系
我们发布 base_link
与 world
的坐标关系:
位置偏移量为:(0.5, 0.8, 0)
旋转偏移量为:(1.57, 0.0, 0.0) 角度单位为弧度
所以命令如下:
rosrun tf2_ros static_transform_publisher 0.5 0.8 0 0 0 1.5 /world /base_link
查看TF树如下:
四、rviz查看TF坐标关系
- 输入命令:rviz
- 在启动的 rviz 中设置 Fixed Frame 为 world
- 点击左下的 Add 按钮,在弹出的窗口中选择 TF 组件,即可显示坐标关系。
如下: