Tf2

概述

tf2 是一个变换库,它允许用户随时间跟踪多个坐标系。tf2 在时间上维护坐标系之间的关系,以树状结构缓存,并允许用户在任意时间点之间转换点、向量等等。

../../_images/ros2_tf2_frames.png

tf2 的特性

一个机器人系统通常有许多随时间变化的 3D 坐标系,例如世界坐标系、基准坐标系、夹爪坐标系、头部坐标系等等。tf2 能够随时间跟踪所有这些坐标系,并允许你提出如下问题:

  • 头部坐标系相对于世界坐标系在 5 秒前的位置在哪里?

  • 我的基准坐标系中物体的姿态相对于我的夹爪是什么?

  • 地图坐标系中基准坐标系的当前姿态是什么?

tf2 可以在分布式系统中运行。这意味着机器人的所有坐标框架信息都可以在系统中的任何计算机上的所有 ROS 2 组件中获得。tf2 可以使您分布式系统中的每个组件构建自己的变换信息数据库,也可以有一个中央节点来收集和存储所有的变换信息。

教程

我们创建了一系列的:doc:教程,逐步介绍了如何使用tf2。您可以从:doc:`tf2简介 <../../Tutorials/Intermediate/Tf2/Introduction-To-Tf2>`教程开始。要查看所有tf2和tf2相关教程的完整列表,请查看:doc:`教程 <../../Tutorials/Intermediate/Tf2/Tf2-Main>`页面。

使用 tf2,基本上有两个主要任务,一个是监听变换,一个是广播变换。

如果您想要使用tf2在坐标系之间进行转换,您的节点将需要监听转换。您将接收并缓存系统中广播的所有坐标系,并查询特定坐标系之间的转换。请查看"编写监听器"教程 (Python) :doc:`(C++) <../../Tutorials/Intermediate/Tf2/Writing-A-Tf2-Listener-Cpp>`以获取更多信息。

要扩展机器人的功能,您需要开始广播变换。广播变换意味着将坐标系的相对姿态发送到系统的其他部分。一个系统可以有许多广播者,每个广播者都提供有关机器人不同部分的信息。查看"编写广播者"教程 (Python) :doc:`(C++) <../../Tutorials/Intermediate/Tf2/Writing-A-Tf2-Broadcaster-Cpp>`以获取更多信息。

此外,tf2可以广播静态变换,这些变换随时间不变。这主要节省了存储和查找时间,同时也减少了发布开销。您应该注意,静态变换只会发布一次,假定不会更改,因此不会存储历史记录。如果您想在tf2树中定义静态变换,请查看"编写静态广播者"教程 (Python) (C++)

您还可以在"添加坐标系"教程 (Python) :doc:`(C++) <../../Tutorials/Intermediate/Tf2/Adding-A-Frame-Cpp>`中了解如何将固定和动态坐标系添加到tf2树中。

完成基本教程后,您可以继续学习关于tf2和时间的知识。tf2和时间教程 (Python) (C++) :doc:`(C++) <../../Tutorials/Intermediate/Tf2/Time-Travel-With-Tf2-Cpp>`教授了使用tf2进行时间旅行的原理。

论文

在2013年的TePRA会议上有一篇关于tf2的论文:tf:变换库