3. 卡尔曼滤波回顾:从KF到EKF的演进

聊EKF和ESKF之前,咱们得先把老本行——卡尔曼滤波——理清楚。很多同学一上来就怼着EKF公式看,结果越看越懵。我当年也是这么过来的,后来发现,搞懂KF到EKF的演进,其实就是搞懂一件事:当系统不再听话(非线性)时,我们该怎么办

3.1 经典KF:线性世界里的最优解

经典卡尔曼滤波,说白了就是一套递归算法。它假设你的系统是线性的,噪声是高斯白噪声。嗯,这个假设很完美,但现实世界哪有这么听话?

KF的核心思想就两个步骤:预测更新。我习惯这么记:

  • 预测:根据上一时刻的状态,猜一下当前时刻的状态长什么样。
  • 更新:拿实际测量值,修正这个猜测。

公式我就不全列了,但有个关键点必须说——卡尔曼增益K。它决定了你更相信模型预测,还是更相信传感器测量。我在做IMU姿态估计时,就吃过这个亏:增益调得太大,测量噪声直接炸了;调得太小,系统又跟不上动态变化。

重要结论:KF只适用于线性系统。如果你的状态方程或观测方程里出现了x²、sin(x)、或者任何非线性项,经典KF就失效了。

3.2 非线性问题:为什么KF搞不定?

你想想看,真实世界哪有那么多线性关系?

  • 机器人运动:角度变化是sin、cos,不是线性加减
  • GPS定位:经纬度到笛卡尔坐标的转换,非线性
  • 视觉SLAM:相机投影模型,更是非线性得一塌糊涂

经典KF假设状态转移和观测都是线性变换。一旦遇到非线性,高斯分布经过非线性变换后就不再是高斯分布了。嗯,这就麻烦了——因为KF的所有推导都建立在「高斯分布经过线性变换仍然是高斯分布」这个基础上。

避坑指南:我曾经在一个项目中,直接用KF处理带角度变化的系统,结果滤波结果发散得一塌糊涂。后来才发现,角度变化根本不是线性关系,KF根本hold不住。

3.3 EKF的核心思想:线性化

EKF的思路其实很朴素:既然非线性搞不定,那我就把它近似成线性的

怎么近似?用泰勒展开。说白了,就是在当前估计值附近,用切线(一阶导数)来近似原来的非线性函数。这样,原来的非线性系统就变成了一个时变的线性系统,然后就可以套用KF的框架了。

具体来说,EKF做了两件事:

  1. 状态预测:直接用非线性函数f传播状态(不线性化)
  2. 协方差预测:用f的雅可比矩阵F来传播协方差(这里线性化了)

观测更新也是类似的套路。测量残差用实际测量值减去预测测量值,但协方差更新用的是观测函数的雅可比矩阵H。

个人经验:我建议你在写EKF代码时,先把雅可比矩阵推导清楚。很多bug都出在这里。我见过有人把sin的导数写成cos,结果滤波直接崩了。

3.4 EKF的局限性:不是万能的

EKF虽然好用,但坑也不少。我总结了几点:

  • 线性化误差:泰勒展开只取了一阶项,如果系统非线性很强,误差会累积
  • 雅可比计算麻烦:尤其在高维系统里,手动推导雅可比矩阵简直是噩梦
  • 对初始值敏感:如果初始估计偏差太大,线性化点选得不好,滤波直接发散

我记得有一次做无人机姿态估计,EKF在剧烈机动时直接炸了。后来分析发现,是因为角度变化太快,线性化假设不成立了。嗯,这就是EKF的软肋。

3.5 从KF到EKF:一张图看懂演进

下面这张图,我画了KF到EKF的核心演进逻辑。你看一眼就明白了:

经典卡尔曼滤波 (KF) 假设:线性系统 + 高斯噪声 状态方程:xₖ = A·xₖ₋₁ + B·uₖ + w 观测方程:zₖ = H·xₖ + v 适用场景:线性系统,如简单运动模型 非线性问题 扩展卡尔曼滤波 (EKF) 核心思想:线性化 状态预测:x̂ₖ = f(x̂ₖ₋₁, uₖ) 协方差预测:Pₖ = F·Pₖ₋₁·Fᵀ + Q F = ∂f/∂x(雅可比矩阵) KF vs EKF 核心区别 ● KF: 直接用矩阵A、H进行状态和协方差传播 ● EKF: 状态传播用非线性函数f,协方差传播用雅可比F ● KF局限: 只能处理线性系统 ● EKF局限: 线性化误差、雅可比计算复杂、对初始值敏感

3.6 什么时候用EKF?什么时候别用?

根据我的经验,给你几个判断标准:

场景 推荐方案 理由
系统非线性弱 EKF 线性化误差小,计算量适中
系统非线性强 UKF 或 ESKF EKF的一阶近似误差太大
高维状态(>20维) EKF(谨慎使用) 雅可比矩阵计算量大,但UKF采样点更多
IMU+GPS融合 ESKF(下一章重点) 误差状态线性化效果更好

一句话总结:EKF是KF到非线性世界的桥梁。它不完美,但足够实用。理解EKF的线性化思想,是后面理解ESKF的基础。

嗯,这一章就到这里。EKF的代码实现我就不贴了,因为下一章讲ESKF时,你会看到更优雅的写法。记住:EKF不是终点,它只是通往更高级滤波器的起点