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的核心区别

下面这张图,是我自己总结的对比框架。你一看就明白:

EKF vs ESKF 核心逻辑对比 EKF 流程 状态预测:x = f(x, u) 计算雅可比:F = ∂f/∂x 更新协方差:P = F·P·Fᵀ + Q 观测更新:K, x⁺, P⁺ ⚠ 雅可比在估计点处线性化 ⚠ 大偏差时线性化误差大 ESKF 流程 名义状态:x = f(x, u) (直接积分,不做滤波) 误差状态预测:δx = 0 (误差在零点附近线性化) 更新误差协方差:P 观测更新 → 估计误差 δx 注入名义状态 → 重置误差 ✅ 误差小,线性化精度高 ✅ 四元数用三维误差表示,无约束

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零偏、多传感器融合时优势明显
  • 选型没有绝对的对错,关键看你的系统特性

好了,这一章就到这里。下一章我们开始复习卡尔曼滤波的基础——别跳过,很多坑都是因为基础不牢。


专注资料整理