1、tf介绍
许多ROS功能包,都要求利用tf软件库,以机器人能识别的变换树的形式进行发布。变换树代表了不同坐标系之间的变换和旋转。
如果用户自己管理坐标转换关系,意味着需要自己去保存,以及在需要的时候调用。但是,这种做法的缺陷是随着坐标转换关系数量的增加,而愈加麻烦。
通过利用tf来管理这种关系,只需要把他们添加到转换树(transform tree)中。转换树中的每一个节点都对应着一类坐标系,节点之间的连线即是两个坐标相互转换的一种表示,一种从当前节点到子节点的转换表示。
Tf利用树结构的方式,保证了两个坐标系之间的只存在单一的转换,同时假设节点之间的连线指向是从parent到child。
如图所示,假设一个简单的机器人,只有一个基本的移动机体和挂在机体上方的扫描仪,传感器挂在机体中心的前方10cm,高度20cm处,分别定义两个坐标系:一个对应于机体中心点的坐标系“base_link”,一个对应于扫描仪中心的坐标系“baser_laser”,则从传感器到机体的坐标转换关系应该为(x:0.1m,y:0.0m, z:0.2m),同时需要创建两个节点。为了定义两者的关系,首先需要决定谁是parent,谁是child,因为tf假设所有的转换都是从parent到child,谁是parent是有差别的。建立关系以后,从“base_laser”的数据到“base_link”的转换过程可以通过简单的调用tf库完成。
2、创建源码包“robot_setup_tf”,并添加依赖包roscpp,tf 和 geometry_msgs:
3、编写广播变换broadcaster代码,创建节点来发布转换关系baser_laser->base_link:
4、编写调用变换listener代码,创建节点来利用转换关系,将从传感器获取的数据转换到机体对应的数据,即从“base_laser”→到“base_link”坐标系的转换:
5、构建代码:
a、在CMakeList.txt文件末尾添加生成和链接的脚本:
b、回到工作空间根目录进行编译:
6、运行代码:
a、在终端中运行roscore:
b、打开一个新的终端,运行 tf_broadcaster:
c、在第三个终端中运行tf_listener,将从传感器坐标系获取的虚拟点,变换到机体坐标系,结果如下: