ros2 Navigation 2 中的坐标系
ros2 Navigation 2 中的坐标系
在 ROS2 Navigation 2 中,坐标系(Coordinate Frames)是用于描述机器人及其周围环境位置的重要概念。常见的坐标系包括:
map:全局地图坐标系,通常用于表示机器人在整个环境中的位置。odom:里程计坐标系,表示机器人相对于起始位置的位姿。base_link:机器人本体坐标系,固定在机器人的中心。sensor_link:传感器坐标系,固定在传感器上。
这些坐标系通过 TF(TF 即 Transform,用于描述坐标系之间的变换关系)进行管理和转换,其关系如下图所示:

图中表示了各个坐标系之间的关系,包括 map、odom、base_link,当然,对于传感器坐标系 sensor_link ,它通常与 base_link 相关联,表示传感器相对于机器人本体的位置。在导航过程中,这些坐标系的正确管理和转换对于机器人的定位和导航至关重要。
base_link坐标系
base_link坐标系是固定在机器人本体的坐标系,通常用于表示机器人相对于自身的位姿。在导航过程中,base_link坐标系与odom坐标系和map坐标系进行关联,通过TF进行坐标系的转换。
map坐标系
map坐标系是全局地图坐标系,通常用于表示机器人在整个地图中的位置。map是一个固定的坐标系,不随机器人的移动而变化,它为机器人提供了一个全局的参考框架。
同时,机器人在导航过程中,通过当前传感器(如在激光slam中使用的激光雷达,或者视觉slam中的相机)获取的局部环境信息与已知的地图信息进行匹配算法,从而确定机器人在map坐标系中的位置。
这样看,map坐标系似乎是一个万能的坐标系,我们只需要机器人在map中的位置即可。然而,在实际的导航过程中,由于传感器的噪声、地图的不完整性以及机器人自身的运动误差等因素,这种匹配获取的位置会出现非平滑的跳变。这对控制层面来说,跳变可能会导致控制不稳定。
odom坐标系
odom坐标系是里程计坐标系,理论上odom也是一个固定坐标系。它表示机器人相对于起始位置的位姿。当机器人相对于起始位置开始运动时,我们可以根据一些方案去定位机器人走了多远,姿态角变化了多少,从而得到机器人在odom坐标系中的位姿。比如通过轮式里程计(通过不断采样编码器获得单位时间内的移动距离,然后不断对其进行积分得到位置)、惯性测量单元(原理也是通过不断采样和积分来获得机器人的位姿)等方式,当然,更好的方式是通过一些传感器融合算法,如卡尔曼滤波,来结合多种传感器的信息,从而获得更准确的机器人位姿。
显然,odom坐标系下的base_link是不断平滑积分得到的,这意味着它的位姿变化是连续的,不会出现像map坐标系中那样的跳变。因此,在控制层面,使用odom坐标系下的位姿可以提供更稳定的控制输入。但是,也是由于积分的累积误差,odom坐标系下的位姿可能会随着时间的推移而产生漂移,导致定位精度逐渐下降。
因此odom坐标系是一个好的局部参考坐标系,它能够提供平滑且连续的机器人位姿信息,适用于控制层面的稳定控制。然而,由于其存在累积误差,长时间使用后可能会导致定位漂移,因此在实际应用中通常需要结合其他传感器信息或全局定位信息来进行校正。
因此,我们可以通过综合使用map坐标系和odom坐标系的优势,来实现更稳定和准确的机器人定位。例如,在控制层面可以使用odom坐标系提供的平滑位姿信息,而在全局定位和地图匹配时则使用map坐标系的信息。通过TF进行坐标系的转换和管理,机器人可以在保证控制稳定性的同时,也能获得准确的全局定位信息。
最终的tf关系如下所示,即map->odom->base_link

当机器人开始运动时,base_link坐标系会相对于odom坐标系发生变化,且在初始时刻,base_link坐标系与odom坐标系通常是重合的。
随着误差越来越大,base_link坐标系与odom坐标系之间的偏差也会逐渐增大,导致机器人位姿的估计出现漂移。
为了缓解这一问题,会引入map坐标系对odom坐标系进行校正,从而减少累积误差带来的漂移。比如
map:
origin: [10, 0, 0]
orientation: [0, 0, 0, 1]
<!-- map下base_link在x轴上10的位置 -->
odom:
origin: [10.3, 0, 0]
orientation: [0, 0, 0, 1]
<!-- odom下base_link在x轴上10.3的位置 -->
此时显然base_link的odom系下的坐标出现了漂移,那么此时需要对odom坐标系进行校正,使其通过tf后,有map->odom->base_link与map->base_link保持一致。则此时矫正后的odom系的原点在map坐标系下的坐标应该为[-0.3, 0, 0]。
则此时map->odom->base_link的变换即为
[0, 0, 0] + [-0.3, 0, 0] + [10.3, 0, 0] = [10, 0, 0]
这样,map->odom->base_link的变换就与map->base_link保持一致了,从而消除了由于odom坐标系漂移带来的影响。同时,我们没有直接去更改odom到base_link的变换,保留了其坐标的平滑性,减少对控制层面的干扰。
补充
在现实中,除了上述三层坐标的关系外,还有一个地球坐标系(earth),它用于表示机器人在地球上的绝对位置。地球坐标系通常用于全局定位,如GPS提供的坐标信息。在实际应用中,地球坐标系可以与地图坐标系进行关联,从而提供更准确的全局定位信息。

此时,earth坐标系与map坐标系进行关联,从而形成一个完整的坐标系体系:earth->map->odom->base_link。这样可以应用于需要全局定位和局部控制相结合的导航场景,如室外自动驾驶、无人机导航,不同位置下的多机器人协同工作等。

浙公网安备 33010602011771号