坐标变换是机器人中重要的基础功能,ROS1中提供了tf作为坐标变换库,在ROS2中依然沿用,使用方法类似,今天我们就来试一试ROS2中的坐标变化系统tf2。

一、小海龟跟随例程

和ROS1一样,ROS2中依然使用了两只海龟跟随的例程,可以使用如下命令安装:
sudo apt-get install ros-foxy-turtle-tf2-py ros-foxy-tf2-tools
此外,还需要安装一个transforms3d的python库,提供四元数与欧拉角的转换功能。
接下来就可以运行例程包turtle_tf2_py了:
ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py
很快就可以看到两只海龟的仿真界面。
启动另外一个终端,运行键盘控制节点:
ros2 run turtlesim turtle_teleop_key
通过键盘控制一只海龟运动,就可以看到另外一只海龟会自动跟随第一只海龟了。
这个例程使用tf2创建了三个坐标系:world、turtle1、turtle2,然后通过一个广播节点发布海龟坐标系与world坐标系之间的关系,另外一个监听节点计算turtle1、turtle2之间的位姿偏差,然后计算生成速度指令,控制海龟跟随运动。

二、tf2调试工具

接下来我们可以通过tf2提供的调试工具,进一步揭秘海龟跟随的秘密。

2.1 坐标系可视化工具view_frames

view_frames可以针对目前正在运行的ROS系统,创建一个完整坐标系的可视化图。比如我们要显示小海龟跟随系统背后的所有tf关系,就可以这样:
ros2 run tf2_tools view_frames
终端中可以看到tf2正在监听5s之内的所有坐标变换,然后创建成一张图。
Listening to tf data during 5 seconds...
Generating graph in frames.pdf file...
5s之后,就可以看到在终端所在的路径下,产生了一个frames.pdf的文件,打开之后就可以看到:
从图中可以看到三个坐标系,world、turtle1、turtle2,其中世界坐标系world是两个海龟坐标系的父坐标系,同时表格中还有广播者、频率、时间戳等信息,可以用于调试。

2.2 坐标系查询工具tf2_echo

tf2_echo工具可以查询ROS系统中任意两个坐标系之间的关系。比如我们想知道turtle2坐标系相对于turtle1坐标系的位置关系,就可以通过如下命令查询:
ros2 run tf2_ros tf2_echo turtle2 turtle1
很快终端中就可以看到查询结果的周期刷新了。
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]
如果此时我们键盘控制海龟运动的话,也可以看到查询结果中的数据会动态更新。

2.3 rviz

rviz作为ROS中强大的可视化工具,坐标系的显示自然也不在话下,这里我们可以直接使用例程中已经设置好的rvz配置文件:
ros2 run rviz2 rviz2 -d $(ros2 pkg prefix --share turtle_tf2_py)/rviz/turtle_rviz.rviz
在rviz的显示区域,就可以看到turtle1、turtle2和world坐标系之间的位置关系了,坐标系的原点通过三色轴表示,坐标系之间的关系通过连接线表示,如果海龟跟随运动的话,rviz中的坐标系也会跟随更新。
本篇我们先一起通过海龟跟随示例初步了解ROS2中tf2的功能,后续还会继续深入学习。