JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

我在哪里?定位问题入门

机器人在一张已知地图里醒来,却不知道自己站在哪里;本文讲它如何先猜测、再逐步确认。

拿着地图,却在大楼里迷了路

想象你在一栋大办公楼里醒来,手里握着一张完美的平面图。你知道每条走廊、每扇门、每段楼梯——可你依然不知道自己正站在哪个房间。地图回答的是「世界长什么样」,却回答不了「我此刻在哪里」。后面这个问题,正是定位的全部工作:在一张机器人已经信任的地图里,算出它自己的位姿——它的位置,以及它正朝着哪个方向。

请注意,定位的前提是地图已经给定。这正是它与更难的「边走边建图」问题的区别——后者叫做SLAM(同步定位与建图)。在定位里,地图是固定且可信的——常常是一张占据栅格地图:一块细密的棋盘,每个格子被标为空闲、被占据或未知。机器人唯一的谜题,是它自己的所在。

为什么光数轮子转了多远还不够

轮式机器人的第一反应,是靠数轮子转了多少圈来追踪自己。如果知道轮子向前滚了多少厘米,就能把这段位移加到上一个已知位姿上,更新自己的猜测。这种对运动的累加叫做里程计;而只凭自身运动、不借助任何外部参照来推算位置的更广做法,叫做航位推算

麻烦在于,每一步都会带来一点点误差,而这些误差永远不会相互抵消——它们只会累积。轮子在湿瓷砖上打滑、某个轮胎气压略低于另一个、于是走过的距离也略短、地面有一点缓坡。每个小毛病都很微小,但里程计不断把新的位移叠加到一个已经有偏差的估计之上,于是猜测就慢慢偏离真相。这种持续累积叫做漂移。轮式编码器的量化会再叠加一点传感器噪声,但真正的祸首,是系统性误差被一步又一步地积分起来。只靠里程计跑得足够久,机器人可能信心十足地认定自己在厨房,实际却停在走廊里。

解药是向外看。像激光雷达这样的测距传感器会扫过房间,报告到附近墙面的距离。这些测量可以拿去和地图核对:如果机器人真的站在它以为的位置,那么它看到前方三米处的墙,就应当对上地图上画在前方三米处的墙。当读数与地图不符,机器人就抓住了自己的漂移,从而修正猜测。于是定位就成了一场持续的拉锯:一边是会漂移的运动估计,一边是把估计拉回地图上的传感器读数。

一团猜测,投票投出真相

机器人如何同时兼顾漂移与修正?最直观的答案之一,是蒙特卡洛定位。机器人不去押注唯一的最佳猜测,而是把成百上千个「猜测的位姿」撒满整张地图。每个猜测都是一个微小的假设——「也许我在这里,朝着这个方向」——而这一大群猜测合起来,就叫做粒子滤波器。每一个猜测就是一颗粒子。

这个滤波器反复运行一个简单的三拍循环。每一拍都很廉价,神奇之处在于每秒重复许多次。

  1. 移动每个猜测。机器人向前走时,就把所有粒子按同一里程计估计向前推——再加一点随机抖动,因为运动本身就不确定。整团粒子云便跟着机器人挪动。
  2. 给每个猜测打分。拿最新的激光雷达扫描,对每颗粒子发问:「若机器人真站在这里,这些距离读数会和地图吻合吗?」凡是想象出的视野与真实读数吻合的粒子,就获得高权重;凡是本该看见墙、传感器却看见空旷的粒子,就只得低权重。
  3. 重采样。按权重比例抽取粒子,组成新的一群——吻合好的猜测被复制许多份,吻合差的往往消失。读数排除之处,粒子云变稀;读数契合之处,粒子云变密。

当机器人沿走廊前进、反复运行这个循环时,令人欣慰的事情发生了:散开的粒子云会收拢。随着越来越多的扫描排除越来越多的错误位置,幸存的粒子越挤越紧,最终聚拢在唯一能解释传感器所见一切的那个位姿周围。机器人就此从「我可能在任何地方」走到「我就在这里」——靠的不是某一次聪明的计算,而是让众多猜测彼此竞争、让证据来投票。这正是递归贝叶斯估计的一张具体面孔:对自己身处何方保有一个信念,并用每一次新测量去精炼它。

跟踪已知起点,与「被绑架的机器人」

并非所有定位问题都一样难,差别全在于起步时你知道多少。简单的一类是位姿跟踪:你已大致知道机器人起点在哪,只需在它移动时让这个估计保持准确。此时粒子一开始就能聚成紧紧一团,围在已知的起始位姿周围,而整个循环的全部任务,就是推着这团粒子前进、抵抗漂移。

困难的一类是全局定位:机器人醒来时完全不知身在何处,正像我们那位迷失在办公楼里的人。此时粒子必须一开始就撒满整张地图,滤波器得筛遍整个空间,粒子云才能收拢。蒙特卡洛定位在这里大放异彩,恰恰因为一大群猜测能同时铺满许多房间——若只有一个最佳猜测的估计,连从何起步都无从谈起。

最棘手的版本有个外号:被绑架的机器人问题。设想一台已经自信定位的机器人,被人抱起来、放到一个完全不同的地方。它的粒子还全挤在那个旧的、如今已错的位置,彼此自得地相互附和——却没有一颗靠近真相。一个好的定位器,必须察觉到每个猜测忽然都很难解释传感器读数,进而有意撒出新粒子,重新搜遍地图。这尖锐地提醒我们:一团紧凑而自信的粒子云,并不等于一团正确的粒子云。