坐标变换的概念
变换介绍
在 ROS 系统中,许多功能包需要使用 tf2 功能包发布机器人的变换树。变换树定义了不同坐标系之间的关系,包括平移、旋转和相对运动。让我们通过一个简单的机器人说明什么是变换树,假设机器人有一个移动基座(base_link),并且在基座顶部安装了一个摄像机(base_camera),如图1所示。

图 1: 机器人中不同坐标系
这个机器人定义了两个坐标系:一个位于移动基座的中心点,坐标系称为 base_link。另一个位于摄像机的中心点,坐标系称为 base_camera。此时,我们假设从摄像机获得了一些数据,这些数据是摄像机中心点的距离测量值。换句话说,我们有一些在 base_camera 坐标系中的数据。
现在,假设我们想利用这些数据帮助基座避开障碍物。为了成功做到这一点,我们需要一个变换把base_camera 上的测量数据转换到 base_link 坐标系上。本质上,我们需要定义 base_camera 和 base_link 坐标系之间的关系。
在定义这种关系时,我们假设获得的唯一的数据是安装在基座中心点前8厘米和上方15厘米处相机。我们需要使用一个平移偏移量关联 base_link 坐标和 base_laser 坐标。具体来说,我们需要使用一个平移(x: 0.08m, y: 0.0m, z: 0.15m)把 base_link 坐标的数据转换到 base_camera 上来,反之亦然,要把 base_camera 数据转到 base_link 上,我们必须应用相反的平移量(x: -0.08m, y: 0.0m, z: -0.15m)。

图 2: 简单的坐标变换图
可以自己手动计算他们之间的转换关系,但随着坐标系数量的增加,这变得非常麻烦。幸运的是,我们不必自己动手计算。相反,我们将使用 tf2 一次性定义 base_link 和 base_camera 之间的关系,并让它为我们管理这两个坐标系之间的变换。这在处理非静态变换时特别有用,例如一组相对于彼此移动的坐标,如机器人基座坐标系在大地坐标系中的移动。我们可以记录在不同时刻他们之间的关系,并存储 tf2 的变换树中,供后续使用。
要使用 tf2 定义和存储 base_link 和 base_camera 坐标系之间的关系,我们需要将它们添加到变换树中。从概念上讲,变换树中的每个节点对应一个坐标系,每条边对应从当前节点移动到其子节点的变换。tf2使用变换树确保任何两个坐标系只有单一遍历链接,并假设树中的所有边都是从父节点指向子节点的。如图 3 中,从 map 坐标系到 base_lidar 坐标系,只有一个路径,就是map->odom->base_link->base_lidar。

图 3: 变换树
在变换树中的两个节点:一个是 base_link 坐标系,一个是 base_camera 坐标系。要定义它们之间的关系,我们首先需要确定哪个节点是父节点,哪个是子节点。这个定义很重要,因为 tf2 假设所有变换都是从父节点到子节点的。
选择 base_link 坐标系作为父节点,因为当向机器人添加其他部件/传感器时,它们通过 base_link坐标系与 base_camera 坐标系发生关联。如图 2所示,这意味着连接 base_link 和 base_camera 的变换应该是(x: 0.08m, y: 0.0m, z: 0.15m)。
有了这个变换树的设置,将接收到的 base_camera 坐标系中的数据转换到 base_link 坐标系中就不需要手动计算,tf2 会自动计算。现在机器人可以使用这些信息在 base_link 坐标系安全地感知环境中的障碍物。每个节点下都会存储不同时间下的坐标信息,我们可以查阅在不同的时间下不同节点之间的关系。