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中进行对应的移动。

ROS学习-tf介绍相关推荐

  1. (18)ROS学习-TF坐标变换之静态坐标变换

    1.坐标msg消息: 订阅发布模型中数据载体 msg 是一个重要实现,首先需要了解一下,在坐标转换实现中常用的 msg:geometry_msgs/TransformStamped和geometry_ ...

  2. ros学习 tf;参数;话题;std_msgs

    TF tf是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数据结构,根据时间缓冲并维护多个参考系之间的坐标变换关系,可以帮助用户在任意时间,将点.向量等数据的坐标,在两个参考系中完成坐标变换. ...

  3. ROS学习笔记(十三) TF介绍(一)

    TF介绍(一) TF:机器人不停部位之间的坐标转换.坐标转换包括位置和姿态两方面,ROS中的tf是一个让用户随时记录多个坐标系的软件包.tf保持缓存的树形结构中的坐标系之间的关系,并允许用户在任何期望 ...

  4. ROS学习:tf坐标系

    参考 http://wiki.ros.org/tf http://wiki.ros.org/tf/Tutorials 古月居ROS中的坐标管理系统:https://www.bilibili.com/v ...

  5. ROS学习之tf在rviz中的显示

    昨天粗略看了一下ros中rviz的用法.事实,他就是一个可视化的工具.wiki的用户手册:http://wiki.ros.org/rviz/UserGuide 今天在学习tf的教程时,首先是演示了一个 ...

  6. ROS学习笔记(八): ROS通信架构

    ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...

  7. ROS学习----依据ROS入门教程,整理的ROS命令

    文章目录 ROS命令学习 文件系统介绍 ROS文件系统工具命令:rospack,rosstack roscd,rosls 创建ROS程序包命令:roscreate,catkin程序包结构,catkin ...

  8. ROS专题----tf和tf2坐标变换

    ROS专题----tf和tf2坐标变换 ---- 工作区设置 如果您尚未创建用于完成教程的工作区, 请单击此处查看一些简要说明 . 从tf1迁移到tf2 转换数据类型 这是对转换数据类型的语法更改的快 ...

  9. ROS学习笔记之——移动机器人的导航

    之前博客<ROS学习笔记之--激光雷达SLAM建图>已经介绍过如何通过激光雷达SLAM建图了,本博文讲一下ROS机器人的导航相关 目录 导航相关理论介绍 导航的概述 costmap AMC ...

最新文章

  1. c++如何定义二维数组结构体_原来数组还可以这么玩(宏把数组玩坏了)
  2. 【深度学习】拉格朗日( Lagrange)中值定理
  3. Python中使用PIL快速实现灰度图
  4. 【Python】反转列表 list 的几种方法
  5. 纯CSS: hover特效
  6. 页面每次添加都显示最后一次访问记录spring scope=prototype 学习笔记
  7. 软件工程导论 06章详细设计
  8. 同样是点工,凭什么他拿月薪20k,你却只有10k?
  9. 沧州中考计算机考试时间,2019年沧州中考考试时间安排,沧州中考考试科目时间安排表...
  10. javascript中的二维数组定义
  11. 能量时域空间物理_能量态空间
  12. HTML粘性定位,CSS:position——绝对、相对、固定、粘性定位的简单记录
  13. 一文学会Webpack实用功能|加载器篇
  14. echarts 2D地图散点图(带立体效果)tooltips中点击事件
  15. [c++] 常成员函数
  16. hexo博客的备份和迁移
  17. MATLAB-样条插值运算
  18. 星光不问赶路人,时光不负有心人。
  19. 计算机科学数学科目,计算机科学与技术考研考哪些科目 备考技巧有哪些
  20. [No0000A2]“原始印欧语”(PIE)听起来是什么样子?

热门文章

  1. c++ 内存池的实现
  2. 开关电源为什么要老化测试
  3. 现代计算机的二进制算法,源自中国智慧神秘巨著《周易》
  4. Lumia手机电池充电方法
  5. C# 多线程一: Thread 的简单理解与运用
  6. Android实现沉浸式状态栏效果
  7. 多普达与HTC的关系
  8. Java中Runtime类详细总结
  9. 网络 卧槽!牛皮了,面试官居然把TCP三次握手四次挥手问的这么详细
  10. 游戏音乐公司不知如何运转?看这里~