一、EKF概述:为什么需要EKF?线性KF与EKF的核心区别
大家好,我是你们的老朋友。今天咱们来聊聊扩展卡尔曼滤波,也就是EKF。
说实话,我刚入行那会儿,觉得卡尔曼滤波就是个黑盒子。输入输出,调调参数,完事。直到有一次做无人机姿态估计,用线性KF死活收敛不了,我才意识到——现实世界,哪有那么多线性系统?
1.1 为什么需要EKF?
线性卡尔曼滤波(KF)有个硬前提:系统必须是线性的,噪声必须是高斯的。
你想想看,现实中的机器人系统,有几个是线性的?
- 运动模型:小车转弯,角度和位置的关系是三角函数,不是线性
- 观测模型:激光雷达测距,距离和坐标的关系带平方根,也不是线性
- IMU数据:加速度计和陀螺仪的融合,涉及旋转矩阵,更不是线性
线性KF遇到这些非线性情况,就像用直尺量曲线——误差会越来越大,直到发散。
核心痛点:线性KF假设状态转移和观测都是线性变换。一旦遇到非线性,它的最优性就没了,甚至可能直接崩掉。
EKF的出现,说白了就是给线性KF装了个「近视眼镜」——把非线性问题在局部线性化,然后继续用KF那一套框架。
我记得有一次做移动机器人定位,轮子打滑导致里程计误差非线性增长。用线性KF,位置估计直接飘到墙外去了。换成EKF,虽然也有误差,但至少还在房间里转悠。嗯,这就是EKF的价值。
1.2 线性KF与EKF的核心区别
咱们直接上干货。两者的区别,我用一个表格说清楚:
| 对比项 | 线性KF | EKF |
|---|---|---|
| 系统模型 | 必须是线性:x = Ax + Bu | 可以是非线性:x = f(x, u) |
| 观测模型 | 必须是线性:z = Hx | 可以是非线性:z = h(x) |
| 核心思想 | 直接使用线性代数 | 用泰勒展开做线性近似 |
| 计算雅可比 | 不需要 | 必须计算状态转移和观测的雅可比矩阵 |
| 最优性 | 全局最优(线性高斯下) | 局部近似最优 |
| 适用场景 | 简单线性系统(如恒速模型) | 大多数实际机器人系统 |
看到这里你可能会问:「那EKF不就是把非线性函数求个导数吗?」
对,也不全对。
EKF的核心步骤其实就多了两步:
- 预测阶段:用非线性函数 f 直接传播状态,但协方差要用线性化的雅可比矩阵来更新
- 更新阶段:用非线性函数 h 计算预测观测,但增益计算要用线性化的雅可比矩阵
说白了,EKF就是「用线性化的刀,切非线性的蛋糕」。
1.3 一个简单的例子
假设我们要估计一个物体的位置和速度,但观测是距离(带平方根)。
线性KF会怎么做?它要求观测方程是 z = Hx,也就是距离和位置是线性关系。但实际距离是 sqrt(x² + y²),这怎么线性?
EKF的做法是:
- 在当前估计点 (x₀, y₀) 附近,对 sqrt(x² + y²) 做一阶泰勒展开
- 得到近似的线性关系:z ≈ H_local * x
- 然后把这个 H_local 当成观测矩阵,继续跑KF的更新公式
个人经验:我建议初学者先手推一遍雅可比矩阵。别偷懒,哪怕是最简单的例子。我当年就是图省事用数值微分,结果调参调到怀疑人生。手推一遍,你对EKF的理解会上一个台阶。
1.4 EKF的局限性(避坑指南)
EKF不是万能的。我曾经踩过几个坑,分享给大家:
我曾经在一个强非线性系统(大角度姿态估计)上硬用EKF,结果协方差矩阵频繁非正定,滤波器直接炸了。后来换成UKF才解决问题。
EKF的主要问题:
- 线性化误差:泰勒展开只取一阶项,如果非线性强,误差会累积
- 雅可比计算复杂:对于高维系统,手推雅可比容易出错
- 对初值敏感:如果初始估计离真值太远,线性化点选得不好,滤波器可能发散
所以,什么时候用EKF?
- 系统非线性程度中等(比如小角度近似成立)
- 你能手推或自动微分得到雅可比
- 计算资源有限(EKF比UKF/PF快)
什么时候别用?
- 强非线性(比如纯方位跟踪、大角度旋转)
- 多模态分布(EKF假设单峰高斯)
- 你懒得算雅可比(那就用UKF吧)
1.5 小结
这一章咱们聊了:
- 为什么需要EKF——因为现实是非线性的
- 线性KF和EKF的核心区别——一个直接算,一个先线性化再算
- EKF的适用场景和坑
下一章,我会带大家手撕EKF的数学公式,从预测到更新,每一步都讲清楚。到时候咱们再聊雅可比矩阵怎么算、协方差怎么调。
嗯,今天就到这儿。记住:EKF不是银弹,但在大多数工程场景下,它够用、好用、值得掌握。