tf初步

本文主要内容参考自ROS wiki:tf/Tutorials/Introduction to tf,在加入了自己的一些理解的同时,我也对原文进行了适当的修改。原文使用Creative Commons Attribution 3.0,本文使用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议协议,若使用本文,请自觉遵守相关协议。

上一篇文章中,我们对tf已经有了一个大致的了解。在这篇文章中,大家将会看到一个使用tf库编写的有趣的小栗子,另外,我们也会介绍如何使用ROS内置的工具查看坐标变换及其详细信息。

安装必要工具

如果你安装的是完整的ros桌面版,那么你很可能会不需要进行这一步。这一步只是为了安装ros教程功能包、几何功能包、rviz、rosbash工具以及rqt坐标树工具。

$ sudo apt-get install ros-indigo-ros-tutorials ros-indigo-geometry-tutorials ros-indigo-rviz ros-indigo-rosbash ros-indigo-rqt-tf-tree

例子演示

运行下面的命令即可运行演示:

$ roslaunch turtle_tf turtle_tf_demo.launch

这时你会看到下面的结果:

demo

将光标定位在刚刚运行命令的终端,然后通过键盘方向键控制中间的小乌龟移动。这时,你会发现另一只乌龟会跟着你控制的那个乌龟移动,无论如何也甩不掉。

control

基本原理

这个例子其实只是简单地使用tf软件库创建了三个坐标:世界坐标系、turtle1坐标系、turtle2坐标系,并使用tf广播器(tf broadcaster)发布了它们之间的转换关系,然后使用tf监听器(tf listener)捕捉发布的转换关系,最后根据转换关系计算相应的速度信息,并将结果发给另一个小乌龟。

查看坐标变换树

在tf中,我们可以使用view frames查看坐标变换树:

NOTE:不要关闭前面运行的演示!

rosrun tf view_frames

然后你就会看到下面的信息:

Transform Listener initing
Listening to /tf for 5.000000 seconds
Done Listening
dot - Graphviz version 2.16 (Fri Feb 8 12:52:03 UTC 2008)

Detected dot version 2.16
frames.pdf generated

通过ubuntu下的pdf阅读器evince即可查看结果:

$ evince frames.pdf

当然你也可以直接手动打开文件frames.pdf。

view-frames-result

我们可以看到三个被tf发布的坐标系:世界坐标系、turtle1坐标系以及turtle2坐标系。我们也可以看到世界坐标系是turtle1坐标系和turtle2坐标系的父坐标系。另外,view frames也会产生一些用于调试的诊断信息,这些信息会告诉我们什么时候收到最旧的和最新的转换,以及tf坐标系被发布到tf的频率。

当然,借助万能的rqt,我们也可以查看坐标变换树。你可以使用下面的命令:

rosrun rqt_tf_tree rqt_tf_tree

或者直接启动rqt

rqt

然后再菜单栏中找到plugins>Visualization>TF Tree即可显示坐标变换树:

rqt

查看转换信息

使用tf的tf_monitor工具可以查看目前坐标转换树的详细信息,包括目前已存在的坐标,以及发布者、发布频率等信息:

Frames:
Frame: turtle1 published by unknown_publisher Average Delay: 0.000928401 Max Delay: 0.00398851
Frame: turtle2 published by unknown_publisher Average Delay: 0.000914138 Max Delay: 0.00386878

All Broadcasters:
Node: unknown_publisher 125.211 Hz, Average Delay: 0.000942602 Max Delay: 0.00386878

通过tf的tf_echo可以查看发布到ROS网络中的两个坐标之间的转换信息:

rosrun tf tf_echo [reference_frame] [target_frame]

假如我们想查看turtle2的坐标系相对turtle1坐标系的转换信息的话可以使用下面的命令:

$ rosrun tf tf_echo turtle1 turtle2

你会得到类似于下面的结果:

At time 1494299988.380
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, -0.714, 0.700]
            in RPY (radian) [0.000, 0.000, -1.591]
            in RPY (degree) [0.000, 0.000, -91.163]
At time 1494299989.148
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, -0.714, 0.700]
            in RPY (radian) [0.000, 0.000, -1.591]
            in RPY (degree) [0.000, 0.000, -91.163]
At time 1494299990.156
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, -0.714, 0.700]
            in RPY (radian) [0.000, 0.000, -1.591]
            in RPY (degree) [0.000, 0.000, -91.163]

这里简单介绍下输出结果,后面我会详细介绍。输出结果是一个时间戳和一个6或者7自由度的相对位姿信息: 平移量(Translation)和旋转量(Rotation)。

At time 1494299990.156

上面是该转换信息的时间戳,你可能会问为什么这个时间表示得这么奇怪。其实,这个时间是从系统获取到的的时间,即我们在ROS中经常看到的挂钟时间(Wall-Time or Wall-clock)。对Unix比较熟悉的应该知道,计算机内部的时间是从1970年1月1日开始的,所以这里给出的时间就是从这个时间点开始到现在的时间,单位是秒。

Translation: [0.000, 0.000, 0.000]

这个数据表示的是一个3D的平移向量,即xyz构成的向量,它表示从目标坐标系(reference_frame)到相对坐标系(reference_frame)的平移量。

Rotation: in Quaternion [0.000, 0.000, -0.714, 0.700]
in RPY (radian) [0.000, 0.000, -1.591]
in RPY (degree) [0.000, 0.000, -91.163]

这三个数据都表示旋转量,在ROS中对旋转量的表达主要有两种:欧拉角(后两个数据,它们只是单位不同)和四元式(第一个数据)。上面的输出结果将这两个数据都显示了出来。同样,它表示目标坐标系中的三个坐标轴到相对坐标系的旋转量。这个可能比较抽象,你可以类比平移量来理解。

关于转换信息,ROS wiki中有详细的介绍,在后面的文章中,我会对转换信息做详细的解释。

下一篇文章中,我们将会通过使用tf库一步一步实现上面的那个小栗子。

使用rviz

使用rviz可以很直观的观察tf转换的过程。现在我们可以直接启动rviz观察tf转换,记住不要关闭前面运行的例子:

rosrun rviz rviz

这时你会看到右侧边栏(Displays)中,global status出现错误(Error),不过没关系,我们需要做一些简单的设置就可以看到我们想看到的东西。

start-rviz

将Global Options->Fixed Frame中的默认选项”map”改为”world”,这时你会发现下面的错误就会消失;不过别着急,我们的设置还没有完。

global-option

下面点击右侧边栏的最下方的“add”按钮,然后添加“tf”。

add tf

添加好之后,你就可以看到下面的效果:

rviz-config-result

在刚刚运行例子的命令行中使用方向键控制乌龟运动并观察rviz中的变化。中间不动的那个是世界坐标系,其他两个是turtle1和turtle2的坐标系。后面的教程我们还会使用rviz进行说明,因为rviz可以很直观地看到坐标系的变化。

参考资料

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值