认识TF
TF是ROS世界里的一个基本的也是很重要的概念,所谓TF(TransForm),就是坐标转换。在现实生活中,我们做出各种行为模式都可以在很短的时间里完成,比如拿起身边的物品。但是在机器人的世界里,则远远没有那么简单。观察下图,我们来分析机器人拿起身边的物品需要做到什么,而TF又起到什么样的作用。
观察这个机器人,我们直观上不认为拿起物品会又什么难度,站在人类的立场上,我们也许会想到手向前伸,抓住,手收回,就完成了这整个一系列的动作。但是如今的机器人远远没有这么智能,它能得到的只是各种传感器发送回来的数据,然后它再处理各种数据进行操作,比如手臂弯曲45度,再向前移动20cm等这样的各种十分精确的动作。尽管如此,机器人依然没法做到像人类一样自如的进行各种行为操作。
那么在这个过程中,TF又扮演着什么样的角色呢?还拿该图来说,当机器人的"眼睛"获取一组数据,关于物体的坐标方位,但是相对于机器人手臂来说,这个坐标只是相对于机器人头部的传感器,并不直接适用于机器人手臂执行,那么物体相对于头部和手臂之间的坐标转换操作,就是TF的作用。
坐标变换包括了位置和姿态两个方面的变换,ROS的tf是一个可以让用户随时记录多个坐标系的软件包。tf保持缓存的树形结构中的坐标系之间的关系,并且允许用户在任何期望的时间点在任何两个坐标系之间转换点,矢量等。
ROS中的tf
tf可以被当做是一种标准规范。这套标准定义了坐标转换的数据格式和数据结构。tf本质是树状的数据结构,所以我们通常称之为"tf tree" 。 tf也可以看成是一个topic:/tf,话题中的message保存的就是tf tree的数据结构格式,维护了整个机器人的甚至是地图的坐标转换关系。tf还可以看成是一个package,它当中包含了很多的工具,比如可视化,查看关节间的tf,debug tf等等。tf含有一部分的接口,就是我们前面章节介绍的roscpp和rospy里关于tf的API。所以可以看成是话题转换的标准,话题,工具,接口。
观察上图,我们可以看到ROS数据结构的一个抽象图。ROS中机器人模型包含大量的部件,这些部件统称之为link。每一个link上面对应着一个frame, 即一个坐标系。link和frame概念是绑定在一起的。像上图pr2模型中我们可以看到有很多的frame,错综复杂的铺置在机器人的各个link上。维护各个坐标系之间的关系,就需要靠tf tree来处理,维护着各个坐标系之间的连通。如下图:
上图是我们常用的robot_sim_demo运行起来的tf tree结构。每一个圆圈代表一个frame,对应着机器人上的一个link,任意的两个frame之间都必须是连通的。如果出现某一环的断裂,就会引发error,系统报错。所以完整的tf tree不能有任何断层的地方,这样我们才能查清楚任意两个frame之间的关系。仔细观察上图,我们发现每两个frame之间都有一个broadcaster,这就是为了使得两个frame之间能够正确连通,中间都会有一个Node(broadcaster)来发布消息。如果缺少Node来发布消息维护连通,那么这两个frame之间的连接就会断掉。broadcaster就是一个publisher,如果两个frame之间发生了相对运动,broadcaster就会发布相关消息.