107、导航中的重定位:视觉与激光的全局定位与重定位昨晚在实验室跑了一整夜的导航实验,机器人从充电桩出发,沿着走廊走了一圈,回到起点的时候,AMCL的粒子分布突然散开了——不是那种正常的抖动,是彻底炸开,粒子像无头苍蝇一样在整张地图上乱飞。我看了一眼里程计,累计误差大概已经到了一米二。这种情况,你指望靠局部定位把粒子拉回来,基本是做梦。重定位,或者说全局定位,才是唯一的路。先把这个概念掰扯清楚。导航里说的定位,通常指的是跟踪——机器人知道自己大概在哪,然后通过激光或者视觉的观测,把位姿的误差控制在一个小范围内。但重定位不一样,它是说机器人完全不知道自己在哪,或者知道自己在哪但置信度已经低到没法用,这时候需要从整个地图空间里重新找自己的位置。这俩问题的难度差着数量级。跟踪是局部优化,重定位是全局搜索。实际工程里,触发重定位的场景就那么几种:机器人被搬动了、里程计漂移太大导致粒子群退化、或者启动的时候没有给定初始位姿。我见过不少同学在仿真里跑得好好的,一上真机就翻车,翻就翻在没处理重定位。仿真里你永远知道机器人在哪,真机不是这样。先聊激光方案。最经典的就是AMCL的自适应蒙特卡洛定位,它本质上是在做全局定位的,只是大多数时候它收敛到了正确的位姿附近,表现得像在跟踪。AMCL里有个关键参数叫initial_pose,你如果不给,它默认在整个地图上均匀撒粒子。这个均匀撒粒子就是全局定位的起点。但均匀撒粒子有个问题——粒子数量不够的时候,正确位姿附近的粒子密度太低,可能压根没有粒子落在真实位姿附近,那收敛就是扯淡。我调试的时候踩过一个坑:地图是20米乘30米的厂房,我设了5000个粒子,看起来不少了,但实际算一下,每个粒子要