Skip to content

TF2 入门

目标: 运行一个 turtlesim 示例,并通过一个基于 turtlesim 的多机器人示例来体验 tf2 的强大功能。

教程级别: 中级

预计用时: 10 分钟

首先,安装示例功能包及其依赖项。

Ubuntu 软件包

Terminal window
$ sudo apt-get install ros-{DISTRO}-rviz2 ros-{DISTRO}-turtle-tf2-py ros-{DISTRO}-tf2-ros ros-{DISTRO}-tf2-tools ros-{DISTRO}-turtlesim

RHEL 软件包

Terminal window
$ sudo dnf install ros-{DISTRO}-rviz2 ros-{DISTRO}-turtle-tf2-py ros-{DISTRO}-tf2-ros ros-{DISTRO}-tf2-tools ros-{DISTRO}-turtlesim

从源码编译

Terminal window
$ git clone https://github.com/ros/geometry_tutorials.git -b ros2

现在已经安装了 turtle_tf2_py 教程功能包,接下来运行这个示例。

首先,打开一个新的终端并 source 你的 ROS 2 安装环境,以便 ros2 命令可以正常使用。

然后运行以下命令:

Terminal window
$ ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py

你将看到 turtlesim 启动并显示两只乌龟。

turtlesim 跟随示例 1

在第二个终端窗口中输入以下命令:

Terminal window
$ ros2 run turtlesim turtle_teleop_key

turtlesim 启动后,你可以使用键盘方向键驱动中央的乌龟移动。请确保选中第二个终端窗口,这样才能正确捕获按键。

turtlesim 跟随示例 2

你可以看到其中一只乌龟会不断移动,跟随你正在驱动的乌龟。

这个示例使用 tf2 库创建了三个坐标系:一个 world 坐标系、一个 turtle1 坐标系和一个 turtle2 坐标系。

本教程使用一个 tf2 broadcaster(广播器)来发布乌龟的坐标系,并使用一个 tf2 listener(监听器)来计算两个乌龟坐标系之间的相对位姿差,据此控制一只乌龟跟随另一只乌龟。

接下来看看 tf2 是如何创建这个示例的。

我们可以使用 tf2_tools 来查看 tf2 在幕后做了什么。

view_frames 会创建一个图表,展示 tf2 通过 ROS 广播的所有坐标系。

请注意,此工具仅在 Linux 上可用。如果你使用的是 Windows,请跳到下面的”使用 tf2_echo”部分。

Terminal window
$ ros2 run tf2_tools view_frames
Listening to tf data during 5 seconds...
Generating graph in frames.pdf file...

view_frames 内部的 tf2 listener(监听器)会监听通过 ROS 广播的坐标系,并绘制出坐标系之间连接关系的树状图。

要查看这棵树,请用你喜欢的 PDF 查看器打开生成的 frames.pdf 文件。

turtlesim 坐标系

在这里我们可以看到 tf2 广播的三个坐标系:world、turtle1 和 turtle2。

world 坐标系是 turtle1 和 turtle2 坐标系的父坐标系。

view_frames 还会报告一些诊断信息,包括最早和最近的坐标变换的接收时间,以及坐标系的发布频率。这些信息可用于调试。

tf2_echo 报告通过 ROS 广播的任意两个坐标系之间的变换。

用法:

Terminal window
$ ros2 run tf2_ros tf2_echo [source_frame] [target_frame]

我们来查看 turtle2 坐标系相对于 turtle1 坐标系的变换,等价于:

Terminal window
$ ros2 run tf2_ros tf2_echo turtle2 turtle1
At time 1683385337.850619099
- Translation: [2.157, 0.901, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.172, 0.985]
- Rotation: in RPY (radian) [0.000, -0.000, 0.345]
- Rotation: in RPY (degree) [0.000, -0.000, 19.760]
- Matrix:
0.941 -0.338 0.000 2.157
0.338 0.941 0.000 0.901
0.000 0.000 1.000 0.000
0.000 0.000 0.000 1.000
At time 1683385338.841997774
- Translation: [1.256, 0.216, 0.000]
- Rotation: in Quaternion [0.000, 0.000, -0.016, 1.000]
- Rotation: in RPY (radian) [0.000, 0.000, -0.032]
- Rotation: in RPY (degree) [0.000, 0.000, -1.839]
- Matrix:
0.999 0.032 0.000 1.256
-0.032 0.999 -0.000 0.216
-0.000 0.000 1.000 0.000
0.000 0.000 0.000 1.000

当 tf2_echo 的监听器接收到通过 ROS 2 广播的坐标系时,变换值会显示在终端中。

当你驱动乌龟移动时,随着两只乌龟相对位置的变化,你会看到变换值也随之改变。

rviz2 是一个可视化工具,非常适合用来检查 tf2 坐标系。

使用 rviz2 查看乌龟坐标系时,可以通过 -d 选项指定配置文件来启动它:

Linux

Terminal window
$ ros2 run rviz2 rviz2 -d $(ros2 pkg prefix --share turtle_tf2_py)/rviz/turtle_rviz.rviz

Windows

Terminal window
$ for /f "usebackq tokens=*" %a in (`ros2 pkg prefix --share turtle_tf2_py`) do rviz2 -d %a/rviz/turtle_rviz.rviz

turtlesim rviz

在侧边栏中你将看到 tf2 广播的坐标系。

当你驱动乌龟移动时,你会看到坐标系在 rviz 中也随之移动。