导航中坐标(TF)变换设置
ROS包需要使用tf软件库发布机器人的变换树。在抽象层,变换树根据不同的坐标系之间的评议和旋转量开定义偏移量。在提及机器人时,一般定义两个坐标系:一个对用于机器人底座的中心点,一个坐标系安装在基座顶部的激光中心,并进行命名。我们将调用附加到移动基础“base_link”的坐标系(对于导航,它重要的是讲其放置在机器人的旋转中心),我们也会调用附加到激光“base_laser”的坐标系。


坐标系间的相对关系
我们在“base_laser”坐标系中有一些数据。现在假设我们想要获取这些数据并使用它来帮助移动基地避免活动空间的障碍。要做到这一点,我们需要一种将我们从“base_laser”坐标系转换成“base_link”坐标系的激光扫描的方法。实质上,我们需要定义“base_laser”和“base_link”坐标系之间的关系。
在定义这种关系时,假设我们知道激光在移动基座的中心之上10cm和向前20cm处安装。“base_link”坐标系和“base_laser”坐标系相关联的平移值和偏移值。具体来说,就是我们要知道从“base_link”坐标系到“base_laser”坐标系的数据,我们需要使用(X:0.1m, Y:0.0m, Z:0.20m)的转换,并从“base_laser”坐标系到“base_link”坐标系则需要相反的变换(X:-0.1m, Y:0.0m, Z:-0.20m)。
随着坐标系的数量增加,使用tf定义“base_link”和“base_laser”之间的关系,并让他管理两个坐标系之间的变换。在概念上,变换树中的每个节点对应于坐标系,每个方向对应于需要应用从当前节点移动到其子节点的变换。Tf使用树结构来确保只有一个遍历将任何两个坐标系连接在一起,并假设树中的所有方向都是从父节点引导到子节点。
创建两个节点,一个用于“base_link”坐标系,一个用于“base_laser”坐标系。为了创建它们之间的方向,我们首先需要决定哪个节点是父节点,哪些节点是子节点。因为tf假定所有转换都从父对象移动到子对象。让我们选择“base_link”坐标系作为父节点,因为随着其他部分/传感器被添加到机器人,通过遍历“base_link”框架,它们将最有意义地与“base_laser”坐标系相关。这意味着连接“base_link”和“base_laser”的变换应为(x:0.1m,y:0.0m,z:0.2m)。使用这个变换树设置,将在“base_laser”坐标系中接收到的激光扫描转换为“base_link”坐标系就像调用tf库一样简单。我们的机器人可以使用这些信息来理解“base_link”框架中的激光扫描,并安全地计划避开环境中的障碍物。
程序部分
首先,我们传递旋转变换,它由btQuaternion指定,需要在两个坐标系之间进行任何旋转。在这种情况下,我们不要施加旋转,所以我们发送一个由俯仰,滚动和偏航值等于零的btQuaternion。第二,btVector3可以应用到任何变换的,所以我们创建一个btVector3对应的激光的x偏移10厘米和Z偏移距离机器人基座20厘米。第三,我们需要给出发布的时间戳,我们将用ros::Time::now()。第四,我们需要传递我们创建的链接的父节点的名称,在这种情况下是“base_link”。第五,我们需要传递我们创建的链接的子节点的名称,在这种情况下是“base_laser”。
调试部分
新开终端,运行roscore;
新开终端,运行tf_broadcaster:
rosrun robot_setup_tf tf_broadcaster
新开终端,运行tf_listener,将模拟我们的点从“base_laser”坐标变换为“base_link”坐标系一个点:
rosrun robot_setup_tf tf_listener
硬件间的坐标转换关系
硬件间的坐标转换关系,即构建小车的urdf模型和TF关系。建图中使用到多线激光雷达和IMU,所以在建图时必须要有这两个传感器的的TF树关系。cartographer中主要利用urdf文件进行构建(文件位置:~/install_isolated/share/cartographer_ros/urdf),这部分主要编写我们自己小车的urdf文件模型。这部分可以参考下面这篇博客:
ROS小车与URDF模型
本篇博客主要参考了,下面这篇文章:
设置TF–创客智造