1. 课程导论:为什么需要对比EKF与ESKF?
各位同学好,我是你们的老朋友。
做机器人定位的,没人不知道卡尔曼滤波。但说实话,很多人一上来就选EKF(扩展卡尔曼滤波),结果项目做到一半发现不对劲——姿态飘了、协方差崩了、调试调到怀疑人生。
为什么会这样?
我个人习惯是,在选型之前先问自己三个问题:
- 我的状态量是什么? 是位置+速度+姿态,还是只有位置?
- 我的传感器是直接测量状态,还是测量状态的增量?
- 我能不能接受频繁的雅可比矩阵重算?
这三个问题,基本决定了你该用EKF还是ESKF。
1.1 从EKF说起:它到底哪里不够用?
EKF,扩展卡尔曼滤波,是经典中的经典。它的思路很简单:把非线性系统在估计点附近做一阶泰勒展开,然后套用标准KF的框架。
听起来很合理,对吧?
但我在项目中遇到过一个大坑:EKF对初始误差非常敏感。你想想看,雅可比矩阵是在当前估计值处计算的,如果初始估计偏差太大,线性化误差就会累积,最后发散。
我记得有一次做无人机室内定位,IMU的零偏没标定好,EKF跑了不到30秒,姿态估计直接翻了90度。嗯,那次之后我就开始认真研究ESKF了。
⚠️ 避坑指南:
我曾经在一个AGV项目中,用EKF做轮式里程计+IMU融合。因为轮子打滑导致速度估计偏差,EKF的协方差矩阵迅速变得非正定,整个滤波器崩溃。后来换成ESKF,把速度误差作为状态量,问题迎刃而解。
1.2 ESKF的诞生:它解决了什么?
ESKF,误差状态卡尔曼滤波,说白了就是不直接估计状态本身,而是估计状态的误差。
你可能会问:这不就是绕了个弯吗?
其实不是。这个「弯」绕得非常巧妙。因为误差通常很小,小到可以在零点附近做线性化——这就避免了EKF在大偏差下线性化失效的问题。
ESKF的核心思想可以概括为三点:
- 名义状态:用IMU积分直接得到,不做滤波
- 误差状态:用卡尔曼滤波估计,量级很小
- 状态注入:估计完误差后,修正名义状态,然后重置误差
这个结构,我个人觉得非常优雅。尤其是处理姿态时,ESKF用四元数表示名义状态,用三维向量表示角度误差——完美避开了四元数在EKF中的归一化约束问题。
1.3 一张图看懂EKF与ESKF的核心区别
下面这张图,是我自己总结的对比框架。你一看就明白:
1.4 什么时候选EKF?什么时候选ESKF?
我个人的经验是:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 状态量少(<10维),线性度好 | EKF | 实现简单,计算量小,够用就行 |
| 包含姿态估计(四元数) | ESKF | 避免四元数归一化约束,误差状态线性化更准 |
| 传感器频率差异大(如IMU 200Hz + 相机 30Hz) | ESKF | 名义状态高频积分,误差状态低频更新,解耦清晰 |
| 系统有强非线性 | ESKF 或 UKF | EKF的雅可比在大偏差下容易失效 |
| 需要估计IMU零偏 | ESKF | 零偏作为误差状态的一部分,自然融入框架 |
💡 一个小技巧:
如果你不确定选哪个,先试试ESKF。它的结构更灵活,而且从ESKF降级到EKF很容易——只要把误差状态设成完整状态,不做注入重置就行了。反过来就难了。
1.5 这门课你会学到什么?
这门课一共30章,我会带你从原理到代码,彻底搞懂EKF和ESKF。
具体来说:
- 前5章:打好基础,复习卡尔曼滤波、四元数、李群李代数
- 第6-15章:EKF的完整推导、代码实现、常见坑点
- 第16-25章:ESKF的完整推导、代码实现、与EKF的对比实验
- 第26-30章:实战案例——无人机、自动驾驶、机器人SLAM
每一章我都会给出可运行的代码示例,以及我在实际项目中踩过的坑。
📌 本章小结:
- EKF适合线性度好、状态量少的场景
- ESKF通过估计误差状态,解决了EKF在大偏差下的线性化问题
- ESKF在处理姿态、IMU零偏、多传感器融合时优势明显
- 选型没有绝对的对错,关键看你的系统特性
好了,这一章就到这里。下一章我们开始复习卡尔曼滤波的基础——别跳过,很多坑都是因为基础不牢。