背景:
我们打开rviz时可以在地图上看见三个坐标系,虽然能够想到是通过坐标系的tf变换来直观定位的,但对三个坐标系的意义、转换的关系、AMCL如何在坐标转换中体现等问题仍不甚了解。
坐标系介绍:
- map:一个固定的针对全局静态地图的坐标系,原点在矩形静态地图的一个顶点,最后输出的是map坐标系的坐标。在系统计算中,map的原点是fixed的,不会改变,而AMCL计算得到的机器人坐标(map坐标系下)我们认为是绝对准确的。
- odom:里程计坐标系,是可以变化的,一般会因为雷达消息的校准而不断变化,以此来改变odom->map的变换内容,从而实现AMCL。
- base_link:机器人底盘坐标系,一般和机器人的中心重合,会随着机器人的运动而运动;先验原点坐标由里程计给出。
坐标系变换过程:
当没有雷达测量值校正时,odom原点和map原点重合,由于累计误差却没有调整手段,漂移越来越大。
在AMCL中,通过Odometry Drift在接收每帧点云(10hz)时调整了odom->map的变换,于是在里程计每更新几次过后(里程计的更新频率大于雷达),比对当前的地图与激光雷达检测到的环境地图,来自己的位置进行一个修正。这个修改正就体现在 odometry drift,把之前的运算得到的漂移补到 map_frame 和 odom_frame 两个坐标系之间。这就是AMCL的作用(SLAM里面也有map_frame 和 odom_frame 两个坐标系之间 这样的修正)。
坐标变换:对于客观世界的一个点,例如我们有odom->base的坐标变换关系,那么只要知道了这个点在任意一个坐标系下的坐标,那么就可以知道它在另一个坐标系下的坐标。
base坐标系在map上移动的过程细节:
一开始根据里程计信息(x、y由编码器解算,theta由IMU解算)发布base坐标系下这个点(客观的机器人旋转中心)的运动过程,由于tf广播不断发布odom->base_link的变换(坐标变换也就是平移),所以我们可以知道odom坐标系下这个点的运动过程,又因为tf发布了map->odom的变换(与激光雷达数据有关),所以我们可以知道map坐标系下这个点的运动过程,由于map坐标系被认为与机器人所在的世界坐标系一致,所以这个客观的点实际上也就是在map坐标系中运动。
又因为这个点是机器人旋转中心,在机器人运动后需要实时修改odom->base的坐标变换内容,所以base坐标系的原点对于odom坐标系有个移动,也就是对于map坐标系下有个移动,表现在rviz上就是base_link坐标原点在map图上的明显移动。
问题:
odom到base_link的变换长时间后不是准确的,为什么要一直发布呢?这不会导致系统使用了错误的信息吗?
解答:
在AMCL的代码中我们可以看到,计算得到map坐标系下机器人的坐标后并没有直接发布map到baselink的变换(tf树子节点只能有一个父节点),而是根据odom和baselink的关系、map和baselink的关系,反推出map和odom的关系,然后发布map到odom的变换。而map和baselink的地图中的实际位置是不可能改变的(意思是在这个时刻是真实的),因此我们在rviz中能够看到odom会随着机器人的运动而改变。总结一下就是:通过改变odom坐标系原点的位置使得机器人里程计的信息能够正确表达机器人的位置(改变的odom原点的量,就是机器人打滑等原因产生的里程计误差的量)。
参考链接:https://blog.youkuaiyun.com/gadwgdsk/article/details/95206155