TF2 入门
目标: 运行一个 turtlesim 示例,并通过一个基于 turtlesim 的多机器人示例来体验 tf2 的强大功能。
教程级别: 中级
预计用时: 10 分钟
首先,安装示例功能包及其依赖项。
Ubuntu 软件包
$ sudo apt-get install ros-{DISTRO}-rviz2 ros-{DISTRO}-turtle-tf2-py ros-{DISTRO}-tf2-ros ros-{DISTRO}-tf2-tools ros-{DISTRO}-turtlesimRHEL 软件包
$ sudo dnf install ros-{DISTRO}-rviz2 ros-{DISTRO}-turtle-tf2-py ros-{DISTRO}-tf2-ros ros-{DISTRO}-tf2-tools ros-{DISTRO}-turtlesim从源码编译
$ git clone https://github.com/ros/geometry_tutorials.git -b ros2现在已经安装了 turtle_tf2_py 教程功能包,接下来运行这个示例。
首先,打开一个新的终端并 source 你的 ROS 2 安装环境,以便 ros2 命令可以正常使用。
然后运行以下命令:
$ ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py你将看到 turtlesim 启动并显示两只乌龟。

在第二个终端窗口中输入以下命令:
$ ros2 run turtlesim turtle_teleop_keyturtlesim 启动后,你可以使用键盘方向键驱动中央的乌龟移动。请确保选中第二个终端窗口,这样才能正确捕获按键。

你可以看到其中一只乌龟会不断移动,跟随你正在驱动的乌龟。
发生了什么?
Section titled “发生了什么?”这个示例使用 tf2 库创建了三个坐标系:一个 world 坐标系、一个 turtle1 坐标系和一个 turtle2 坐标系。
本教程使用一个 tf2 broadcaster(广播器)来发布乌龟的坐标系,并使用一个 tf2 listener(监听器)来计算两个乌龟坐标系之间的相对位姿差,据此控制一只乌龟跟随另一只乌龟。
tf2 工具
Section titled “tf2 工具”接下来看看 tf2 是如何创建这个示例的。
我们可以使用 tf2_tools 来查看 tf2 在幕后做了什么。
1 使用 view_frames
Section titled “1 使用 view_frames”view_frames 会创建一个图表,展示 tf2 通过 ROS 广播的所有坐标系。
请注意,此工具仅在 Linux 上可用。如果你使用的是 Windows,请跳到下面的”使用 tf2_echo”部分。
$ ros2 run tf2_tools view_framesListening to tf data during 5 seconds...Generating graph in frames.pdf file...view_frames 内部的 tf2 listener(监听器)会监听通过 ROS 广播的坐标系,并绘制出坐标系之间连接关系的树状图。
要查看这棵树,请用你喜欢的 PDF 查看器打开生成的 frames.pdf 文件。

在这里我们可以看到 tf2 广播的三个坐标系:world、turtle1 和 turtle2。
world 坐标系是 turtle1 和 turtle2 坐标系的父坐标系。
view_frames 还会报告一些诊断信息,包括最早和最近的坐标变换的接收时间,以及坐标系的发布频率。这些信息可用于调试。
2 使用 tf2_echo
Section titled “2 使用 tf2_echo”tf2_echo 报告通过 ROS 广播的任意两个坐标系之间的变换。
用法:
$ ros2 run tf2_ros tf2_echo [source_frame] [target_frame]我们来查看 turtle2 坐标系相对于 turtle1 坐标系的变换,等价于:
$ ros2 run tf2_ros tf2_echo turtle2 turtle1At 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.000At 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
Section titled “rviz2 与 tf2”rviz2 是一个可视化工具,非常适合用来检查 tf2 坐标系。
使用 rviz2 查看乌龟坐标系时,可以通过 -d 选项指定配置文件来启动它:
Linux
$ ros2 run rviz2 rviz2 -d $(ros2 pkg prefix --share turtle_tf2_py)/rviz/turtle_rviz.rvizWindows
$ for /f "usebackq tokens=*" %a in (`ros2 pkg prefix --share turtle_tf2_py`) do rviz2 -d %a/rviz/turtle_rviz.rviz
在侧边栏中你将看到 tf2 广播的坐标系。
当你驱动乌龟移动时,你会看到坐标系在 rviz 中也随之移动。