tf2 介绍
Kong Liangqian Lv6

目标

运行turtlesim演示版本,并在使用turtlesim的多机器人示例中看到tf2强大的功能。

安装demo

1
2
3
4
sudo apt install 
ros-galactic-turtle-tf2-py
ros-galactic-tf2-tools
ros-galactic-tf-transformations

还需要额外的安装transforms3d这个python包,它提供了tf_transformations功能包中所需要的四元数和欧拉角之间的转换功能

1
pip3 install transforms3d

跑demo

现在我们已经安装了turtle_tf2_py这个功能包。首先打开一个终端,source 对应的ROS2版本,输入

1
ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py

你会看见两只乌龟

../../_images/turtlesim_follow1.png

打开另外一个终端,输入

1
ros2 run turtlesim turtle_teleop_key

启动后,选择可以按下方向键,观察乌龟的运动情况,第二只乌龟是自动跟随第一只乌龟

../../_images/turtlesim_follow2.png

到底发生了什么

这个案例使用了tf2库建立了三个坐标系:world frame,turtle1 frame和 turtle2 frame。在这个教程中,我们使用了tf2 broadcaster 发布了turtle坐标系,并且使用tf2 listener 来计算turtle坐标系的差,然后前进。

tf2_tools

下面我们可以通过tf2_tools 来查看tf2是如何运作的

使用view_frames

1
ros2 run tf2_tools view_frames

在这里,tf2监听器正在监听通过ROS的frame,并绘制了一棵关于frame如何连接的树。要查看树状图,请使用您喜爱的PDF查看器打开生成的frames.pdf。

../../_images/turtlesim_frames.png

我们可以看见有三个坐标系被tf2广播出来,world 是 turtle1和turtle2的父节点,还可以看见tf2发布的频率,最早,最晚发布的时间等信息。

使用tf2_echo

tf2_echo 可以打印出任何两个frame的关系

1
ros2 run tf2_ros tf2_echo [reference_frame] [target_frame]

下面我们查看一下turtle2 相对于 turtle1 的坐标变换,等价于下面的命令

1
ros2 run tf2_ros tf2_echo turtle2 turtle1

应该可以看见如下内容

1
2
3
4
5
6
At time 1622031731.625364060
- Translation: [2.796, 1.039, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.202, 0.979]
At time 1622031732.614745114
- Translation: [1.608, 0.250, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 0.032, 0.999]

tf2 和 rviz

rviz是一个可视化的工具,我们可以通过rviz来查看这俩小乌龟,通过加载rviz文件参数打开rviz

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

../../_images/turtlesim_rviz1.png

在这里你会看见tf2发布出来的frame,按下方向键依然也可以看见移动的frame。

 Comments