官方教程:http://wiki.ros.org/tf/
ROS中的很多软件包都需要机器人发布tf变换树,那么什么是tf变换树呢?抽象的来讲,一棵tf变换树定义了不同坐标系之间的平移与旋转变换关系。具体来说,我们假设有一个机器人,包括一个机器人移动平台和一个安装在平台之上的激光雷达,以这个机器人为例,定义两个坐标系,一个坐标系以机器人移动平台的中心为原点,称为base_link参考系,另一个坐标系以激光雷达的中心为原点,称为base_laser参考系。
假设在机器人运行过程中,激光雷达可以采集到距离前方障碍物的数据,这些数据当然是以激光雷达为原点的测量值,换句话说,也就是base_laser参考系下的测量值。现在,如果我们想使用这些数据帮助机器人完成避障功能,当然,由于激光雷达在机器人之上,直接使用这些数据不会产生太大的问题,但是激光雷达并不在机器人的中心之上,在极度要求较高的系统中,会始终存在一个雷达与机器人中心的偏差值。这个时候,如果我们采用一种坐标变换,将及激光数据从base_laser参考系变换到base_link参考下,问题不就解决了么。这里我们就需要定义这两个坐标系之间的变换关系。
为了定义这个变换关系,假设我们已知激光雷达安装的位置在机器人的中心点上方20cm,前方10cm处。这就根据这些数据,就足以定义这两个参考系之间的变换关系:当我们获取激光数据后,采用(x: 0.1m, y: 0.0m, z: 0.2m)的坐标变换,就可以将数据从base_laser参考系变换到base_link参考系了。当然,如果要方向变化,采用(x: -0.1m, y: 0.0m, z: -0.20m)的变换即可。
从上边的示例看来,参考系之间的坐标变换好像并不复杂,但是在复杂的系统中,存在的参考系可能远远大于两个,如果我们都使用这种手动的方式进行变换,估计很快你就会被繁杂的坐标关系搞蒙了。ROS提供的tf变换就是为解决这个问题而生的,tf功能包提供了存储、计算不同数据在不同参考系之间变换的功能,我们只需要告诉tf树这些参考系之间的变换公式即可,这颗tf树就可以树的数据结构,管理我们所需要的参考系变换。
还是以上边的示例为基础,为了定义和存储base_link和base_laser两个参考系之间的关系,我们需要将他们添加到tf树中。从树的概念上来讲,tf树中的每个节点都对应一个参考系,而节点之间的边对应于参考系之间的变换关系。tf就是使用这样的树结构,保证每两个参考系之间只有一种遍历方式,而且所有变换关系,都是母节点到子节点的变换。
为了定义上边示例中的参考系,我们需要定义两个节点,一个对应于base_link参考系,一个对应于base_laser参考系。为了创建两个节点之间的边,我们首先需要决定哪一个节点作为母节点,哪一个节点作为子节点,这一点在tf树中是非常重要的。这里我们选择base_link作为母节点,这样会方便后边为机器人添加更多的传感器作为子节点。所以,根据之前的分析,从base_link节点到base_laser节点的变换关系为(x: 0.1m, y: 0.0m, z: 0.2m)。设置完毕后,我们就可以通过调用tf库,直接完成base_laser参考系到base_link参考系的数据坐标变换了。
为什么机器人运动需要进行坐标变换?
举个简单的例子:我们每一个人都是机器人,然后我们每一个机器人所处的坐标系称之为大世界坐标系,也就是world坐标系。在world坐标系下有许许多多的物体,它们都具有相对坐标系。
我是机器人,我有自己的坐标系,我以自己的视觉去感知这个世界!机器人的坐标系即base_link坐标系(机器人的基体坐标系),odom坐标系即里程计坐标系(可以粗俗的理解为机器人的双腿坐标系),map坐标系即固定坐标系(一般为机器人所处的大世界为同一个坐标系),base_laser坐标系即为传感器坐标系(激光雷达坐标系/深度相机等),因为在这里我只是采用了激光雷达这唯一传感器。以此类推仿人机器人全身上下有很多个坐标系,头有他自己的坐标系,手,肘,双脚也有独立的坐标系等等,所以,轮式机器人可以说是应用相对比较简单,广泛的。
base_link :寓意为机器人的基体坐标系,与机器人的中心点重合,即市面上轮式机器人,那么它的坐标系原点就与中心点重合。
base_laser :粗略称为传感器坐标系,例如激光雷达传感器摆放在机器人中心点的上方,那么它的TF变化就会相对于随意摆放时更简单,只需要对Z进行变换就可以得到base_laser坐标系。
odme:里程计坐标系,机器人的双腿,因为是轮式机器人,所以我把机器人的两个轮子装在与机器人基座上,使其odme = base_link,这样在我们进行TF变换时会方便许多。
map:地图坐标系,顾名思义,一般设该坐标系为固定坐标系(fixed frame),一般与机器人所在的世界坐标系一致。