ROS TF坐标变换 - TF树

目录

  • 一、TF树介绍
  • 二、TF2与TF
  • 三、构建TF树
  • 四、rviz查看TF坐标关系

一、TF树介绍

在机器人系统中,存在运动学模型和动力学模型。对于刚体机器人,动力学模型基于刚体动力学,代表机器人系统在运动过程中力/力矩与其运动状态的变化关系。而运动学模型则由一系列固连在不同位置的坐标系来表示,仅仅代表机器人的运动状态。例如,对于多自由度机械臂,其运动学模型为末端位置到各个关节角的坐标变换关系;对于旋翼无人机,主要的运动学关系是机体固连坐标系与世界坐标系之间的变换。

TF树在ROS中的作用就是对应于这些不同位置固连坐标系之间的变换关系,以显示机器人的运动状态。TF树的广播器和监听器的基本书写形式可以通过实际例子进行分析,从中可以展示如何提取和应用TF变换的信息。总的来说,TF树是ROS中非常重要的一部分,它维护了整个机器人甚至地图的坐标转换关系。

对于一个完整的机器人来说,会有很多个坐标系,如下图:

ROS TF坐标变换 - TF树_第1张图片

每广播一个坐标关系,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(也可以直接双击打开文档)

ROS TF坐标变换 - TF树_第2张图片

可以发现,我们发布了两组坐标关系bask_link -> laserworld -> turtle1base_linkworld 的坐标关系没有发布,所以有两棵TF树,现在我们发布base_linkworld 的坐标关系来看看效果。

ROS为我们封装了单次发布坐标关系的节点,使用方法如下:

rosrun tf2_ros static_transform_publisher param0 param1 param2 param3 param4 param5 param6 param7
后面有8个参数,依次表示:
x偏移量 y偏移量 z偏移量 z偏航角度 y俯仰角度 x翻滚角度 父级坐标系 子级坐标系

我们发布 base_linkworld 的坐标关系:

位置偏移量为:(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树如下:

ROS TF坐标变换 - TF树_第3张图片

四、rviz查看TF坐标关系

  • 输入命令:rviz
  • 在启动的 rviz 中设置 Fixed Frame 为 world
  • 点击左下的 Add 按钮,在弹出的窗口中选择 TF 组件,即可显示坐标关系。

如下:

ROS TF坐标变换 - TF树_第4张图片

你可能感兴趣的:(ROS,ROS,机器人,TF2,TF树,坐标变换,tf2_tools,view_frames)