>
Home

登龙(DLonng)

选择大于努力

ROS 机器人技术 - TF 坐标系统基本概念


版权声明:本文为 DLonng 原创文章,可以随意转载,但必须在明确位置注明出处!

项目写 ROS 语义融合节点需要使用 TF 坐标,这里记录下我学习下 TF 包的笔记。

一、TF 和 TF2 是什么?

1.1 TF

ROS TF 是一个可以让机器人随着时间跟踪坐标系之间变换关系的功能包,TF 的内部是树形结构,内部的坐标系变换通过缓冲区维护,可以让用户在任意时间将点、向量等数据的坐标在不同的坐标系中变换。

我们知道一个机器人系统通常含有多个随着时间变化的 3D 坐标系(coordinate frames),比如常见坐标系如下:

  • world frame:世界(全局)坐标系
  • base frame:机器人中心坐标系
  • head frame:机器人头部坐标系
  • gripper frame:机械爪坐标系

TF 包的作用就是随着时间的变化跟踪这些坐标系,并且用户可以访问过去和现在的一些坐标变换,比如:

  • 5 秒前,机器人头部坐标系相对于世界坐标系的变换关系是怎样的?
  • 机器人的爪子夹取的物体相对于机器人中心坐标系的位置在哪里?
  • 机器人中心坐标系和全局坐标系的相对位置变换

并且 TF 系统在 ROS 中是分布式的,意思是一个 ROS 系统中广播的所有坐标系变换关系对于所有的 ROS 节点都是可用的,每个订阅了 TF 消息的节点都会缓冲一份当前机器人所有坐标系的变换关系,使得坐标变换非常方便。

比如你定好了机器人的雷达和相机的相对位置,并且标定的他们的坐标关系,那么通过在 ROS 中用 TF 广播雷达和相机的坐标关系,然后所有节点都可以使用你发布的这个变换。

TF:http://wiki.ros.org/tf

1.2 TF2

自从 ROS Hydro 版本发布后,ROS 官方就弃用了 TF 包,转而用第二代的 TF2 代替,TF2 完全兼容第一代的 TF,并且 TF2 接口更清晰,更加容易使用,官方也建议最新的工作使用 TF2 系统。

所以大家现在创建的项目使用最新的 TF2 就可以了,完全兼容 TF的。

TF2:http://wiki.ros.org/tf2

以下我就用 TF 代表 TF2 了哈。

二、使用 TF 系统的 2 个重要步骤

ROS 官方给了使用 TF 系统的 2 个重要步骤,每个使用 TF 的同学都应该提前知道这 2 步,跟发布和订阅主题类似:

  • 广播 TF 变换:向 ROS 中广播坐标系的相对变换关系,ROS 系统的不同部分都可以广播坐标变换,不需要进行同步等操作。
  • 监听 TF 变换:接收并缓存 ROS 系统中广播的所有坐标系变换,并且可以查询指定帧之间的坐标变换。

基本的 TF 概念就介绍完了,下面用个小乌龟跟随的例子来看下 TF 系统到底做了什么。

三、小乌龟带你理解 TF 如何工作

3.1 安装并运行小乌龟

我们用官方的 Demo 来解释 TF 系统,先来安装 Demo:

sudo apt-get install ros-$ROS_DISTRO-turtle-tf2 ros-$ROS_DISTRO-tf2-tools ros-$ROS_DISTRO-tf

注意要把 $ROS_DISTRO 替换为你的 ROS 版本,比如 kinect

sudo apt-get install ros-kinect-turtle-tf2 ros-kinect-tf2-tools ros-kinect-tf

安装好后运行这个 demo,记得学习 ROS 环境搭建的基础:

roslaunch turtle_tf2 turtle_tf2_demo.launch

运行出现 2 个经典的小乌龟:

切换到运行 roslaunch 的终端,按键盘的上下左右键移动小乌龟,会发现第二个白色小乌龟会跟随第一个绿色小乌龟而运动:

3.2 分析小乌龟

上面这个例子中使用了 3 个坐标系:

  • world frame:世界坐标系
  • turtle1 frame:第一个绿色小乌龟的坐标系
  • turtle2 frame:第二个白色小乌龟的坐标系

在程序中使用 TF 广播小乌龟之间的参考系,然后在监听 TF 消息后计算 2 个乌龟的位置差,从而使得第二个乌龟跟随第一个乌龟移动,tf 提供了 view_frame 工具来查看系统当前广播的 TF 变换:

rosrun tf2_tools view_frames.py

会生成一个 frames.pdf 文件:

Listening to tf data during 5 seconds...
Generating graph in frames.pdf file...

我们直接打开这个 pdf 文件:

evince frames.pdf

解释下:

  • 当前 TF 系统广播了 3 个坐标系:world frame、turtle1 frame、turtle2 frame
  • world frame 是 turtle1 和 turtle2 的父坐标系节点
  • 除了坐标系的关系,还包括调试用的发送频率,缓冲区长度,最新的和最早的转换

还可以实时查看 ROS 系统中存在的 TF 变换:

rosrun rqt_tf_tree rqt_tf_tree

如下图:

除了查看参考系的结构图,TF 还提供一个能够查看两个坐标系相对变换的工具 tf_echo

# 输出 source_frame 到 target_frame 的坐标变换关系
# 或者 target_frame 相对于 source_frame 的坐标变换关系
rosrun tf tf_echo [source_frame] [target_frame]

turtle1 到 turtle2 的坐标变换公式如下,先把 turtle1 转到 world 坐标系,再从 world 坐标系转到 turtle2 坐标系:

\[T_{turtle1->turtle2} = T_{turtle1->world} * T_{world->turtle2}\]

我们来输出第一个绿色乌龟到第二个白色乌龟的坐标变换:

rosrun tf tf_echo turtle1 turtle2

输出类似下面的信息:

当你用上下左右键移动第一个乌龟,会发现上面的坐标输出会随之更新,里面显示了一些表示乌龟 2 相对于乌龟 1 的坐标(X, Y, Z)和旋转角(四元数和欧拉角表示)。

3.3 使用 RVIZ 查看 TF 变换

我们可以使用 RVIZ 来直观的查看系统当中的 TF 变换,启动上面 demo 对应的 rviz 配置:

rosrun rviz rviz -d `rospack find turtle_tf2`/rviz/turtle_rviz.rviz

显示如下,记得搜索下 Rviz 的基本用法哈,这里滑动鼠标滚轮可以放大查看,使用键盘移动小乌龟会发现坐标系也会随之移动:

今天就写这些,下期跟大家继续分享 TF 的使用方法。

本文原创首发于微信公号「登龙」,分享机器学习、算法编程、Python、机器人技术等原创文章,扫码即可关注

DLonng at 05/05/20