ESKF:基于流形的误差状态卡尔曼滤波推导详解

在 SLAM 和组合导航中,ESKF(Error-State Kalman Filter)是解决旋转(Rotation)非线性问题的标准答案。与直接滤波全量状态(Total State)不同,ESKF 将状态拆分为名义状态(Nominal State)和误差状态(Error State),在切空间(Tangent Space)上进行线性滤波。

1.1 坐标系

  • $W$ (World): 世界坐标系(导航系),通常为 ENU(东北天),重力 $\mathbf{g} = [0, 0, -9.81]^T$。
  • $B$ (Body): 机体坐标系(IMU 坐标系)。

我们将系统的真值状态 $\mathbf{x}_t$ 分解为名义状态 $\mathbf{x}$ 和误差状态 $\delta \mathbf{x}$,然后各项数据如表格:

变量 含义 维度 组合方式 ($\oplus$)
$\mathbf{p}$ 位置 (Position) $3$ $\mathbf{p}_t = \mathbf{p} + \delta \mathbf{p}$
$\mathbf{v}$ 速度 (Velocity) $3$ $\mathbf{v}_t = \mathbf{v} + \delta \mathbf{v}$
$\mathbf{q}$ 姿态 (Quaternion) $4$ $\mathbf{q}_t = \mathbf{q} \otimes \text{Exp}(\delta \boldsymbol{\theta})$
$\mathbf{b}_a$ 加速度计零偏 $3$ $\mathbf{b}_{at} = \mathbf{b}_a + \delta \mathbf{b}_a$
$\mathbf{b}_g$ 陀螺仪零偏 $3$ $\mathbf{b}_{gt} = \mathbf{b}_g + \delta \mathbf{b}_g$

1.2 IMU 传感器模型

IMU 的测量值 $\mathbf{a}_m, \boldsymbol{\omega}_m$ 由真值、零偏、噪声组成:

其中:

  • $\mathbf{R}_t$: 从 Body 到 World 的旋转矩阵。
  • $\mathbf{n}_a, \mathbf{n}_g$: 高斯白噪声(Measurement Noise)。
  • 零偏建模为随机游走:$\dot{\mathbf{b}}{at} = \mathbf{n}{ba}, \quad \dot{\mathbf{b}}{gt} = \mathbf{n}{bg}$。

1.3 连续时间运动学方程

真值运动方程 (True State Kinematics)

根据物理定律,真值的微分方程为:

名义状态运动方程 (Nominal State Kinematics)

名义状态不考虑噪声,且认为当前的零偏估计是准确的:

注: 对于一个绕轴 $\mathbf{u}$ 旋转 $\theta$ 角度的四元数,我们写成:

注意到了吗?这里有一个 $\frac{\theta}{2}$。

  • 角速度 $\omega$ 描述的是 $\theta$ 的变化率(即 $\dot{\theta}$)。
  • 四元数变化率 $\dot{\mathbf{q}}$ 描述的是 $\cos(\frac{\theta}{2})$ 和 $\sin(\frac{\theta}{2})$ 的变化率。

当你对 $\frac{\theta}{2}$ 求导时,根据链式法则(Chain Rule),$\frac{\theta}{2}$ 里的那个系数 $1/2$ 就会被提出来:

1.4 误差状态运动学推导 (核心)

位置误差 $\delta \dot{\mathbf{p}}$:

速度误差 $\delta \dot{\mathbf{v}}$ (关键):

代入真值和名义方程($\mathbf{g}$ 相互抵消):

线性化近似:

利用小量近似:$\mathbf{R}t \approx \mathbf{R}(\mathbf{I} + [\delta \boldsymbol{\theta}]\times)$,$\mathbf{b}{at} = \mathbf{b}_a + \delta \mathbf{b}_a$。
其中 $[\cdot]
\times$ 为反对称矩阵符号。

代入并忽略二阶小量(如 $\delta \boldsymbol{\theta} \cdot \mathbf{n}_a$):

消去首尾项,并利用叉乘性质 $[\mathbf{A}]\times \mathbf{B} = -[\mathbf{B}]\times \mathbf{A}$:

最终得到:

姿态误差 $\delta \dot{\boldsymbol{\theta}}$ (难点):

根据定义 $\mathbf{q}_t = \mathbf{q} \otimes \text{Exp}(\delta \boldsymbol{\theta})$,两边对时间求导。

左边 (真值):

右边 (链式法则):

利用名义方程 $\dot{\mathbf{q}} = \frac{1}{2} \mathbf{q} \otimes (\boldsymbol{\omega}_m - \mathbf{b}_g)$ 和近似 $\frac{d}{dt}\text{Exp}(\delta \boldsymbol{\theta}) \approx [\dot{\delta \boldsymbol{\theta}} \times]$(四元数形式):

令左右两边相等,并经过繁琐的四元数代数消元,最终得到线性化关系:

零偏误差:

由于零偏是随机游走:

1.5 误差状态空间方程

将上述微分方程写成矩阵形式:

其中状态 $\delta \mathbf{x} = [\delta \mathbf{p}, \delta \mathbf{v}, \delta \boldsymbol{\theta}, \delta \mathbf{b}a, \delta \mathbf{b}_g]^T$,噪声 $\mathbf{n} = [\mathbf{n}_a, \mathbf{n}_g, \mathbf{n}{ba}, \mathbf{n}_{bg}]^T$。

连续时间雅可比矩阵 $\mathbf{F}_c$

连续时间噪声矩阵 $\mathbf{G}_c$

1.6 离散化 (Discretization)

在代码实现中,我们需要离散形式 $\delta \mathbf{x}_{k+1} = \mathbf{F}_k \delta \mathbf{x}_k + \mathbf{i}_k$, 利用一阶泰勒展开($\Delta t$ 为 IMU 采样间隔):

离散噪声协方差 $\mathbf{Q}_k$:

其中 $\mathbf{Q}{imu} = \text{diag}(\sigma_a^2, \sigma_g^2, \sigma{ba}^2, \sigma_{bg}^2)$。

ESKF 完整流程

Step 1: 预测 (IMU 频率, 100Hz+)

  1. 名义状态更新:利用非线性公式积分 $\mathbf{x}_{k+1}$。
  2. 误差协方差更新:$\mathbf{P}_{k+1} = \mathbf{F}_k \mathbf{P}_k \mathbf{F}_k^T + \mathbf{Q}_k$。

Step 2: 观测更新 (GPS/Lidar 频率, 10Hz)

当观测 $\mathbf{y}$ 到来(例如 GPS 位置):

  1. 计算残差:$\mathbf{r} = \mathbf{y}{GPS} - \mathbf{p}{nominal}$。
  2. 构建 Jacobian:$\mathbf{H} = [\mathbf{I}, \mathbf{0}, \mathbf{0}, \mathbf{0}, \mathbf{0}]$。
  3. 计算增益:$\mathbf{K} = \mathbf{P} \mathbf{H}^T (\mathbf{H} \mathbf{P} \mathbf{H}^T + \mathbf{V})^{-1}$。
  4. 计算误差:$\delta \mathbf{x} = \mathbf{K} \mathbf{r}$。

Step 3: 误差注入 (Injection)

将估计出的误差 $\delta \mathbf{x}$ 融合进名义状态:

Step 4: 重置 (Reset)

误差已经注入名义状态,因此误差状态清零,但其不确定性需要保留:

(严谨的 ESKF 这里需要进行 Jacobian 投影,但在小误差假设下通常近似为上述公式)