前言
在上一篇文章当中我们已经用到了tf2,虽然有点懵,但所幸我们从这篇起将正式开始学习tf2,让它没有秘密可言。
动动手
我们依然是拿小海龟作为案例,简简单单走一遍流程,熟悉一下。
安装例子
安装例子及其依赖项。
$sudo apt-get install ros-iron-rviz2 ros-iron-turtle-tf2-py ros-iron-tf2-ros ros-iron-tf2-tools ros-iron-turtlesim
运行例子
我们新起一个终端,首先source下安装环境以使系统能认识ROS 2的命令,接着执行下面的命令运行turtle_tf2_py包:
$ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py
有两只海龟,其中左下角的那只会游到中间的那只所在的位置(目前大家看到的),我们再来打开一个终端来控制第一只海龟:
$ros2 run turtlesim turtle_teleop_key
第二只海龟会跟着第一只的步伐,亦步亦趋(我这截图有点不大明显,两只海龟长成一样的了)。
发生什么了
这个例子使用了tf2库来创建三个坐标系:一个世界坐标系,一个turtle1坐标系,以及一个turtle2坐标系。这个教程使用了tf2广播器来发布turtle的坐标系,并使用tf2监听器来计算turtle系之间的差异,并移动其中一个turtle来跟随另一个。
tf2工具
现在,我们来看看tf2是如何被用来创建这个例子的。我们可以使用tf2_tools来查看tf2在幕后是如何工作的(记住不要关掉上面正在运行的例子)。
使用view_frames
view_frames会创建一个由tf2在ROS上广播的坐标系的图表。请注意,这个工具只在Linux上工作;如果你使用的是Windows,请跳过以下部分,直接查看“使用tf2_echo”。
执行下面的命令:
$ros2 run tf2_tools view_frames
在这里,一个tf2监听器正在监听通过ROS广播的坐标系,并绘制一个坐标系如何连接的树状图。我们来打开frames.pdf文件(执行上面命令的当前路径下)。
从上,我们可以看到tf2广播的三个坐标系:world、turtle1和turtle2。world坐标系是turtle1和turtle2坐标系的父坐标系。view_frames还报告了一些诊断信息,包括何时接收到最旧和最新的坐标系变换,以及为了调试目的,tf2框架发布到tf2的速度有多快。
使用tf2_echo
tf2_echo报告了通过ROS广播的任何两个坐标系之间的变换。
一般语法为:
$ros2 run tf2_ros tf2_echo [source_frame] [target_frame]
我们来试试看看turtle2到turtle1之间的坐标转换是怎样的。
$ros2 run tf2_ros tf2_echo turtle2 turtle1
当我们通过键盘控制turtle1移动时,这上面的转换关系数据也会跟着变动。
rviz2和tf2
rviz2是一个可视化工具,用于检查tf2坐标系很有用。让我们使用rviz2通过配置文件使用-d选项来查看我们的turtle坐标系:
$ros2 run rviz2 rviz2 -d $(ros2 pkg prefix --share turtle_tf2_py)/rviz/turtle_rviz.rviz
在上一篇中我们也已经演示了,在侧边栏中,将看到由tf2广播的坐标系。当我们控制turtle移动时,我们会看到坐标系在rviz中移动(右侧区域红绿蓝坐标系部分)。