tf简介
一个机器人系统一个时间段通常有多个3D坐标系在变化,如世界全局坐标系,world frame, base frame, gripper frame(手臂/夹子坐标框架),head frame等。tf包能够一次性的跟踪这些所有的框架,并且允许我们询问类似于下述问题:
- 在5秒之前,头坐标框架相对于世界坐标框架在哪里?
- 机器人夹子上的物体相对于基座的位姿。
- 基座框架在地图框架中现在的位姿是什么?
tf能够在一个分布式系统上工作。这意味着关于机器人的坐标框架的所有信息都能够在任意电脑系统中所有的ROS组件使用。其没有一个转换信息的中央服务器。
一个小例子
下面我们通过一个小例子来对tf进行细致的了解。
首先是安装运行ROS小例子所需要的包,针对作者使用的melodic版本,命令如下:
$ sudo apt-get install ros-melodic-ros-tutorials ros-melodic-geometry-tutorials ros-melodic-rviz ros-melodic-rosbash ros-melodic-rqt-tf-tree
现在我们得到了turtle_tf tutorial 包,开始运行一个demo:
$ roslaunch turtle_tf turtle_tf_demo.launch
这可能提示我们出现了类似于下述的错误:
ImportError: dynamic module does not define module export function (PyInit__)
这主要是因为电脑中安装的Anaconda环境默认使用Python 3 而 ROS中默认使用Python2,导致Python版本不匹配。解决方案可以参考:Anaconda 与 ROS 冲突解决。
解决之后,我们执行命令可以看到启动了两个小乌龟,并且其中的一个小乌龟向另外一个小乌龟附近移动:
并且在启动之后,我们可以控制其中的一只小乌龟进行移动,另外一只小乌龟则会跟随移动。
解释
上述过程中展示了一个例子,其使用tf库来创建了三个坐标框架:一个世界坐标框架、一个turtle1框架和一个turtle2框架。此例子中使用一个tf broadcaster来广播turtle的坐标框架,以及一个tf listener来计算两个turtle坐标框架之间的不同,移动一个小乌龟来跟随另一个。
tf 工具
现在,我们使用tf中的工具来查看一下上述例子中是怎么创建tf的,看看tf在幕后做了什么:
使用view_frames
view_frames通过ROS tf 创建了一个框架的流程说明。
执行下述命令:
$ rosrun tf view_frames
我们可以看到下述结果:
Listening to /tf for 5.0 seconds Done Listening dot - graphviz version 2.40.1 (20161225.0304) Detected dot version 2.40 frames.pdf generated
这里,一个tf listener正在接听来自于ROS广播的框架,并且画出了一个树来说明这些框架之间是怎么联系的:
接着执行下述命令进行查看:
$ evince frames.pdf
注:Evince是Ubuntu和GNOME默认的文档阅读工具,它的设计极度简化。
可以看到如下所示的结果:
在这里我们能够看到tf广播了三个坐标框架,world,turtle1,以及turtle2。此外,我们还能够看到world是turtle1和turtle2框架的父亲。出于调试的目的,view_frames还能够报告一些何时接收到最旧或最近框架变换,以及tf框架发布到tf速度的诊断信息。
使用rqt_tf_tree
rqt_tf_tree是ROS广播的一个用于可视化坐标框架树的实时工具。我们可以简单的通过点击对话框左上方的 refresh 按钮来刷新 tf 树
用法如下:
rosrun rqt_tf_tree rqt_tf_tree
或者使用rqt &命令,然后在弹出的窗口的plugin中选取tf tree。
显示结果如下所示:
使用tf_echo
tf_echo报告了ROS任意两个框架广播之间的变换,用法如下:
rosrun tf tf_echo [reference_frame] [target_frame]
回到我们前述的例子中,turtle2坐标框架相对于turtle1坐标框架的变换等价于:turtle1坐标框架到世界坐标的转换 * 世界坐标到turtle2坐标框架的转换。
我们执行下述命令:
$ rosrun tf tf_echo turtle1 turtle2
我们可以看到tf_echo接听到ROS广播的坐标框架之间的变换类似如下述形式:
At time 1637390452.937 - Translation: [0.000, 0.000, 0.000] - Rotation: in Quaternion [0.000, 0.000, -0.171, 0.985] in RPY (radian) [0.000, 0.000, -0.344] in RPY (degree) [0.000, 0.000, -19.687] At time 1637390453.641 - Translation: [0.000, 0.000, 0.000] - Rotation: in Quaternion [0.000, 0.000, -0.171, 0.985] in RPY (radian) [0.000, 0.000, -0.344] in RPY (degree) [0.000, 0.000, -19.687] At time 1637390454.633 - Translation: [0.000, 0.000, 0.000] - Rotation: in Quaternion [0.000, 0.000, -0.171, 0.985] in RPY (radian) [0.000, 0.000, -0.344] in RPY (degree) [0.000, 0.000, -19.687]
如果我们继续控制小乌龟移动,能够看到返回值会随着两个小乌龟相对位姿的变化和变化。
rviz 和 tf
rviz是一个测试tf框架的有用的可视化工具。我们可以使用rviz来查看我们的小乌龟坐标框架。通过rviz中的 -d 参数来找到 turtle_tf包下配置的.rviz文件。
如下图所示:
左侧选项卡中可以看到关于通过tf广播坐标框架的一些信息。我们移动小乌龟时坐标框架也会在rviz中进行对应的移动。