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

钟形曲线与卡尔曼滤波

当不确定性是一条规整的钟形曲线时,预测—更新循环就化作著名的卡尔曼滤波,其增益负责在猜测与测量之间权衡。

用两个数就能携带的信念

机器人很少确切知道自己在哪里,它持有的是一个信念:一整片「每个可能位置有多大概率」的分布图景。一般来说,这片图景可以是任意杂乱的形状,老老实实地存下来可能需要一张庞大的数值表。让实时滤波成为可能的诀窍,是假设这片图景是一条高斯分布——也就是你在考试成绩图上见过的那条光滑、对称的钟形曲线

钟形曲线的描述成本低得惊人,你只需要两样东西:一个均值,即曲线的峰顶,也就是你的单一最佳猜测;以及一个展宽,即曲线有多宽,用来表达你有多不确定。又高又窄的钟形意味着「我相当确信自己就在这里」;又矮又宽的钟形则意味着「大概就在这附近,但到底在哪说不准」。

当状态同时包含好几个数——比如 x、y 和朝向——这个展宽就长成了一个协方差矩阵。它的对角线存放每个变量各自的不确定性;非对角线项则刻画各变量如何彼此牵连。一个写着「x 与朝向相关」的非对角线项,意味着对其中一个的测量会悄悄地让你对另一个的认识也变得更清晰。

为什么钟形曲线能给出干净的公式

随时间追踪一个信念的通用配方是递归贝叶斯估计:让信念顺着机器人的运动向前预测,再用每一个新测量去修正它,如此永远循环。难点在于,对于任意形状的信念,要精确地做到这一点,就意味着要计算一些棘手的积分——在一台小机器人上是无法以闭式求解的。

高斯分布有一个能拯救我们的神奇性质。如果你的信念是一条钟形曲线,机器人的运动是线性的,而混入的噪声也是高斯的,那么预测之后的结果仍然是一条钟形曲线。把一个高斯信念乘以一个高斯测量——结果还是高斯。在这些运算下,钟形曲线这个形状永远不会破裂,于是信念始终逃不出你所追踪的那两个数。

由于形状被锁定,那些积分坍缩成了寥寥几个矩阵的加法与乘法。在「高斯加线性」这一情形下,贝叶斯滤波的这种特殊而精确的闭式,就是卡尔曼滤波。它并不是与通用的预测—修正循环不同的另一套思想——它就是同一个循环,只因「一切都保持为钟形曲线」这一假设而变得又快又精确。

先预测,再更新

卡尔曼滤波一遍又一遍地运行同样的两个步骤——预测与更新,每个时间节拍一轮。每一轮都接过上一刻的钟形曲线,再把一条更锐利的交给下一刻。

  1. 预测:用运动模型把均值向前推——「我命令轮子前进了 10 厘米,所以我的最佳猜测也前移 10 厘米」。由于运动从不完美,过程噪声被加进来,协方差随之增大。钟形曲线滑动过去并变宽:预测总会让你变得更不确定。
  2. 更新:传感器报告了某个量——一段信标距离、激光雷达看到的一面墙。把传感器所说的与预测所期望的相比较,二者之差就是「新息」。用它把均值朝测量方向拉过去,并收缩协方差。钟形曲线被拉拢并变高:每一次好的测量都让你变得更确定。

留意这个节奏:预测把钟形摊开,更新又把它挤回去。一个只做预测的机器人——本质上就是纯粹的航位推算——会眼看着自己的钟形曲线无限膨胀。而一个不断测量的机器人,能让曲线始终受控。运动与传感器之间的这一推一拉,正是这套滤波器全部的心跳。

卡尔曼增益:一只信任旋钮

更新到底该多用力地把均值朝新测量拉过去?这唯一的决定正是卡尔曼增益的职责。把它想成一只在 0 与 1 之间的旋钮。靠近 0 意味着「相信我的预测,几乎不理会传感器」;靠近 1 意味着「相信传感器,把旧猜测丢掉」。

滤波器会自动设定这只旋钮,方法是比较两个展宽。如果预测不确定(一条宽钟形),而传感器很清晰(测量噪声很小),增益就向 1 攀升,测量胜出。如果预测很自信,而传感器抖动得厉害,增益就向 0 下滑,预测占上风。增益不过是两个说法的相对确定性,被换算成了一个权重。

# Scalar update for one number (e.g. a 1-D position)
# x  = predicted mean        P = predicted variance (spread^2)
# z  = sensor reading        R = sensor variance (its noise)

K = P / (P + R)            # the gain: 0..1, P vs R decide it
x = x + K * (z - x)        # nudge mean toward the reading
P = (1 - K) * P           # spread always shrinks after a look

# If sensor is perfect (R=0): K=1, x jumps to z, P -> 0
# If sensor is useless (R huge): K~0, x stays, P unchanged
一维更新只需三行:增益把猜测与读数融合,随后确定性增长。

把中间那行读成一个你在日常生活中早就在做的加权平均。「z − x」是你有多惊讶;乘以 K 则决定要相信这份惊讶的多少。把这同样的三行用矩阵而非单个数写出来,恰好就是完整的卡尔曼更新——标量情形正是整套直觉的微缩版。

钟形曲线假设在哪里失灵

卡尔曼滤波只有在运动与测量都是线性时才精确。真实的机器人会拐弯,而朝向会把正弦与余弦折进数学里——那不是线性的,于是一条纯粹的钟形曲线,再也无法毫发无损地熬过预测步骤。

工程师们应对这一点时并不抛弃钟形曲线。扩展卡尔曼滤波在每一步都把弯曲的运动拉直,化作一段局部的直线近似;而无迹卡尔曼滤波则把几个精心挑选的采样点推过真正的曲线,再对它们落下的位置重新拟合出一条高斯。两者都保留了那个廉价的双数信念,只在如何应对那道弯上有所不同。