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

当世界并非直线:EKF、UKF 与粒子滤波

真实机器人会转弯、倾斜,并以非线性方式感知,因此基础卡尔曼滤波需要升级——或改用一群猜测粒子——才能跟上。

为什么基础卡尔曼滤波会失效

经典的 卡尔曼滤波 异常优雅,却建立在一个严格假设之上:每一步都必须是直线关系。机器人从一刻到下一刻的运动方式(即它的 运动模型)以及传感器读数依赖真实状态的方式(即观测模型),两者都必须是线性的——输入翻倍,输出就翻倍,中间没有任何弯曲。当这成立时,呈钟形的 高斯 信念在每次预测和更新后仍是完美的钟形,数学便干净闭合。

真实机器人很少这么配合。轮式机器人一旦转弯,它新的 x–y 位置就取决于其朝向角的正弦与余弦——这是弯曲函数,而非直线。一边前进一边旋转,未来的位置便沿弧线弯折。这就是非线性运动,已经打破了前述假设。

感知同样糟糕。仅测方位的传感器——比如只报告到地标的*角度*、不报距离的相机——通过反正切将角度与位置联系起来。从信标测距则涉及平方根。把一团漂亮的高斯猜测云送过这种弯曲函数,出来的云就歪斜成香蕉形,不再是干净的钟形。基础滤波没有诚实的办法表示这一点,于是它便悄悄谎报了自己的置信度。

扩展卡尔曼滤波:在局部假装它是直的

最古老的修正是 扩展卡尔曼滤波(EKF),它的诀窍很容易想象。一条曲线,只要你凑得够近,看起来几乎就是一条直线——也就是该点的切线。于是 EKF 取机器人当前的最佳猜测,就在那一点为弯曲的运动与传感器函数画出切线,再用这条直线近似去跑一步普通的卡尔曼运算。下一步,新的猜测,新的切线。它每个周期都重新线性化。

在机制上,这条切线由雅可比矩阵刻画——一个偏导数矩阵,告诉你当每个输入微动时每个输出如何微动,且在当前估计处求值。把这些雅可比矩阵放到线性滤波原本期待固定矩阵的位置,整个 预测—更新 循环便几乎原封不动地继续运转。正是这种熟悉感,让 EKF 成了 GPS 接收机、早期无人机以及无数 定位 系统的主力。

但切线只在你绘制它的那点附近才是好的替身。若函数弯曲剧烈,或你当前的猜测离真相很远,这条直线近似就可能严重偏离——于是滤波会自信地朝错误方向迈步。误差累积,报告的协方差越缩越小,而现实却越走越远,估计可能彻底发散,再也回不来。EKF 还要求你真能算出那些导数,对杂乱、不光滑的模型而言,这往往痛苦甚至不可能。

无迹卡尔曼滤波:用采样,别求导

无迹卡尔曼滤波(UKF)源自一个犀利的洞见:逼近一个概率分布,要比逼近一个任意非线性函数容易。UKF 不把曲线压平成切线,而是原封不动地保留真实的弯曲函数,转而挑选一小组经过精心选取的采样点——称为 sigma 点——它们合在一起刻画当前信念的均值与展布。

然后它做了显而易见而诚实的事:把每个 sigma 点送过*真正*的非线性运动或观测函数——不用切线,不抄近路。在另一端它得到一团变换后散布的点,再直接读出它们新的均值与 协方差,构成下一个高斯。这称为无迹变换;面对同等的弯曲程度,它通常远比 EKF 的切线更忠实地跟踪真实的均值与展布。

还有一个重要的实用好处:不需要求导。你永远不必手算雅可比矩阵,也不必担心模型太崎岖而无法求导——你只需能在某个点上*运行*该函数即可。这让 UKF 成为 EKF 顺手的升级替代,通常只多付出一点点代价(用少数几个 sigma 点取代一次线性化)。

不过 UKF 的局限与 EKF 同形:归根结底,它仍把答案概括为单个高斯——一个只有一个峰的钟形。如果真实信念已确实变成香蕉形,更糟的是分裂成两团各自分离的可能性,单个钟形便无法描述。要应对这种情形,你需要一种根本不同的表示。

粒子滤波:能呈现任意形状的一团猜测

粒子滤波 干脆抛弃了钟形曲线。它不用均值和协方差来描述信念,而是把信念表示为一群成百上千个各自独立的猜测——粒子——每一个都是关于机器人可能位置的一个完整假设。这群粒子的密度本身*就是*概率:粒子密集成团之处,机器人很可能就在那里;稀疏之处,多半不在。由于这群粒子能呈现任意形状,它便能刻画香蕉形、两团、一个圆环——真相需要什么形状就什么形状。

  1. 预测:让每个粒子按运动模型向前移动,并撒入少许随机噪声,使这团云适度扩散,以反映机器人实际运动方式上的不确定性。
  2. 加权:取最新的传感器读数,为每个粒子打分——若某粒子所在位置本会产生与实际所见相近的读数,就给高权重,与之相悖的就给低权重。
  3. 重采样:通过把高权重粒子多次复制、淘汰低权重粒子,繁衍出新一代群体,使幸存者聚集到证据指向之处。
  4. 每个周期重复;随时间推移,这团云追逐真相,并随读数累积而收紧。

这套配方正是 蒙特卡洛定位——把粒子滤波用于经典问题:在已知地图上判断机器人身处何处。它最精彩的绝活是应对被绑架的机器人:把粒子均匀撒满整张地图,随着机器人行驶并感知,与世界相悖的团块逐渐饿死消失,正确的团块则不断壮大,直到这团云坍缩到真实位置上。单个高斯必须从一开始就咬定一个猜测和一种展布,根本做不到这一点。

如何取舍:代价对灵活性

把这三者并排一比,便浮现出一条清晰的谱系,在计算代价与各自能消化多少杂乱之间权衡。EKF 最廉价、最简单;UKF 是温和的进阶,能更优雅地应对弯曲;粒子滤波则是重量级选手,能表示任意形状的信念——但所需算力最大。

Filter   Belief shape        Handles nonlinearity   Cost      Best when
------   -----------------   --------------------   -------   --------------------------
EKF      one Gaussian        tangent (linearize)    low       mild curve, good init guess
UKF      one Gaussian        sample sigma points    medium    sharper curve, no derivs
PF/MCL   any-shape cloud     run true function      high      multi-modal, kidnapped robot
同一套预测/更新循环,应对弯曲世界的三种方式。

实践中,选择随问题而定。无人机把 IMU 与 GPS 融合时,估计始终贴近真相、每秒更新数百次,为求速度便倾向 EKF 或 UKF。地面机器人若必须从零判断自己在地图上的位置,或在被拎起移动后恢复定位,则倚重粒子滤波,正因为它能同时持有多个相互竞争的假设。许多真实系统甚至将它们混用——而这三者都属于同一家族,即永远循环着先预测后更新的递归 贝叶斯滤波,区别只在于如何描绘信念。