想象一下:你正在一个巨大的商场里逛街,突然眼前一黑,有人给你戴上眼罩、拉着你转了好几圈。等你摘下眼罩,眼前的奶茶店、扶梯、楼层指示牌都似曾相识,但你完全不知道自己站在几楼、哪个区。别慌——你手里有一张商场地形图。你环顾四周,记下“右前方 8 米有扶梯口、背后 3 米是那家蓝底白字的奶茶店”,再对照地图猜几个可能的位置,逐个验证,最终把自己重新放回地图上。 这个“从完全不知道自己在哪,到依靠已有地图重新找回位置”的过程,就是机器人学里的全局重定位(Global Relocalization)。它解决的是机器人圈里著名的“绑架机器人问题”:机器人跑着跑着突然丢失了自己的位姿。本文将带你从问题定义、数学建模、粒子滤波、特征匹配、工程实现到与局部定位的配合,完整弄懂这门“找回自己”的功夫。
对 AI 从业者而言,全局重定位是 SLAM 系统可靠性的最后一道防线。理解它,你就能让扫地机器人被抱起后自动复位、让仓库 AGV 被挪动后自愈归位,这是落地机器人产品不可或缺的核心能力。
可视化演示
本节配有交互动效(进入视口后自动加载,约 3KB)。
\u7ed1\u67b6\u673a\u5668\u4eba\u95ee\u9898: \u4e22\u5931\u4f4d\u59ff\u540e\u91cd\u65b0\u5b9a\u4f4d \u5df2\u77e5\u4f4d\u59ff?\u4e22\u5931!\u5168\u5c40\u641c\u7d22\u4e2d...\u5df2\u77e5\u4f4d\u...\u5df2\u77e5\u4f4d\u59ff?\u4e22\u5931!\u5168\u5c40\u641...</sp...
问题定义
想象你再回到那个商场:一个人站在陌生的楼层,手里只有一张地图,没有任何关于“我从哪里来”的记忆。机器人遇到的情况完全一致——它可能被人抱起来搬到别处、可能轮子打滑后里程计彻底失真、也可能传感器被遮挡太久导致定位漂移。这类瞬间丢失位姿的问题,在机器人圈里被形象地称为“绑架机器人问题”。而全局重定位,就是专门应对这种“从头找自己”的定位技术。
要理解全局重定位,先要分清它与局部定位的分工。局部定位默认“我知道上一时刻的位置”,然后靠车轮里程计、IMU 等增量推算下一步位置;一旦这个“已知上一刻位置”的前提不成立,局部定位就会一路错下去。全局重定位则不同:它不信任任何先验位置,直接在整个已有地图上搜索机器人最可能站在哪里。
从概率视角看,全局重定位求解的是这样一个分布:
它表示:在已知地图 \(m\)、到当前为止的所有观测 \(z_{1:t}\) 和控制指令 \(u_{1:t}\) 的条件下,机器人处于位姿 \(x_t\) 的概率。定位成功,就是让这个概率分布从“到处都是可能”收缩成“集中在一个点附近”。
回到商场比喻:全局重定位的目标,就是把你在地图上的位置从“可能在 A 区、B 区、C 区”的不确定分布,一步步收敛成“我就站在这个扶梯口”的确定结论。理解了这层含义,后面所有的算法都是在为这个“收敛”服务。
- \(x_t\)机器人在 \(t\) 时刻的位姿,通常包含平面坐标 \((x, y)\) 和朝向角 \(\theta\)。
- \(z_{1t}\):从开始到现在的全部传感器观测,例如激光距离、图像特征、轮速计数。
- \(u_{1t}\):机器人发出的全部控制/运动指令,体现“我打算往哪走”。
- \(m\)已知地图,即空间环境的数学模型。
- \(P(\cdot \mid \cdot)\)条件概率,表示在这些已知条件下的可能性分布。
数学建模
把商场地图画成坐标纸,事情就清晰多了。你的位置写成 \((x, y)\),脸朝向的角度写成 \(\theta\),三者合起来叫位姿。你眼睛看到的“前方 8 米是扶梯”,这种感知结果叫做观测。全局重定位要解决的,是“已知观测,反推位姿”的逆问题。
逆问题不好直接解,但我们可以先建立正问题:假如机器人确实站在某个位姿 \(x_t\),那么它“应该看到什么”是可以用模型预测的。这个从位姿到预测观测的映射,就叫观测模型。机器人学里最常用的观测模型形如:
这个公式看起来简单,却是连接世界与传感器的桥梁。\(h\) 根据地图 \(m\) 和位姿 \(x_t\) 计算出“理论上应测到的值”,\(\delta_t\) 则代表传感器的噪声——毕竟激光会跳点、相机有噪点,真实观测永远不可能和理论值完全一致。
用商场的说法:你猜“我在这家奶茶店门口”,观测模型就替你预测“那右前方应当出现扶梯口,左边 3 米应当有玻璃橱窗”。拿这个预测和真实看到的画面一比,猜得对不对立刻见分晓。于是,全局重定位从“猜位置”变成了“用观测模型验证每个猜测”。
- \(z_t\)\(t\) 时刻的真实观测值,比如一组激光距离或图像特征。
- \(h(x_t, m)\)观测函数,给定位姿和地图,推算出“应当看到什么”。
- \(x_t\)当前候选位姿,正是我们要反推的未知量。
- \(m\)已有地图,包含地标位置、障碍物轮廓等信息。
- \(\delta_t\)零均值高斯噪声,表示传感器的测量误差。
粒子滤波原理
一个人猜不准自己在哪里,那就放出一千个分身。粒子滤波的思路正是如此:在地图上均匀撒 \(N\) 个粒子,每个粒子携带一个位姿假设,代表“我可能在这个位置”。一群分身同时行动,谁和观测对得上,谁就活下来。
分身们每走一步,先按运动模型散步——因为轮子打滑、碰撞等因素,位置更新要加上随机噪声;到达新位置后,再用观测模型给每个分身打分:预测观测与实际观测越吻合,这个分身就越值得相信。这个“分数”就是粒子的权重。权重更新的核心公式是:
其中 \(w_t^{[i]}\) 是第 \(i\) 个粒子在 \(t\) 时刻的权重;等号右侧第一项是它上一时刻的“历史可信度”,第二项是本次观测的“吻合度”。两者的乘积构成了粒子新的可信度,然后再把所有粒子权重归一化,进入下一轮“预测—更新—重采样”循环。
这就像在商场里喊一嗓子“看见扶梯的分身举手”,然后让没举手的分身逐渐散开、举手的原地繁衍更多后代。经过几轮筛选,一群分身就会挤在你真正站的位置附近——这就是粒子滤波的全过程。
- \(w_t^{[i]}\)第 \(i\) 个粒子在 \(t\) 时刻的权重,越高代表该位姿假设越可信。
- \(\propto\)正比于符号,表示我们只关心权重的相对大小,最后会归一化。
- \(w_{t-1}^{[i]}\)上一时刻该粒子的权重,保留历史信息。
- \(p(z_t \mid x_t^{[i]}, m)\)在粒子位姿和地图下“看到当前观测”的似然概率。
- 整体含义新权重等于旧权重乘以观测似然,再归一化。
特征匹配方法
粒子滤波是“广撒网、慢慢筛”的笨办法,而特征匹配则是更主动的认路法。想想你在商场里定位时,真正给力的线索往往是“那家店招牌是蓝底白字”“扶梯旁的圆柱子有凹槽”这类独特特征——特征匹配就是让机器人学会认这种“地标”,从而一步到位。
特征匹配方法首先从当前传感器数据中提取局部特征,例如视觉角点、激光反射柱、墙面线段等;再为每个特征构建描述子——一串能概括局部形状的数字向量,相当于地标的“身份证号”。接下来,把这串描述子与地图中存储的特征库逐一比对,找到对应关系,就能用多组“观测—地图”匹配对反解出位姿。位姿估计通常写成最大化总相似度的形式:
这里 \(\rho\) 是相似度函数,衡量观测特征 \(z_j\) 与地图特征在假设位姿 \(x\) 下的预测值 \(h_j(x)\) 之间有多“配”。
认出“蓝底白字”和“圆柱凹槽”之后,你在商场地图上扫一眼就能锁定自己。特征匹配的优势是速度快、直接给候选位姿;缺点是特征稀少或环境变化时容易失配。因此,实践中它经常和粒子滤波配合使用:先特征匹配得到候选区域,再用粒子滤波精细收敛。
- \(z_j\)第 \(j\) 个观测特征,例如图像中提取的角点坐标。
- \(h_j(x)\)在假设位姿 \(x\) 下,地图中对应特征应当出现的位置。
- \(\rho(z_j, h_j(x))\)相似度函数,距离越近分数越高。
- \(\sum_{j=1}^{M}\)把所有匹配对的相似度累加起来,得到总分。
- \(\arg\max_x\)使总相似度达到最大的位姿 \(x\) 就是要找的估计值。
全局定位流程
无论用哪种算法,完整的全局重定位流程都可以概括成四步曲:初始化粒子、读取观测、评估权重、判断收敛。就像在商场里寻找自己:先怀疑自己在哪、再看周围线索、逐个排除、最后确定答案。
流程的第一步是初始化:在可行区域内均匀撒粒子,保证“全地图无死角”。第二步是观测:读取激光、视觉、轮速等传感器数据。第三步是评估:用观测模型给每个粒子打分并更新权重。第四步是收敛判定——如果粒子已经聚拢成一个紧密的簇,就输出加权平均或最大权重粒子作为最终位姿。
怎么用数学判断“粒子已经聚拢”?最常用的指标是有效粒子数 \(N_{\text{eff}}\):
当所有粒子权重均匀时,\(N_{\text{eff}}\) 接近 \(N\),说明系统还很迷茫;当少数粒子垄断了大部分权重时,\(N_{\text{eff}}\) 会明显变小,说明已经收敛到一个小区域。
商场里几十个分身最后都挤在同一个扶梯口,你心里就有底了:“我就在这里。”收敛判定正是把这种直觉变成可以写进代码的数值条件——当 \(N_{\text{eff}}\) 小于某个阈值时,系统认定定位完成,可以输出结果。
- \(N\)粒子总数量。
- \(w^{[i]}\)第 \(i\) 个粒子的归一化权重,满足所有权重和为 1。
- \((w^{[i]})^2\)权重平方,用于放大权重大小差异。
- 求和再取倒数权重越均匀,分母越小,\(N_{\text{eff}}\) 越大。
- 整体含义有效粒子数是判断粒子退化与收敛状态的核心指标。
工程实现要点
理论算法再漂亮,落成产品时还要算钱、算命。这里的“钱”是算力,“命”是可靠性。真正的全局重定位系统,往往从这几个细节里抠出性能。
第一是粒子数量选择:粒子越多,对后验分布的近似越准,但每个粒子都要做一次观测似然计算,算力消耗线性增长。地图大、传感器帧率高、算力强就多撒一些;反之则少撒一些。第二是重采样时机——过早会让粒子多样性丧失,过晚会让权重退化。工程上常用一个简单判据:
其中 \(\alpha\) 通常取 \(0.5\),低于这个值就触发重采样,把计算资源重新集中到高权重粒子附近。
除了粒子数和重采样,工程实现还必须包含失效恢复机制:当所有粒子都严重不吻合观测时,说明机器人可能又“被绑架”了,要立即重新初始化全局重定位,而不是继续硬算。同时,多传感器融合(激光 + 视觉 + 轮速)能提供更丰富的观测信息,让权重评估更稳健。这些经验就像在商场找人的调度方案——不是盲目增加人手,而是提前定好“多久找不到就重新广播寻人”的规则。
- \(\alpha\)触发阈值,工程上常用 \(0.5\)。
- \(N_{\text{eff}}\)当前有效粒子数,反映权重集中程度。
- then resample满足条件时执行重采样,淘汰低权重粒子。
- 整体含义有效粒子数过低时,要及时用重采样防止退化。
局部定位配合
全局重定位不是每时每刻都要跑的“重活”。正常工作时,机器人更像“跟着朋友走”:知道上一个位置,轮子转多少、方向偏多少都能推算出来,用计算量很小的局部跟踪就足够了。
但系统必须时刻保持警觉:故障检测模块持续监控定位质量——协方差是否变大、观测得分是否下降、里程计与地图是否矛盾。一旦数据显示“我跟丢了”,就立即从局部跟踪切换到全局重定位。状态切换的规则可以抽象为:
其中 \(\operatorname{cov}(x_t)\) 是当前位姿估计的协方差,反映不确定性;\(\tau\) 是容忍阈值。协方差小于阈值时,说明定位置信,继续局部跟踪;反之则启动全局重定位,在地图范围内重新找回位置。
朋友没丢时,跟着走就行;朋友不见了,停下来掏地图重新定位;找回后又有底气继续走路。这种“跟—找—跟”的节律,正是 SLAM 系统稳定运行的核心。全局重定位不是取代局部定位,而是在它失效时兜底的“安全网”。
- \(\operatorname{cov}(x_t)\)位姿估计的不确定性度量,越大代表越没把握。
- \(\tau\)容忍阈值,由工程师根据传感器质量标定。
- \(\text{if } \operatorname{cov}(x_t) < \tau\)当前定位足够置信,走局部跟踪。
- \(\text{otherwise}\)不确定性超标,切换到全局重定位。
- 整体含义系统在低成本跟踪与高成本恢复之间自动切换。
AI 应用场景
扫地机器人被抱起后重新定位
阶段:定位恢复 / 异常自恢复
解决的问题:用户随手拎起扫地机器人放到另一个房间,机器人内部位姿彻底失效。若没有全局重定位,机器人会按旧地图中的错误位置规划路径,轻则绕路,重则撞墙或漏扫。
具体案例:某家用扫地机器人在被抱起后,感知模块检测到位姿协方差骤增,立即启动全局重定位:在已有户型图上均匀撒粒子,用激光测距与地图匹配打分,约 3 秒内把位置锁定到新房间,随后继续执行未完成的清扫任务。
仓储 AGV 被挪动后的自愈归位
阶段:任务中断恢复 / 多传感器融合定位
解决的问题:仓库中的 AGV 可能被叉车或人工临时挪动,偏离原路径。传统局部定位会沿着错误起点持续累积误差,导致无法回到正确站点。
具体案例:某自动化仓库的巡检 AGV 被叉车顺带移动了约 20 米。系统通过反光柱特征匹配生成候选位姿,再用粒子滤波在候选区域精化,最终在水位地图中恢复了站点坐标,自动重新加入调度队列,全程未中断任务超过 10 秒。
园区无人配送车的拖车恢复
阶段:多传感器融合定位 / 高精地图重定位
解决的问题:无人配送车在 GNSS 信号较差的园区被人为推到路边,局部位置丢失。缺少全局重定位将导致车辆无法汇入既定行驶路线。
具体案例:某园区无人车在激光点云与高精地图之间做 NDT 配准,利用点云特征全局匹配直接解出位姿,再与轮速/IMU 融合确认,成功恢复行驶状态并继续配送任务。
Python 演示
import numpy as np class ParticleLocalizer: def __init__(self, landmarks, true_pos, n=3000): self.landmarks = np.asarray(landmarks, dtype=float) self.true_pos = np.asarray(true_pos, dtype=float) self.n = n self.particles = np.random.rand(n, 2) self.weights = np.ones(n) / n def observe(self): # 模拟一次观测: 真实位置到各地标的距离(带噪声) dists = np.linalg.norm(self.landmarks - self.true_pos, axis=1) return dists + np.random.randn(len(dists)) * 0.02 def update_weights(self, z): # 根据观测更新权重: 越接近真实观测的粒子权重越高 for i in range(self.n): pred = np.linalg.norm(self.landmarks - self.particles[i], axis=1) llh = np.exp(-0.5 * ((pred - z) ** 2).sum()) self.weights[i] *= llh total = self.weights.sum() if total > 0: self.weights /= total def resample(self): # 按权重重新抽取粒子, 并加少量随机扰动 idx = np.random.choice(self.n, size=self.n, p=self.weights) self.particles = self.particles[idx] + np.random.randn(self.n, 2) * 0.005 self.weights = np.ones(self.n) / self.n def estimate(self): best = self.weights.argmax() return self.particles[best] def run(self, steps=30): # 完整流程: 观测-更新-按需重采样, 返回最终估计 for _ in range(steps): z = self.observe() self.update_weights(z) neff = 1.0 / np.sum(self.weights ** 2) if neff < self.n * 0.5: self.resample() return self.estimate() if __name__ == "__main__": landmarks = [(0.2, 0.2), (0.8, 0.3), (0.4, 0.8)] true_pos = (0.6, 0.55) localizer = ParticleLocalizer(landmarks, true_pos, n=5000) est = localizer.run(steps=40) err = np.linalg.norm(est - localizer.true_pos) print("估计位置:", est) print("真实位置:", localizer.true_pos) print("定位误差:", err)
self.particles = np.random.rand(n, 2)在地图范围内均匀撒粒子,对应“初始化”。dists = np.linalg.norm(self.landmarks - self.true_pos, axis=1)模拟真实观测:机器人到每个地标的距离。llh = np.exp(-0.5 * ((pred - z) ** 2).sum())计算观测似然:粒子预测与真实观测越接近,分值越高。self.weights /= total归一化权重,让所有粒子权重之和等于 1。neff = 1.0 / np.sum(self.weights ** 2)计算有效粒子数,判断是否退化。if neff < self.n * 0.5:有效粒子数低于一半时触发重采样,防止粒子退化。idx = np.random.choice(self.n, size=self.n, p=self.weights)按权重抽取新粒子集,让高分粒子繁衍更多后代。
常见误区
误区“机器人迷路了,直接在原地重新扫描环境、重建一张地图不就行了吗?全局重定位就是重新建图吧?”
正解全局重定位的“重”是重新找回位置,而不是重新建图。它假设地图已经存在,只解决“我在哪”的问题。就像你拿着商场地图找人,不会因为迷路就把地图扔掉重画。重新建图(SLAM)代价高,还丢掉了已有地图信息。实践中两者职责分明:建图模块负责更新地图,重定位模块负责在地图上恢复位姿。
为何常见:“定位”和“建图”在 SLAM 中总是成对出现,初学者容易把两者混为一谈,以为重定位必然涉及重建地图。
误区“为了保证准确,撒十万个粒子,地图再大也不怕,反正现在算力很强。”
正解粒子数越多,对后验分布的近似越精确,但算力和内存开销线性增长。工程上要根据地图大小、传感器更新频率和嵌入式平台算力综合选择,通常在几百到几万之间。真正决定精度的是观测模型的质量和重采样策略,盲目增加粒子数只是用算力换一点点精度提升。
为何常见:把“粒子数”当成了唯一精度旋钮,忽略了计算代价和工程约束,因为增加粒子数在直觉上更“保险”。
误区“粒子都聚到一个点了,机器人已经知道自己在哪,以后就安全了,不用再管定位。”
正解收敛只代表当前时刻置信度高。机器人仍可能被抱起移动、传感器被遮挡、轮子打滑,再次丢失位姿。工程上必须持续监控协方差和观测一致度,一旦发现异常就立即重启全局重定位。就像你在商场确认位置后,不能保证下一秒不被朋友拉到另一层。
为何常见:把一次成功定位当成了永久状态,忽略了动态环境和突发干扰对机器人的持续影响。
误区“既然有特征匹配定位了,粒子滤波就过时了,这两种方法是完全独立、互相替代的。”
正解两者完全可以互补。粒子滤波擅长处理多峰分布和全局不确定性,特征匹配则能快速给出候选位姿。实践中常用特征匹配生成候选种子,再用粒子滤波在候选区域精化;或者粒子滤波跟踪的同时,后台用特征匹配校验。
为何常见:教材中这两种方法分章节独立讲解,容易让读者误以为它们是竞争关系,实际在工程中它们常常协作。
面试题
Q1. 机器人突然被抱起移动后完全不知道自己在哪,这类问题被称为什么?
- A.绑架机器人问题← 正确答案
- B.里程计漂移问题
- C.闭环检测问题
- D.动态障碍物问题
答案:A。被抱起移动等于瞬间失去位姿信息,机器人像被“绑架”一样从头找自己,这就是 kidnapped robot problem。里程计漂移是缓慢累积误差,闭环检测是判断是否回到已知区域,动态障碍物属于感知层面,均不符合题意。
Q2. 全局重定位与局部定位的最大区别是什么?
- A.是否使用已有地图
- B.是否知道先验位姿← 正确答案
- C.是否使用激光雷达
- D.是否进行路径规划
答案:B。局部定位从已知先验位姿出发推算增量,而全局重定位在不知道任何先验位置的条件下搜索整个地图。两者都可以用已有地图,也可以使用激光雷达;路径规划属于更高层决策,不在定位范畴内。
Q3. 粒子滤波中,用什么表示机器人在某位姿的可能性大小?
- A.粒子速度
- B.粒子权重← 正确答案
- C.粒子数量
- D.粒子颜色
答案:B。每个粒子的权重代表该位姿假设与观测的吻合程度,权重越高说明越可信。粒子速度描述运动,粒子数量表示采样密度,颜色只是可视化手段,都不能直接表示可能性。
Q4. 粒子滤波中“重采样”的主要作用是什么?
- A.增加地图面积
- B.淘汰低权重粒子← 正确答案
- C.提高激光频率
- D.降低电池功耗
答案:B。重采样按权重从当前粒子集中抽取新粒子集,让高权重粒子保留或繁衍更多后代、低权重粒子逐渐消亡。它既不改变地图,也不影响传感器频率,更不直接管理功耗。
Q5. 特征匹配法中,最终匹配的目标是什么?
- A.图像之间的光线
- B.观测特征与地图特征← 正确答案
- C.粒子之间的颜色
- D.地图之外的区域
答案:B。特征匹配将当前观测中提取的特征与地图中已存储的特征进行配对,利用配对关系求解位姿。光线颜色等只是特征的属性,不是匹配对象本身;地图之外区域不存在特征,无法匹配。
Q6. 有效粒子数 Neff 偏小时意味着什么?
- A.粒子分布很均匀
- B.权重集中在少数粒子← 正确答案
- C.地图数据量变小
- D.传感器噪声变大
答案:B。Neff 越小说明权重越集中于少数粒子,表示分布已经收敛到局部区域。粒子均匀时 Neff 接近总数;Neff 与地图数据量、传感器噪声无直接关系。
Q7. 机器人正常行走时,定位通常采用哪种模式?
- A.全局重定位模式
- B.局部跟踪模式← 正确答案
- C.实时建图模式
- D.待机休眠模式
答案:B。正常运行时位姿已知,系统用计算量小的局部跟踪持续维持位姿;只有检测到位姿丢失后才切换到全局重定位。建图模式用于地图更新,休眠模式不定位,均不符合“正常行走”场景。
Q8. 下列哪些情况可能触发全局重定位?
- A.机器人被抱起搬运← 正确答案
- B.长时间里程计漂移← 正确答案
- C.传感器被遮挡后恢复← 正确答案
- D.地图文件被删除
答案:ABC。被抱起搬运会瞬间丢失位姿;长时间里程计漂移导致定位置信度下降;传感器被遮挡期间位姿发散,恢复后都需要全局重定位。地图文件被删除后没有已有地图做参考,全局重定位失去前提,应先恢复地图。
Q9. 粒子滤波实现中,下列哪些做法是正确的?
- A.粒子均匀撒满地图← 正确答案
- B.观测后更新粒子权重← 正确答案
- C.一直重采样不停止
- D.用重采样淘汰低分粒子← 正确答案
答案:ABD。全局重定位要求在可行区域均匀初始化粒子,观测后按吻合度更新权重,并通过重采样淘汰低权重粒子。一直重采样会导致粒子多样性快速丧失,使滤波提前收敛到错误位置,因此 C 不正确。
Q10. 提高全局重定位可靠性常用的工程手段有哪些?
- A.融合激光雷达与相机← 正确答案
- B.监控定位协方差← 正确答案
- C.将粒子数设为一
- D.设置失效恢复机制← 正确答案
答案:ABD。多传感器融合提供更丰富观测,协方差监控能及时判定丢失,失效恢复机制保证一旦丢失可自动重新全局重定位。粒子数设为一无法表达多峰分布,在全局重定位中几乎必然失败,因此 C 错误。