EKF 算法详解
对于高斯白噪声的非线性系统:
\[
x_{k + 1} = f(x_k) + w_k\\
z_k = h(x_k) + v_k
\]
其中\(x_k\)为状态向量,\(z_k\)为量测向量,\(f(.), h(.)\)分别为系统非线性状态函数和量测函数,\(w_k,v_k\)分别为零均值,协方差为\(Q_k,R_k\)的高斯白噪声。
假设已知k时刻的状态估计值\(\hat {x_{k|k}}\)和协方差\(P_{k|k}\),将非线性函数\(f(x_k)\)在\(\hat{x_{k|k}}\)处一阶泰勒展开,得:
\[
f(x_k) = f(\hat{x_{k|k}}) + \frac{\partial f}{\partial x_k} |_{x_k = \hat{x_{k|k}}} (x_k - \hat{x_{k|k}}) + o(x_k - \hat{x_{k|k}})
\]
其中\(o(x_k - \hat{x_{k|k}})\)为高阶项,可以忽略不计,定义\(\frac{\partial f}{\partial x_k} |_{x_k = \hat{x_{k|k}}} = F_k\),则,状态方程简化为:
\[
f(x_k) = f(\hat{x_{k|k}}) + F_x(x_k - \hat{x_{k|k}}) + w_k
\]
进行一次状态预测,得到:
\[
\hat{x}_{k+1 \mid k}=\mathbf{E}\left[f\left(\hat{x}_{k \mid k}\right)+F_{k}\left(x_{k}-\hat{x}_{k \mid k}\right)+w_{k}\right]=f\left(\hat{x}_{k \mid k}\right)
\]
\[
\begin{aligned}
P_{k+1 \mid k} &=\mathbf{E}\left[\left(x_{k+1}-\hat{x}_{k+1 \mid k}\right)\left(x_{k+1}-\hat{x}_{k+1 \mid k}\right)^{\mathrm{T}}\right] \\
&=\mathbf{E}\left\{\left[F_{k}\left(x_{k}-\hat{x}_{k \mid k}\right)+w_{k}\right]\left[F_{k}\left(x_{k}-\hat{x}_{k \mid k}\right)+w_{k}\right]^{\mathrm{T}}\right\} \\
&=F_{k} P_{k \mid k} F_{k}^{\mathrm{T}}+\mathrm{Q}_{\mathrm{k}}
\end{aligned}
\]
将非线性函数\(h(.)\)在状态预测\(\hat{x_{k+1|k}}\)处一阶泰勒展开,得:
\[
\boldsymbol{h}\left(\boldsymbol{x}_{k+1}\right)=\boldsymbol{h}\left(\hat{\boldsymbol{x}}_{k+1 \mid k}\right)+\left.\frac{\partial \boldsymbol{h}}{\partial x_{k+1}}\right|_{x_{k+1}=\hat{x}_{k+1|
k}}\left(x_{k+1}-\hat{\boldsymbol{x}}_{k+1 \mid k}\right)+\boldsymbol{o}\left(\boldsymbol{x}_{k+1}-\hat{\boldsymbol{x}}_{k+1 \mid k}\right)
\]
忽略高阶项,简化为:
\[
z_{k+1}=\boldsymbol{h}\left(\hat{x}_{k+1 \mid k}\right)+\boldsymbol{H}_{k+1}\left(x_{k+1}-\hat{\boldsymbol{x}}_{k+1 \mid k}\right)+\boldsymbol{v}_{k+1}
\]
进行一次量测更新:
均值:
\[
\hat{z}_{k+1}=\mathrm{E}\left[\boldsymbol{h}\left(\hat{x}_{k+1 \mid k}\right)+H_{k+1}\left(x_{k+1}-\hat{x}_{k+1 \mid k}\right)+v_{k+1}\right]=h\left(\hat{x}_{k+1 \mid k}\right)
\]
量测预测误差协方差矩阵:
\[
\begin{aligned}
\boldsymbol{P}_{z z, k+1 \mid k} &=\mathbf{E}\left[\left(z_{k+1}-\hat{\boldsymbol{z}}_{k+1}\right)\left(z_{k+1}-\hat{\boldsymbol{z}}_{k+1}\right)^{\mathrm{T}}\right] \\
&=\mathbf{E}\left\{\left[\boldsymbol{H}_{k+1}\left(\boldsymbol{x}_{k+1}-\hat{\boldsymbol{x}}_{k+1 \mid k}\right)+\boldsymbol{v}_{k+1}\right]\left[\boldsymbol{H}_{k+1}\left(\boldsymbol{x}_{k+1}-\hat{\boldsymbol{x}}_{k+1 \mid k}\right)+\boldsymbol{v}_{k+1}\right]^{\mathrm{T}}\right\} \\
&=\boldsymbol{H}_{k+1} \boldsymbol{P}_{k+1 \mid k} \boldsymbol{H}_{k+1}^{\mathrm{T}}+\boldsymbol{R}_{k+1}
\end{aligned}
\]
状态与量测间协方差矩阵:
\[
\begin{aligned}
P_{x z, k+1 \mid k} &=\mathbf{E}\left[\left(\boldsymbol{x}_{k+1}-\hat{\boldsymbol{x}}_{k+1}\right)\left(z_{k+1}-\hat{z}_{k+1}\right)^{\mathrm{T}}\right] \\
&=\mathbf{E}\left\{\left(\boldsymbol{x}_{k+1}-\hat{\boldsymbol{x}}_{k+1}\right)\left[\boldsymbol{H}_{k+1}\left(\boldsymbol{x}_{k+1}-\hat{\boldsymbol{x}}_{k+1 \mid k}\right)+\boldsymbol{v}_{k+1}\right]^{\mathrm{T}}\right\} \\
&=\boldsymbol{P}_{k+1 \mid k} \boldsymbol{H}_{k+1}^{\mathrm{T}}
\end{aligned}
\]
状态增益矩阵:
\[
K_{k+1}=P_{x z, k+1 \mid k}\left(P_{z z, k+1 \mid k}\right)^{-1}=P_{k+1 \mid k} H_{k+1}^{\mathrm{T}}\left(H_{k+1} P_{k+1 \mid k} H_{k+1}^{\mathrm{T}}+R_{k+1}\right)^{-1}
\]
k+1时刻状态估计值:
\[
\hat{\boldsymbol{x}}_{k+1 \mid \mathrm{k}+1}=\hat{\boldsymbol{x}}_{k+1 \mid \mathrm{k}}+K_{k+1}\left(\mathrm{z}_{\mathrm{k}+1}-\hat{\mathbf{z}}_{\mathrm{k}+1 \mid \mathrm{k}}\right)
\]
状态估计协方差矩阵:
\[
\begin{aligned}
P_{k+1 \mid k+1} &=\mathrm{E}\left[\left(x_{k+1}-\hat{x}_{k+1 \mid \mathrm{k}+1}\right)\left(x_{k+1}-\hat{x}_{k+1 \mid \mathrm{k}+1}\right)^{\mathrm{T}}\right] \\
&=\mathrm{E}\left\{\left[x_{k+1}-\hat{x}_{k+1 \mid \mathrm{k}}-K_{k+1}\left(\mathbf{z}_{\mathrm{k}+1}-\hat{\mathrm{z}}_{\mathrm{k}+1 |\mathrm{k}}\right)\right]\left[x_{k+1}-\hat{x}_{k+1 \mid \mathrm{k}}-K_{k+1}\left(\mathbf{z}_{\mathrm{k}+1}-\hat{\mathbf{z}}_{\mathrm{k}+1 \mid \mathrm{k}}\right)\right]^{\mathrm{T}}\right\} \\
&=\left(I-K_{k+1} H_{k+1}\right) P_{k+1 \mid \mathrm{k}}\left(I-K_{k+1} H_{k+1}\right)^{T}+K_{k+1} R_{k+1} K_{k+1}^{T} \\
&=\left(I-K_{k+1} H_{k+1}\right) P_{k+1 |\mathrm{k}}
\end{aligned}
\]
ESKF 算法详解
设ESKF真值状态为:\(\mathbf{x}_t = [\mathbf{p}_t, \mathbf{v}_t, \mathbf{R}_t, \mathbf{b}_{at}, \mathbf{b}_{gt}, \mathbf{g}_t]^\mathrm{T}\), IMU观测值为\(\tilde{\boldsymbol{\omega}}, \tilde{\mathbf{a}}\)。可以写出状态变量与观测之间的关系:
\[
\begin{aligned} \dot{\mathbf{p}}_t &= \mathbf{v}_t \\
\dot{\mathbf{v}}_t &= \mathbf{R}_t (\tilde{\mathbf{a}} - \mathbf{b}_{at} - \boldsymbol{\eta}_a) + \mathbf{g} \\
\dot{\mathbf{R}}_t &= \mathbf{R}_t \ \left( \tilde{\boldsymbol{\omega}} - \mathbf{b}_{gt} - \boldsymbol{\eta}_g \right)^\wedge \\
\dot{\mathbf{b}}_{gt} & = \boldsymbol{\eta}_{bg} \\
\dot{\mathbf{b}}_{at} & = \boldsymbol{\eta}_{ba} \\
\dot{\mathbf{g}} &= \mathbf{0} \end{aligned}
\]
定义误差状态为:
\[
\delta \mathbf{x} =
\begin{bmatrix}
\delta \mathbf{p} \\
\delta \mathbf{v} \\
\delta \boldsymbol{\theta} \\
\delta \mathbf{b}_a \\
\delta \mathbf{b}_g
\end{bmatrix}
\in \mathbb{R}^{15 \times 1}
\]
那么error状态和nomal状态可以表示为:
\[
\begin{aligned}
\mathbf{p}_t &= \mathbf{p} + \delta \mathbf{p} \\
\mathbf{v}_t &= \mathbf{v} + \delta \mathbf{v} \\
\mathbf{R}_t &= \mathbf{R} \delta \mathbf{R} \quad \text{或} \ \mathbf{q}_t = \mathbf{q} \delta \mathbf{q} \quad \text{或} \mathbf{R}_t = \mathbf{R} \mathrm{Exp}(\delta \boldsymbol{\theta}) \\
\mathbf{b}_{gt} &= \mathbf{b}_g + \delta \mathbf{b}_g \\
\mathbf{b}_{at} &= \mathbf{b}_a + \delta \mathbf{b}_a \\
\mathbf{g}_t &= \mathbf{g} + \delta \mathbf{g}
\end{aligned}
\]
关于误差的导数,可以得到:
\[
\begin{aligned}
\delta \dot{\mathbf{p}} &= \delta \mathbf{v} \\
\delta \dot{\mathbf{v}} &= - \mathbf{R}(\tilde{\mathbf{a}} - \mathbf{b}_a)^\wedge \delta \boldsymbol{\theta} - \mathbf{R} \delta \mathbf{b}_a - \boldsymbol{\eta}_a + \delta \mathbf{g} \\
\delta \dot{\boldsymbol{\theta}} &\approx -(\tilde{\boldsymbol{\omega}} - \mathbf{b}_g)^\wedge \delta \boldsymbol{\theta} - \delta \mathbf{b}_g - \boldsymbol{\eta}_g \\
\delta \dot{\mathbf{b}_g} &= \boldsymbol{\eta}_g \\
\delta \dot{\mathbf{b}_a} &= \boldsymbol{\eta}_a \\
\delta \mathbf{g} &= \mathbf{0} \end{aligned}
\]
误差状态位置项推导
\[
\dot{\delta p_t} = \dot{p_t} - \dot{p} = v_t -v = \delta v
\]
误差状态加速度bias项推导
\[
\dot{\delta b_a} = \dot{b_{at}} - \dot{b_a} = \boldsymbol{\eta}_a
\]
误差状态角速度bias项推导
\[
\dot{\delta b_g} = \dot{b_{gt}} - \dot{b_g} = \boldsymbol{\eta}_g
\]
误差状态的速度项推导
对两侧求时间导数,就可以得到\(\delta \dot{\mathbf{v}}\)的表达式,等式左侧:
\[
\begin{aligned}
\dot{\mathbf{v}}_t &= \mathbf{R}_t(\tilde{\mathbf{a}} - \mathbf{b}_{at} - \boldsymbol{\eta}_a) + \mathbf{g}_t \\ &= \mathbf{R} \mathrm{Exp}(\delta \boldsymbol{\theta}) (\tilde{\mathbf{a}} - \mathbf{b}_a - \delta \mathbf{b}_a - \boldsymbol{\eta}_a ) + \mathbf{g} + \delta \mathbf{g} \\ &\approx \mathbf{R} (\mathbf{I} + \delta \boldsymbol{\theta}^\wedge ) (\tilde{\mathbf{a}} - \mathbf{b}_a - \delta \mathbf{b}_a - \boldsymbol{\eta}_a) + \mathbf{g} + \delta \mathbf{g} \\ &\approx \mathbf{R} \tilde{\mathbf{a}} - \mathbf{R} \mathbf{b}_a - \mathbf{R} \delta \mathbf{b}_a - \mathbf{R} \boldsymbol{\eta}_a + \mathbf{R} \delta \boldsymbol{\theta}^\wedge \mathbf{a} - \mathbf{R} \delta \boldsymbol{\theta}^\wedge \mathbf{b}_a + \mathbf{g} + \delta \mathbf{g} \\ &= \mathbf{R} \tilde{\mathbf{a}} - \mathbf{R} \mathbf{b}_a - \mathbf{R} \delta \mathbf{b}_a - \mathbf{R} \boldsymbol{\eta}_a - \mathbf{R} \tilde{\mathbf{a}}^\wedge \delta \boldsymbol{\theta} + \mathbf{R} \mathbf{b}_a^\wedge \delta\boldsymbol{\theta} + \mathbf{g} + \delta \mathbf{g}
\end{aligned}
\]
从第三行推向第四行时,需要忽略\(\delta \boldsymbol{\theta}^\wedge\)与\(\delta \mathbf{b}_a, \boldsymbol{\eta}_a\)相乘的二阶小量。从第四行推第五行则用到了叉乘符号交换顺序之后需加负号的性质。等式右侧为:
\[
\dot{\mathbf{v}} + \delta \dot{\mathbf{v}} = \mathbf{R}(\tilde{\mathbf{a}} - \mathbf{b}_a) + \mathbf{g} + \delta \dot{\mathbf{v}}
\]
两式相等,得到:
\[
\delta \dot{\mathbf{v}} = - \mathbf{R}(\tilde{\mathbf{a}} - \mathbf{b}_a)^\wedge \delta \boldsymbol{\theta} - \mathbf{R} \delta \mathbf{b}_a - \mathbf{R} \boldsymbol{\eta}_a + \delta \mathbf{g}
\]
这样就得到了\(\delta \mathbf{v}\)的运动学,由于\(\boldsymbol{\eta}_a\)是零均值白噪声,它乘上任意旋转矩阵之后仍然是一个零均值白噪声,\(\mathbf{R}^\mathrm{T} \mathbf{R} = \mathbf{I}\),其协方差矩阵也不变,可以简化得到:
\[
\delta \dot{\mathbf{v}} = - \mathbf{R}(\tilde{\mathbf{a}} - \mathbf{b}_a)^\wedge \delta \boldsymbol{\theta} - \mathbf{R} \delta \mathbf{b}_a - \boldsymbol{\eta}_a + \delta \mathbf{g}
\]
误差状态的旋转项推导
对旋转项两边对时间求导,得:
\[
\begin{aligned} \dot{\mathbf{R}}_t &= \dot{\mathbf{R}} \mathrm{Exp} (\delta \boldsymbol{\theta}) + \mathbf{R} \dot{\mathrm{Exp}(\delta \boldsymbol{\theta})} \\ &= \mathbf{R}_t \left( \tilde{\boldsymbol{\omega}} - \mathbf{b}_{gt} - \boldsymbol{\eta}_g \right) ^\wedge \end{aligned}
\]
其中:
\[
\dot{\mathrm{Exp}(\delta \boldsymbol{\theta})} = \mathrm{Exp}(\delta \boldsymbol{\theta}) \delta \dot{\boldsymbol{\theta}}^\wedge.
\]
可得到:
\[
\begin{aligned} \dot{\mathbf{R}} \mathrm{Exp} (\delta \boldsymbol{\theta}) + \mathbf{R} \dot{\mathrm{Exp}(\delta \boldsymbol{\theta})} &= \mathbf{R} (\tilde{\boldsymbol{\omega}}-\mathbf{b}_g)^\wedge \mathrm{Exp}(\delta \boldsymbol{\theta}) + \mathbf{R} \mathrm{Exp}(\delta \boldsymbol{\theta} ) \delta \dot{\boldsymbol{\theta}}^\wedge \\ \end{aligned}
\]
由于:
\[
\begin{aligned} \mathbf{R}_t \left( \tilde{\boldsymbol{\omega}} - \mathbf{b}_{gt} - \boldsymbol{\eta}_g \right)^\wedge &= \mathbf{R} \mathrm{Exp} (\delta \boldsymbol{\theta}) \left( \tilde{\boldsymbol{\omega}} - \mathbf{b}_{gt} - \boldsymbol{\eta}_g \right)^\wedge \\ \end{aligned}
\]
将\(\delta \dot{\boldsymbol{\theta}}\)移到一侧,约掉两侧左边的\(\mathbf{R}\),得到:
\[
\begin{aligned} \mathrm{Exp} (\delta \boldsymbol{\theta}) \delta \dot{\boldsymbol{\theta}}^\wedge &= \mathrm{Exp} (\delta \boldsymbol{\theta}) \left( \tilde{\boldsymbol{\omega}} - \mathbf{b}_{gt} - \boldsymbol{\eta}_g \right)^\wedge - (\tilde{\boldsymbol{\omega}}-\mathbf{b}_g)^\wedge \mathrm{Exp}(\delta \boldsymbol{\theta}) \end{aligned}
\]
其中\(\mathrm{Exp}(\delta \boldsymbol{\theta})\)是一个\(\mathrm{SO}(3)\)矩阵,利用伴随性质:
\[
\boldsymbol{\phi}^\wedge \mathbf{R} = \mathbf{R} (\mathbf{R}^\mathrm{T} \boldsymbol{\phi})^\wedge
\]
得到:
\[
\begin{aligned} \mathrm{Exp} (\delta \boldsymbol{\theta}) \delta \dot{\boldsymbol{\theta}}^\wedge &= \mathrm{Exp} (\delta \boldsymbol{\theta}) \left( \tilde{\boldsymbol{\omega}} - \mathbf{b}_{gt} - \boldsymbol{\eta}_g \right)^\wedge - \mathrm{Exp} (\delta \boldsymbol{\theta}) \left( \mathrm{Exp} (-\delta \boldsymbol{\theta}) (\tilde{\boldsymbol{\omega}}-\mathbf{b}_g) \right)^\wedge \\ &= \mathrm{Exp} (\delta \boldsymbol{\theta}) \left[ (\tilde{\boldsymbol{\omega}} - \mathbf{b}_{gt} - \boldsymbol{\eta}_g)^\wedge - (\mathrm{Exp} (-\delta \boldsymbol{\theta}) (\tilde{\boldsymbol{\omega}}-\mathbf{b}_g) )^\wedge \right] \\ &\approx \mathrm{Exp} (\delta \boldsymbol{\theta}) \left[ (\tilde{\boldsymbol{\omega}} - \mathbf{b}_{gt} - \boldsymbol{\eta}_g)^\wedge - \left((\mathbf{I} - \delta \boldsymbol{\theta}^\wedge)(\tilde{\boldsymbol{\omega}}-\mathbf{b}_g )\right)^\wedge \right] \\ &= \mathrm{Exp} (\delta \boldsymbol{\theta}) \left[ \mathbf{b}_g - \mathbf{b}_{gt} -\boldsymbol{\eta}_g + \delta \boldsymbol{\theta}^\wedge \tilde{\boldsymbol{\omega}} - \delta \boldsymbol{\theta}^\wedge \mathbf{b}_{g} \right]^\wedge \\ &= \mathrm{Exp} (\delta \boldsymbol{\theta}) \left[ (-\tilde{\boldsymbol{\omega}}+\mathbf{b}_g)^\wedge \delta \boldsymbol{\theta} - \delta \mathbf{b}_g - \boldsymbol{\eta}_g \right]^\wedge \end{aligned}
\]
约掉等式左侧的系数,得:
\[
\delta \dot{\boldsymbol{\theta}} \approx -(\tilde{\boldsymbol{\omega}} - \mathbf{b}_g)^\wedge \delta \boldsymbol{\theta} - \delta \mathbf{b}_g - \boldsymbol{\eta}_g
\]
对于离散时间状态方程,nomal状态运动学方程可以写为:
\[
\begin{aligned}
\mathbf{p}(t+\Delta t) &= \mathbf{p}(t) + \mathbf{v} \Delta t + \frac{1}{2} \left(\mathbf{R}(\tilde{\mathbf{a}}-\mathbf{b}_a) \right) \Delta t^2 + \frac{1}{2} \mathbf{g} \Delta t^2\\
\mathbf{v}(t+\Delta t) &= \mathbf{v}(t) + \mathbf{R} (\tilde{\mathbf{a}} - \mathbf{b}_a) \Delta t + \mathbf{g} \Delta t \\
\mathbf{R}(t+\Delta t) &= \mathbf{R}(t) \mathrm{Exp} \left( (\tilde{\boldsymbol{\omega}}-\mathbf{b}_g) \Delta t \right)\\
\mathbf{b}_g(t+\Delta t) &= \mathbf{b}_g(t) \\
\mathbf{b}_a(t+\Delta t) &= \mathbf{b}_a(t) \\
\mathbf{g}(t+\Delta t) &= \mathbf{g}(t)
\end{aligned}
\]
对应的误差状态方程可写为:
\[
\begin{aligned}
\delta \mathbf{p}(t+\Delta t) &= \delta \mathbf{p} + \delta \mathbf{v} \Delta t \\
\delta \mathbf{v}(t+\Delta t) &= \delta \mathbf{v} + \left( - \mathbf{R}(\tilde{\mathbf{a}} - \mathbf{b}_a)^\wedge \delta \boldsymbol{\theta} - \mathbf{R} \delta \mathbf{b}_a + \delta \mathbf{g} \right) \Delta t + \boldsymbol{\eta}_{v} \\
\delta \boldsymbol{\theta} (t+\Delta t) &= \mathrm{Exp}\left( -(\tilde{\boldsymbol{\omega}} - \mathbf{b}_g) \Delta t \right) \delta \boldsymbol{\theta} - \delta \mathbf{b}_g \Delta t - \boldsymbol{\eta}_{\theta} \\
\delta \mathbf{b}_g (t+\Delta t) &= \delta \mathbf{b}_g + \boldsymbol{\eta}_g \\
\delta \mathbf{b}_a (t+\Delta t)&= \delta \mathbf{b}_a + \boldsymbol{\eta}_a \\
\delta \mathbf{g} (t+\Delta t) &= \delta \mathbf{g}
\end{aligned}
\]
噪声项并不参与递推,需要把它们单独归入噪声部分中。连续时间的噪声项可以视为随机过程的能量谱密度,而离散时间下的噪声变量就是我们日常看到的随机变量了。这些噪声随机变量的标准差可以列写如下:
\[
\begin{aligned}
\sigma(\boldsymbol{\eta}_v) = \Delta t \sigma_a, \quad \sigma(\boldsymbol{\eta}_{\theta}) = \Delta t \sigma_{g}, \quad \sigma(\boldsymbol{\eta}_g) = \sqrt{\Delta t} \sigma_{bg}, \quad \sigma(\boldsymbol{\eta}_a) = \sqrt{\Delta t} \sigma_{ba}
\end{aligned}
\]
ESKF预测过程
误差状态\(\delta \mathbf{x}\)离散时间运动方程已经给出,整体记为:
\[
\delta \mathbf{x} = f(\delta \mathbf{x}) + \mathbf{w}, \mathbf{w} \sim \mathcal{N}(0, \mathbf{Q})
\]
其中\(\mathbf{w}\)为噪声,\(\mathbf{Q}\)为:
\[
\mathbf{Q} = \mathrm{diag}(\mathbf{0}_3, \mathrm{Cov}(\boldsymbol{\eta}_v), \mathrm{Cov}(\boldsymbol{\eta}_{\theta}), \mathrm{Cov}(\boldsymbol{\eta}_{g}), \mathrm{Cov}(\boldsymbol{\eta}_{a}), \mathbf{0}_3)
\]
由于第一个和最后一个方程本身没有噪声,所以为零。
线性化,得:
\[
\delta \mathbf{x} = \mathbf{F_x} \delta \mathbf{x} + \mathbf{F_i}\mathbf{w}
\]
其中\(\mathbf{F}\)为线性化后的雅可比举证,由于运动方程已经是线性化的,只需要拼接成矩阵即可。
\[
\mathbf{F_x} = \left.\frac{\partial f}{\partial \delta \mathbf{x}}\right|_{\mathbf{x}, \mathbf{u}_{m}} =
\begin{bmatrix}
\mathbf{I} & \mathbf{I} \Delta t & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} \\
\mathbf{0} & \mathbf{I} & - \mathbf{R}(\tilde{\mathbf{a}} - \mathbf{b}_a)^\wedge \Delta t & -\mathbf{R} \Delta t & \mathbf{0} & \mathbf{I} \Delta t \\
\mathbf{0} & \mathbf{0} & \mathrm{Exp}\left( -(\tilde{\boldsymbol{\omega}} - \mathbf{b}_g) \Delta t \right) & \mathbf{0} & -\mathbf{I} \Delta t & \mathbf{0} \\
\mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} & \mathbf{0} & \mathbf{0} \\
\mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I} & \mathbf{0} \\
\mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{0} & \mathbf{I}
\end{bmatrix}
\]
\[
\mathbf{F}_{\mathbf{i}}=
\left.\frac{\partial f}{\partial \mathbf{i}}\right|_{\mathbf{x}, \mathbf{u}_{m}}=
\left[\begin{array}{llll}
0 & 0 & 0 & 0 \\
\mathbf{I} & 0 & 0 & 0 \\
0 & \mathbf{I} & 0 & 0 \\
0 & 0 & \mathbf{I} & 0 \\
0 & 0 & 0 & \mathbf{I} \\
0 & 0 & 0 & 0
\end{array}\right]
\]
\[
\mathbf{Q}_{\mathbf{i}}=
\left[\begin{array}{cccc}
\mathbf{V}_{\mathbf{i}} & 0 & 0 & 0 \\
0 & \boldsymbol{\Theta}_{\mathbf{i}} & 0 & 0 \\
0 & 0 & \mathbf{A}_{\mathbf{i}} & 0 \\
0 & 0 & 0 & \Omega_{\mathbf{i}}
\end{array}\right]
\]
均值和协方差预测如下:
\[
\begin{aligned}
\delta \mathbf{x}_{\mathrm{pred}} &= \mathbf{F} \delta \mathbf{x} \\
\mathbf{P}_{\mathrm{pred}} &= \mathbf{F} \mathbf{P} \mathbf{F}^\mathrm{T} + \mathbf{F_i}\mathbf{Q} \mathbf{F_i}^{\mathrm{T}}
\end{aligned}
\]
由于ESKF的误差状态在每次更新以后会被重置,因此运动方程的均值部分没有太大意义,而方差部分则可以指导整个误差估计的分布情况。
ESKF修正过程
假设一个抽象的传感器能够对状态变量产生观测,其观测方程为抽象的\(h\),可写为:
\[
\mathbf{z} = h(\mathbf{x}) + \mathbf{v}, \mathbf{v} \sim \mathcal{N}(0, \mathbf{V})
\]
其中\(\mathbf{z}\)为观测数据,\(\mathbf{v}\)为观测噪声,\(\mathbf{V}\)为该噪声的协方差矩阵。
在传统EKF中,我们可以直观对观测方程线性化,求出观测方程相对于状态变量的雅可比矩阵,进而更新卡尔曼滤波器。而在ESKF中,我们当前拥有名义状态\(\mathbf{x}\)的估计以及误差状态\(\mathbf{\delta x}\)的估计,且希望更新的是误差状态,因此要计算观测方程相比于误差状态的雅可比矩阵:
\[
\mathbf{H} = \frac{\partial h}{\partial \delta \mathbf{x}},
\]
卡尔曼增益,均值和协方差更新如下:
\[
\begin{aligned}
\mathbf{K} &= \mathbf{P}_{\mathrm{pred}} \mathbf{H}^\mathrm{T}(\mathbf{H} \mathbf{P}_{\mathrm{pred}} \mathbf{H}^\mathrm{T} + \mathbf{V})^{-1} \\
\delta \mathbf{x} &= \mathbf{K} (\mathbf{z} - h(\mathbf{x}_t)) \\
\mathbf{P} &= (\mathbf{I} - \mathbf{K} \mathbf{H}) \mathbf{P}_{\mathrm{pred}}
\end{aligned}
\]
其中\(\mathbf{K}\)为卡尔曼增益,\(\mathbf{P_{pred}}\)为预测的协方差矩阵,最后的\(\mathbf{P}\)为修正后的协方差矩阵.
其中\(\mathbf{H}\)的计算可以通过链式法则来生成:
\[
\mathbf{H} = \frac{\partial h}{\partial \mathbf{x}} \frac{\partial \mathbf{x}}{\partial \delta \mathbf{x}}
\]
其中第一项只需对观测方程进行线性化,第二项,根据我们之前对状态变量的定义,可以得到:
\[
\begin{aligned}
\frac{\partial \mathbf{x}}{\partial \delta \mathbf{x}} &= \mathrm{diag}(\mathbf{I}_3, \mathbf{I}_3, \frac{\partial \mathrm{Log} (\mathbf{R}(\mathrm{Exp}(\delta \boldsymbol{\theta})))}{\partial \delta \boldsymbol{\theta}}, \mathbf{I}_3, \mathbf{I}_3, \mathbf{I}_3) \\
&=\left[\begin{array}{ccccc}
\frac{\partial(\mathbf{p}+\delta \mathbf{p})}{\partial \delta \mathbf{p}} & 0 & 0 & 0 & 0 & 0\\
0 & \frac{\partial(\mathbf{v}+\delta \mathbf{v})}{\partial \delta \mathbf{v}} & 0 & 0 & 0 & 0 \\
0 & 0 & \frac{\partial( \mathbf{R}(\mathrm{Exp}(\delta \boldsymbol{\theta})) )}{\partial \delta \theta} & 0 & 0 & 0 \\
0 & 0 & 0 & \frac{\partial\left(\mathbf{a}_{b}+\delta \mathbf{a}_{b}\right)}{\partial \delta \mathbf{a}_{b}} & 0 & 0 \\
0 & 0 & 0 & 0 & \frac{\partial\left(\boldsymbol{\omega}_{b}+\delta \omega_{b}\right)}{\partial \delta \omega_{b}} & 0\\
0& 0 & 0 & 0 & 0 & \frac{\partial(\mathbf{g}+\delta \mathbf{g})}{\partial \delta \mathbf{g}}
\end{array}\right]
\end{aligned}
\]
对于旋转部分,\(\delta\mathbf{\theta}\)定义为\(\mathbf{R}\)的右乘,使用右乘BCH可得:
\[
\begin{aligned}
\frac{\partial \mathrm{Log} (\mathbf{R}(\mathrm{Exp}(\delta \boldsymbol{\theta})))}{\partial \delta \boldsymbol{\theta}} = \mathbf{J}_r^{-1} (\mathbf{R})
\end{aligned}
\]
在经过预测和更新过程之后,我们修正了误差状态的估计。接下来,只需把误差状态归入nomal状态,然后重置滤波器:
\[
\mathbf{x}_{k+1} = \mathbf{x}_k \oplus \delta \mathbf{x}_{k}
\]
即:
\[
\begin{aligned}
\mathbf{p}_{k+1} &= \mathbf{p}_k + \delta \mathbf{p}_k \\
\mathbf{v}_{k+1} &= \mathbf{v}_k + \delta \mathbf{v}_k \\
\mathbf{R}_{k+1} &= \mathbf{R}_k \mathrm{Exp}(\delta \boldsymbol{\theta}_k) \\
\mathbf{b}_{g, k+1} &= \mathbf{b}_{g,k} + \delta \mathbf{b}_{g,k} \\
\mathbf{b}_{a, k+1} &= \mathbf{b}_{a,k} + \delta \mathbf{b}_{a,k} \\
\mathbf{g}_{k+1} &= \mathbf{g}_{k} + \delta \mathbf{g}_{k}
\end{aligned}
\]
Reference
[1] Quaternion kinematics for the error-state Kalman filter
[2] https://github.com/MapIV/eagleye
[3] https://ahrs.readthedocs.io/en/latest/filters/ekf.html
[4] https://zhuanlan.zhihu.com/p/441182819