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有区别。要定义两者之间的关系,首先要决定谁是谁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,将果如下: