[ROS 系列学习教程] TF坐标变换 - TF树

在这里插入图片描述

ROS 系列学习教程(总目录)

一、TF树介绍

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

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

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

在这里插入图片描述

每广播一个坐标关系,ROS都会把他加入到一个列表中维护起来,这个列表就是TF树。
TF树是ROS中管理坐标系变换关系的一种数据结构,它对应于机器人不同位置固连坐标系之间的变换关系,以显示机器人的运动状态。TF的本质是一个树状的数据结构,所以被称为TF树。

此外,TF库也是ROS中的一个重要组成部分,它允许用户随时记录并管理多个坐标系之间的变换关系。tf库维护了坐标系之间的关系,并在时间上缓冲这种关系,使用户能够在任何所需的时间点在任何两个坐标系之间转换点、向量等。

二、TF2与TF

TF主要用于机器人在不同坐标系下的运动和感知的控制和导航等任务。然而,TF2已经取代了TF,并且是TF的超集。因此,对于新用户来说,建议学习TF2而非TF。

在ROS中,tf 和 tf2 是两个不同的库,它们用于跟踪多个坐标帧之间的变换关系。以下是 tf 和 tf2 之间的主要区别:

时间戳

tf:tf库使用一个固定的时间窗口(通常是一秒钟)来存储坐标变换信息,这意味着你可以查询过去或未来的坐标变换,但范围有限。
tf2:tf2库可以查询任意时间点的坐标变换,因为它使用时间戳来存储变换信息。

API设计

tf:tf的API设计相对简单,但在某些方面可能不够灵活。
tf2:tf2的API设计更加现代化,提供了更多的功能和灵活性,例如可以处理非线性变换。

数据结构

tf:tf使用Transform和StampedTransform数据结构来存储坐标变换信息。
tf2:tf2使用Transform、StampedTransform和TimePoint数据结构,提供了更丰富的时间相关功能。

缓冲机制

tf:tf有一个缓冲区(Buffer),用于存储坐标变换信息。
tf2:tf2有两个缓冲区:BufferCore和Buffer。BufferCore是一个轻量级的缓冲区,只存储变换信息;而Buffer是一个更高级的缓冲区,提供了额外的功能,如时间缓存和回调机制。

消息类型

tf:tf使用tf::Transform和tf::StampedTransform消息类型。
tf2:tf2使用geometry_msgs::TransformStamped消息类型。

性能

tf2相较于tf在性能上有所提升,尤其是在处理大量坐标帧和变换时。

功能

tf2提供了一些tf没有的新功能,例如对加速度和速度的跟踪。

总的来说,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 -> 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树如下:

在这里插入图片描述

四、rviz查看TF坐标关系

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

如下:

在这里插入图片描述

  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万俟淋曦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值