想象一下:你正在一个巨大的商场里逛街,突然眼前一黑,有人给你戴上眼罩、拉着你转了好几圈。等你摘下眼罩,眼前的奶茶店、扶梯、楼层指示牌都似曾相识,但你完全不知道自己站在几楼、哪个区。别慌——你手里有一张商场地形图。你环顾四周,记下“右前方 8 米有扶梯口、背后 3 米是那家蓝底白字的奶茶店”,再对照地图猜几个可能的位置,逐个验证,最终把自己重新放回地图上。 这个“从完全不知道自己在哪,到依靠已有地图重新找回位置”的过程,就是机器人学里的全局重定位(Global Relocalization)。它解决的是机器人圈里著名的“绑架机器人问题”:机器人跑着跑着突然丢失了自己的位姿。本文将带你从问题定义、数学建模、粒子滤波、特征匹配、工程实现到与局部定位的配合,完整弄懂这门“找回自己”的功夫。

岗位关联

对 AI 从业者而言,全局重定位是 SLAM 系统可靠性的最后一道防线。理解它,你就能让扫地机器人被抱起后自动复位、让仓库 AGV 被挪动后自愈归位,这是落地机器人产品不可或缺的核心能力。

目录
  1. 可视化演示
  2. 问题定义
  3. 数学建模
  4. 粒子滤波原理
  5. 特征匹配方法
  6. 全局定位流程
  7. 工程实现要点
  8. 局部定位配合
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 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 区”的不确定分布,一步步收敛成“我就站在这个扶梯口”的确定结论。理解了这层含义,后面所有的算法都是在为这个“收敛”服务。

P(xt∣z1:t,u1:t,m)\displaystyle P(x_t \mid z_{1:t}, u_{1:t}, m)
  1. \(x_t\)机器人在 \(t\) 时刻的位姿,通常包含平面坐标 \((x, y)\) 和朝向角 \(\theta\)。
    xt=(x,y,θ)x_t = (x, y, \theta)
  2. \(z_{1t}\):从开始到现在的全部传感器观测,例如激光距离、图像特征、轮速计数。
    z1:t={z1,z2,…,zt}z_{1:t} = \{z_1, z_2, \dots, z_t\}
  3. \(u_{1t}\):机器人发出的全部控制/运动指令,体现“我打算往哪走”。
    u1:t={u1,u2,…,ut}u_{1:t} = \{u_1, u_2, \dots, u_t\}
  4. \(m\)已知地图,即空间环境的数学模型。
    m:地图模型m: \text{地图模型}
  5. \(P(\cdot \mid \cdot)\)条件概率,表示在这些已知条件下的可能性分布。
    P(xt∣z1:t,u1:t,m)P(x_t \mid z_{1:t}, u_{1:t}, m)

数学建模

把商场地图画成坐标纸,事情就清晰多了。你的位置写成 \((x, y)\),脸朝向的角度写成 \(\theta\),三者合起来叫位姿。你眼睛看到的“前方 8 米是扶梯”,这种感知结果叫做观测。全局重定位要解决的,是“已知观测,反推位姿”的逆问题。

逆问题不好直接解,但我们可以先建立正问题:假如机器人确实站在某个位姿 \(x_t\),那么它“应该看到什么”是可以用模型预测的。这个从位姿到预测观测的映射,就叫观测模型。机器人学里最常用的观测模型形如:

这个公式看起来简单,却是连接世界与传感器的桥梁。\(h\) 根据地图 \(m\) 和位姿 \(x_t\) 计算出“理论上应测到的值”,\(\delta_t\) 则代表传感器的噪声——毕竟激光会跳点、相机有噪点,真实观测永远不可能和理论值完全一致。

用商场的说法:你猜“我在这家奶茶店门口”,观测模型就替你预测“那右前方应当出现扶梯口,左边 3 米应当有玻璃橱窗”。拿这个预测和真实看到的画面一比,猜得对不对立刻见分晓。于是,全局重定位从“猜位置”变成了“用观测模型验证每个猜测”。

zt=h(xt,m)+δt\displaystyle z_t = h(x_t, m) + \delta_t
  1. \(z_t\)\(t\) 时刻的真实观测值,比如一组激光距离或图像特征。
    zt=传感器输出z_t = \text{传感器输出}
  2. \(h(x_t, m)\)观测函数,给定位姿和地图,推算出“应当看到什么”。
    h:(xt,m)↦z^th: (x_t, m) \mapsto \hat{z}_t
  3. \(x_t\)当前候选位姿,正是我们要反推的未知量。
    xt=(x,y,θ)x_t = (x, y, \theta)
  4. \(m\)已有地图,包含地标位置、障碍物轮廓等信息。
    m=环境模型m = \text{环境模型}
  5. \(\delta_t\)零均值高斯噪声,表示传感器的测量误差。
    δt∼N(0,Σ)\delta_t \sim \mathcal{N}(0, \Sigma)

粒子滤波原理

一个人猜不准自己在哪里,那就放出一千个分身。粒子滤波的思路正是如此:在地图上均匀撒 \(N\) 个粒子,每个粒子携带一个位姿假设,代表“我可能在这个位置”。一群分身同时行动,谁和观测对得上,谁就活下来。

分身们每走一步,先按运动模型散步——因为轮子打滑、碰撞等因素,位置更新要加上随机噪声;到达新位置后,再用观测模型给每个分身打分:预测观测与实际观测越吻合,这个分身就越值得相信。这个“分数”就是粒子的权重。权重更新的核心公式是:

其中 \(w_t^{[i]}\) 是第 \(i\) 个粒子在 \(t\) 时刻的权重;等号右侧第一项是它上一时刻的“历史可信度”,第二项是本次观测的“吻合度”。两者的乘积构成了粒子新的可信度,然后再把所有粒子权重归一化,进入下一轮“预测—更新—重采样”循环。

这就像在商场里喊一嗓子“看见扶梯的分身举手”,然后让没举手的分身逐渐散开、举手的原地繁衍更多后代。经过几轮筛选,一群分身就会挤在你真正站的位置附近——这就是粒子滤波的全过程。

wt[i]∝wt−1[i]⋅p(zt∣xt[i],m)\displaystyle w_t^{[i]} \propto w_{t-1}^{[i]} \cdot p(z_t \mid x_t^{[i]}, m)
  1. \(w_t^{[i]}\)第 \(i\) 个粒子在 \(t\) 时刻的权重,越高代表该位姿假设越可信。
    wt[i]∈[0,1]w_t^{[i]} \in [0, 1]
  2. \(\propto\)正比于符号,表示我们只关心权重的相对大小,最后会归一化。
    对所有 i, ∑iwt[i]=1\text{对所有 } i,\ \sum_i w_t^{[i]} = 1
  3. \(w_{t-1}^{[i]}\)上一时刻该粒子的权重,保留历史信息。
    wt−1[i]=历史可信度w_{t-1}^{[i]} = \text{历史可信度}
  4. \(p(z_t \mid x_t^{[i]}, m)\)在粒子位姿和地图下“看到当前观测”的似然概率。
    p(zt∣xt[i],m)=观测吻合度p(z_t \mid x_t^{[i]}, m) = \text{观测吻合度}
  5. 整体含义新权重等于旧权重乘以观测似然,再归一化。
    wt[i]←wt−1[i]⋅p(zt∣xt[i],m)∑jwt−1[j]⋅p(zt∣xt[j],m)w_t^{[i]} \leftarrow \frac{w_{t-1}^{[i]} \cdot p(z_t \mid x_t^{[i]}, m)}{\sum_j w_{t-1}^{[j]} \cdot p(z_t \mid x_t^{[j]}, m)}

特征匹配方法

粒子滤波是“广撒网、慢慢筛”的笨办法,而特征匹配则是更主动的认路法。想想你在商场里定位时,真正给力的线索往往是“那家店招牌是蓝底白字”“扶梯旁的圆柱子有凹槽”这类独特特征——特征匹配就是让机器人学会认这种“地标”,从而一步到位。

特征匹配方法首先从当前传感器数据中提取局部特征,例如视觉角点、激光反射柱、墙面线段等;再为每个特征构建描述子——一串能概括局部形状的数字向量,相当于地标的“身份证号”。接下来,把这串描述子与地图中存储的特征库逐一比对,找到对应关系,就能用多组“观测—地图”匹配对反解出位姿。位姿估计通常写成最大化总相似度的形式:

这里 \(\rho\) 是相似度函数,衡量观测特征 \(z_j\) 与地图特征在假设位姿 \(x\) 下的预测值 \(h_j(x)\) 之间有多“配”。

认出“蓝底白字”和“圆柱凹槽”之后,你在商场地图上扫一眼就能锁定自己。特征匹配的优势是速度快、直接给候选位姿;缺点是特征稀少或环境变化时容易失配。因此,实践中它经常和粒子滤波配合使用:先特征匹配得到候选区域,再用粒子滤波精细收敛。

x^=arg⁡max⁡x∑j=1Mρ(zj,hj(x))\displaystyle \hat{x} = \arg\max_{x} \sum_{j=1}^{M} \rho(z_j, h_j(x))
  1. \(z_j\)第 \(j\) 个观测特征,例如图像中提取的角点坐标。
    zj=第 j 个观测特征z_j = \text{第 } j \text{ 个观测特征}
  2. \(h_j(x)\)在假设位姿 \(x\) 下,地图中对应特征应当出现的位置。
    hj(x)=预测特征位置h_j(x) = \text{预测特征位置}
  3. \(\rho(z_j, h_j(x))\)相似度函数,距离越近分数越高。
    ρ=exp⁡(−12∥zj−hj(x)∥2)\rho = \exp\left(-\frac{1}{2} \| z_j - h_j(x) \|^2\right)
  4. \(\sum_{j=1}^{M}\)把所有匹配对的相似度累加起来,得到总分。
    总相似度=∑j=1Mρj\text{总相似度} = \sum_{j=1}^{M} \rho_j
  5. \(\arg\max_x\)使总相似度达到最大的位姿 \(x\) 就是要找的估计值。
    x^=arg⁡max⁡x 总相似度\hat{x} = \underset{x}{\arg\max}\ \text{总相似度}

全局定位流程

无论用哪种算法,完整的全局重定位流程都可以概括成四步曲:初始化粒子、读取观测、评估权重、判断收敛。就像在商场里寻找自己:先怀疑自己在哪、再看周围线索、逐个排除、最后确定答案。

流程的第一步是初始化:在可行区域内均匀撒粒子,保证“全地图无死角”。第二步是观测:读取激光、视觉、轮速等传感器数据。第三步是评估:用观测模型给每个粒子打分并更新权重。第四步是收敛判定——如果粒子已经聚拢成一个紧密的簇,就输出加权平均或最大权重粒子作为最终位姿。

怎么用数学判断“粒子已经聚拢”?最常用的指标是有效粒子数 \(N_{\text{eff}}\):

当所有粒子权重均匀时,\(N_{\text{eff}}\) 接近 \(N\),说明系统还很迷茫;当少数粒子垄断了大部分权重时,\(N_{\text{eff}}\) 会明显变小,说明已经收敛到一个小区域。

商场里几十个分身最后都挤在同一个扶梯口,你心里就有底了:“我就在这里。”收敛判定正是把这种直觉变成可以写进代码的数值条件——当 \(N_{\text{eff}}\) 小于某个阈值时,系统认定定位完成,可以输出结果。

Neff=1∑i=1N(w[i])2\displaystyle N_{\text{eff}} = \frac{1}{\sum_{i=1}^{N} \left(w^{[i]}\right)^2}
  1. \(N\)粒子总数量。
    N=总粒子数N = \text{总粒子数}
  2. \(w^{[i]}\)第 \(i\) 个粒子的归一化权重,满足所有权重和为 1。
    ∑i=1Nw[i]=1\sum_{i=1}^{N} w^{[i]} = 1
  3. \((w^{[i]})^2\)权重平方,用于放大权重大小差异。
    (w[i])2:平方放大集中度(w^{[i]})^2: \text{平方放大集中度}
  4. 求和再取倒数权重越均匀,分母越小,\(N_{\text{eff}}\) 越大。
    w 均匀⇒Neff≈Nw \text{ 均匀} \Rightarrow N_{\text{eff}} \approx N
  5. 整体含义有效粒子数是判断粒子退化与收敛状态的核心指标。
    Neff=1权重集中程度N_{\text{eff}} = \frac{1}{\text{权重集中程度}}

工程实现要点

理论算法再漂亮,落成产品时还要算钱、算命。这里的“钱”是算力,“命”是可靠性。真正的全局重定位系统,往往从这几个细节里抠出性能。

第一是粒子数量选择:粒子越多,对后验分布的近似越准,但每个粒子都要做一次观测似然计算,算力消耗线性增长。地图大、传感器帧率高、算力强就多撒一些;反之则少撒一些。第二是重采样时机——过早会让粒子多样性丧失,过晚会让权重退化。工程上常用一个简单判据:

其中 \(\alpha\) 通常取 \(0.5\),低于这个值就触发重采样,把计算资源重新集中到高权重粒子附近。

除了粒子数和重采样,工程实现还必须包含失效恢复机制:当所有粒子都严重不吻合观测时,说明机器人可能又“被绑架”了,要立即重新初始化全局重定位,而不是继续硬算。同时,多传感器融合(激光 + 视觉 + 轮速)能提供更丰富的观测信息,让权重评估更稳健。这些经验就像在商场找人的调度方案——不是盲目增加人手,而是提前定好“多久找不到就重新广播寻人”的规则。

if Neff<αN then resample\displaystyle \text{if } N_{\text{eff}} < \alpha N \text{ then resample}
  1. \(\alpha\)触发阈值,工程上常用 \(0.5\)。
    α=0.5\alpha = 0.5
  2. \(N_{\text{eff}}\)当前有效粒子数,反映权重集中程度。
    Neff<αN⇒粒子退化N_{\text{eff}} < \alpha N \Rightarrow \text{粒子退化}
  3. then resample满足条件时执行重采样,淘汰低权重粒子。
    resample:重采样\text{resample}: \text{重采样}
  4. 整体含义有效粒子数过低时,要及时用重采样防止退化。
    if 条件成立⇒重采样\text{if 条件成立} \Rightarrow \text{重采样}

局部定位配合

全局重定位不是每时每刻都要跑的“重活”。正常工作时,机器人更像“跟着朋友走”:知道上一个位置,轮子转多少、方向偏多少都能推算出来,用计算量很小的局部跟踪就足够了。

但系统必须时刻保持警觉:故障检测模块持续监控定位质量——协方差是否变大、观测得分是否下降、里程计与地图是否矛盾。一旦数据显示“我跟丢了”,就立即从局部跟踪切换到全局重定位。状态切换的规则可以抽象为:

其中 \(\operatorname{cov}(x_t)\) 是当前位姿估计的协方差,反映不确定性;\(\tau\) 是容忍阈值。协方差小于阈值时,说明定位置信,继续局部跟踪;反之则启动全局重定位,在地图范围内重新找回位置。

朋友没丢时,跟着走就行;朋友不见了,停下来掏地图重新定位;找回后又有底气继续走路。这种“跟—找—跟”的节律,正是 SLAM 系统稳定运行的核心。全局重定位不是取代局部定位,而是在它失效时兜底的“安全网”。

xt={局部跟踪(MCL),if cov⁡(xt)<τ全局重定位,otherwise\displaystyle x_t = \begin{cases} \text{局部跟踪(MCL)}, & \text{if } \operatorname{cov}(x_t) < \tau \\ \text{全局重定位}, & \text{otherwise} \end{cases}
  1. \(\operatorname{cov}(x_t)\)位姿估计的不确定性度量,越大代表越没把握。
    cov⁡(xt)=位姿协方差\operatorname{cov}(x_t) = \text{位姿协方差}
  2. \(\tau\)容忍阈值,由工程师根据传感器质量标定。
    τ=切换阈值\tau = \text{切换阈值}
  3. \(\text{if } \operatorname{cov}(x_t) < \tau\)当前定位足够置信,走局部跟踪。
    xt=局部跟踪(MCL)x_t = \text{局部跟踪(MCL)}
  4. \(\text{otherwise}\)不确定性超标,切换到全局重定位。
    xt=全局重定位x_t = \text{全局重定位}
  5. 整体含义系统在低成本跟踪与高成本恢复之间自动切换。
    低不确定度→跟踪; 高不确定度→重定位\text{低不确定度} \to \text{跟踪};\ \text{高不确定度} \to \text{重定位}

AI 应用场景

扫地机器人被抱起后重新定位

阶段:定位恢复 / 异常自恢复

解决的问题:用户随手拎起扫地机器人放到另一个房间,机器人内部位姿彻底失效。若没有全局重定位,机器人会按旧地图中的错误位置规划路径,轻则绕路,重则撞墙或漏扫。

具体案例:某家用扫地机器人在被抱起后,感知模块检测到位姿协方差骤增,立即启动全局重定位:在已有户型图上均匀撒粒子,用激光测距与地图匹配打分,约 3 秒内把位置锁定到新房间,随后继续执行未完成的清扫任务。

仓储 AGV 被挪动后的自愈归位

阶段:任务中断恢复 / 多传感器融合定位

解决的问题:仓库中的 AGV 可能被叉车或人工临时挪动,偏离原路径。传统局部定位会沿着错误起点持续累积误差,导致无法回到正确站点。

具体案例:某自动化仓库的巡检 AGV 被叉车顺带移动了约 20 米。系统通过反光柱特征匹配生成候选位姿,再用粒子滤波在候选区域精化,最终在水位地图中恢复了站点坐标,自动重新加入调度队列,全程未中断任务超过 10 秒。

园区无人配送车的拖车恢复

阶段:多传感器融合定位 / 高精地图重定位

解决的问题:无人配送车在 GNSS 信号较差的园区被人为推到路边,局部位置丢失。缺少全局重定位将导致车辆无法汇入既定行驶路线。

具体案例:某园区无人车在激光点云与高精地图之间做 NDT 配准,利用点云特征全局匹配直接解出位姿,再与轮速/IMU 融合确认,成功恢复行驶状态并继续配送任务。

Python 演示

python56 行
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)
目的:演示粒子滤波全局重定位的核心循环——粒子在未知位姿下被初始化,通过模拟观测不断更新权重并重采样,最终收敛到真实位置。
  1. self.particles = np.random.rand(n, 2)在地图范围内均匀撒粒子,对应“初始化”。
  2. dists = np.linalg.norm(self.landmarks - self.true_pos, axis=1)模拟真实观测:机器人到每个地标的距离。
  3. llh = np.exp(-0.5 * ((pred - z) ** 2).sum())计算观测似然:粒子预测与真实观测越接近,分值越高。
  4. self.weights /= total归一化权重,让所有粒子权重之和等于 1。
  5. neff = 1.0 / np.sum(self.weights ** 2)计算有效粒子数,判断是否退化。
  6. if neff < self.n * 0.5:有效粒子数低于一半时触发重采样,防止粒子退化。
  7. idx = np.random.choice(self.n, size=self.n, p=self.weights)按权重抽取新粒子集,让高分粒子繁衍更多后代。

常见误区

误区“机器人迷路了,直接在原地重新扫描环境、重建一张地图不就行了吗?全局重定位就是重新建图吧?”

正解全局重定位的“重”是重新找回位置,而不是重新建图。它假设地图已经存在,只解决“我在哪”的问题。就像你拿着商场地图找人,不会因为迷路就把地图扔掉重画。重新建图(SLAM)代价高,还丢掉了已有地图信息。实践中两者职责分明:建图模块负责更新地图,重定位模块负责在地图上恢复位姿。

为何常见:“定位”和“建图”在 SLAM 中总是成对出现,初学者容易把两者混为一谈,以为重定位必然涉及重建地图。

误区“为了保证准确,撒十万个粒子,地图再大也不怕,反正现在算力很强。”

正解粒子数越多,对后验分布的近似越精确,但算力和内存开销线性增长。工程上要根据地图大小、传感器更新频率和嵌入式平台算力综合选择,通常在几百到几万之间。真正决定精度的是观测模型的质量和重采样策略,盲目增加粒子数只是用算力换一点点精度提升。

为何常见:把“粒子数”当成了唯一精度旋钮,忽略了计算代价和工程约束,因为增加粒子数在直觉上更“保险”。

误区“粒子都聚到一个点了,机器人已经知道自己在哪,以后就安全了,不用再管定位。”

正解收敛只代表当前时刻置信度高。机器人仍可能被抱起移动、传感器被遮挡、轮子打滑,再次丢失位姿。工程上必须持续监控协方差和观测一致度,一旦发现异常就立即重启全局重定位。就像你在商场确认位置后,不能保证下一秒不被朋友拉到另一层。

为何常见:把一次成功定位当成了永久状态,忽略了动态环境和突发干扰对机器人的持续影响。

误区“既然有特征匹配定位了,粒子滤波就过时了,这两种方法是完全独立、互相替代的。”

正解两者完全可以互补。粒子滤波擅长处理多峰分布和全局不确定性,特征匹配则能快速给出候选位姿。实践中常用特征匹配生成候选种子,再用粒子滤波在候选区域精化;或者粒子滤波跟踪的同时,后台用特征匹配校验。

为何常见:教材中这两种方法分章节独立讲解,容易让读者误以为它们是竞争关系,实际在工程中它们常常协作。

面试题

Q1. 机器人突然被抱起移动后完全不知道自己在哪,这类问题被称为什么?

单选题 · easy

  • A.绑架机器人问题← 正确答案
  • B.里程计漂移问题
  • C.闭环检测问题
  • D.动态障碍物问题

答案:A。被抱起移动等于瞬间失去位姿信息,机器人像被“绑架”一样从头找自己,这就是 kidnapped robot problem。里程计漂移是缓慢累积误差,闭环检测是判断是否回到已知区域,动态障碍物属于感知层面,均不符合题意。

Q2. 全局重定位与局部定位的最大区别是什么?

单选题 · easy

  • A.是否使用已有地图
  • B.是否知道先验位姿← 正确答案
  • C.是否使用激光雷达
  • D.是否进行路径规划

答案:B。局部定位从已知先验位姿出发推算增量,而全局重定位在不知道任何先验位置的条件下搜索整个地图。两者都可以用已有地图,也可以使用激光雷达;路径规划属于更高层决策,不在定位范畴内。

Q3. 粒子滤波中,用什么表示机器人在某位姿的可能性大小?

单选题 · mid

  • A.粒子速度
  • B.粒子权重← 正确答案
  • C.粒子数量
  • D.粒子颜色

答案:B。每个粒子的权重代表该位姿假设与观测的吻合程度,权重越高说明越可信。粒子速度描述运动,粒子数量表示采样密度,颜色只是可视化手段,都不能直接表示可能性。

Q4. 粒子滤波中“重采样”的主要作用是什么?

单选题 · mid

  • A.增加地图面积
  • B.淘汰低权重粒子← 正确答案
  • C.提高激光频率
  • D.降低电池功耗

答案:B。重采样按权重从当前粒子集中抽取新粒子集,让高权重粒子保留或繁衍更多后代、低权重粒子逐渐消亡。它既不改变地图,也不影响传感器频率,更不直接管理功耗。

Q5. 特征匹配法中,最终匹配的目标是什么?

单选题 · mid

  • A.图像之间的光线
  • B.观测特征与地图特征← 正确答案
  • C.粒子之间的颜色
  • D.地图之外的区域

答案:B。特征匹配将当前观测中提取的特征与地图中已存储的特征进行配对,利用配对关系求解位姿。光线颜色等只是特征的属性,不是匹配对象本身;地图之外区域不存在特征,无法匹配。

Q6. 有效粒子数 Neff 偏小时意味着什么?

单选题 · mid

  • A.粒子分布很均匀
  • B.权重集中在少数粒子← 正确答案
  • C.地图数据量变小
  • D.传感器噪声变大

答案:B。Neff 越小说明权重越集中于少数粒子,表示分布已经收敛到局部区域。粒子均匀时 Neff 接近总数;Neff 与地图数据量、传感器噪声无直接关系。

Q7. 机器人正常行走时,定位通常采用哪种模式?

单选题 · easy

  • A.全局重定位模式
  • B.局部跟踪模式← 正确答案
  • C.实时建图模式
  • D.待机休眠模式

答案:B。正常运行时位姿已知,系统用计算量小的局部跟踪持续维持位姿;只有检测到位姿丢失后才切换到全局重定位。建图模式用于地图更新,休眠模式不定位,均不符合“正常行走”场景。

Q8. 下列哪些情况可能触发全局重定位?

多选题 · mid

  • A.机器人被抱起搬运← 正确答案
  • B.长时间里程计漂移← 正确答案
  • C.传感器被遮挡后恢复← 正确答案
  • D.地图文件被删除

答案:ABC。被抱起搬运会瞬间丢失位姿;长时间里程计漂移导致定位置信度下降;传感器被遮挡期间位姿发散,恢复后都需要全局重定位。地图文件被删除后没有已有地图做参考,全局重定位失去前提,应先恢复地图。

Q9. 粒子滤波实现中,下列哪些做法是正确的?

多选题 · mid

  • A.粒子均匀撒满地图← 正确答案
  • B.观测后更新粒子权重← 正确答案
  • C.一直重采样不停止
  • D.用重采样淘汰低分粒子← 正确答案

答案:ABD。全局重定位要求在可行区域均匀初始化粒子,观测后按吻合度更新权重,并通过重采样淘汰低权重粒子。一直重采样会导致粒子多样性快速丧失,使滤波提前收敛到错误位置,因此 C 不正确。

Q10. 提高全局重定位可靠性常用的工程手段有哪些?

多选题 · hard

  • A.融合激光雷达与相机← 正确答案
  • B.监控定位协方差← 正确答案
  • C.将粒子数设为一
  • D.设置失效恢复机制← 正确答案

答案:ABD。多传感器融合提供更丰富观测,协方差监控能及时判定丢失,失效恢复机制保证一旦丢失可自动重新全局重定位。粒子数设为一无法表达多峰分布,在全局重定位中几乎必然失败,因此 C 错误。