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 广播雷达和相机的坐标关系,然后所有节点都可以使用你发布的这个变换。
1.2 TF2
自从 ROS Hydro 版本发布后,ROS 官方就弃用了 TF 包,转而用第二代的 TF2 代替,TF2 完全兼容第一代的 TF,并且 TF2 接口更清晰,更加容易使用,官方也建议最新的工作使用 TF2 系统。
所以大家现在创建的项目使用最新的 TF2 就可以了,完全兼容 TF的。
以下我就用 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