本节默认你能够完整推导标准卡尔曼滤波,将会简化一些推导的描述。如果你还不会完整推导标准卡尔曼滤波,请先从 【卡尔曼滤波理论推导与实践】系列开始看起。


非线性系统

扩展卡尔曼滤波解决的是非线性系统,其非线性状态空间方程为:
{ z k 模 ⃗ = f ( z k − 1 估 ⃗ , F k − 1 ) y k 测 ⃗ = h ( z k 测 ⃗ ) \begin{cases}\vec{z_{k模}}=\mathrm{f}(\vec{z_{k-1估}},F_{k-1})\\\vec{y_{k测}}=\mathrm{h}(\vec{z_{k测}})\end{cases} {zk模​ ​=f(zk−1估​ ​,Fk−1​)yk测​ ​=h(zk测​ ​)​
f , h \mathrm{f},\mathrm{h} f,h函数是向量函数,有多个输出 [ f 1 . . . f n ] \left[\begin{matrix}f_1\\...\\f_n\\\end{matrix}\right] ​f1​...fn​​ ​, n n n是 z ⃗ \vec{z} z 的维数,比如追踪平面图像物体坐标和速度, z ⃗ = [ x y v x v y ] \vec{z}=\left[\begin{matrix}x\\y\\v_x\\v_y\end{matrix}\right] z = ​xyvx​vy​​ ​。
其非线性真实系统模型为:
{ z k 真 ⃗ = f ( z k − 1 真 ⃗ , F k − 1 , w k − 1 ⃗ ) y k 测 ⃗ = h ( z k 真 ⃗ , v k ⃗ ) \begin{cases}\vec{z_{k真}}=\mathrm{f}(\vec{z_{k-1真}},F_{k-1},\vec{w_{k-1}})\\\vec{y_{k测}}=\mathrm{h}(\vec{z_{k真}},\vec{v_k})\end{cases} {zk真​ ​=f(zk−1真​ ​,Fk−1​,wk−1​ ​)yk测​ ​=h(zk真​ ​,vk​ ​)​

因为非线性函数的期望不能用协方差矩阵描述,无法用卡尔曼滤波的套路进行推导,所以要进行线性化近似,这就是扩展卡尔曼滤波与标准卡尔曼滤波的唯一区别。

泰勒展开

扩展卡尔曼滤波使用泰勒展开进行线性化近似,扩展卡尔曼滤波是一个二元向量输入多输出系统,比如输入为 [ z k − 1 模 ⃗ , w k − 1 ⃗ ] [\vec{z_{k-1模}},\vec{w_{k-1}}] [zk−1模​ ​,wk−1​ ​],这有两列向量;输出为 z k 真 ⃗ \vec{z_{k真}} zk真​ ​这个向量。
这里有两个公式要提前知道:

  • 单输出的二元函数在 ( x 0 , y 0 ) (x_0,y_0) (x0​,y0​)点的泰勒展开公式:
    f ( x , y ) = f ( x 0 , x 0 ) + d f d x ∣ x 0 , y 0 ∗ ( x − x 0 ) + + d f d y ∣ x 0 , y 0 ∗ ( y − y 0 ) f(x,y)=f(x_0,x_0)+\frac{df}{dx}|_{x_0,y_0}*(x-x_0)++\frac{df}{dy}|_{x_0,y_0}*(y-y_0) f(x,y)=f(x0​,x0​)+dxdf​∣x0​,y0​​∗(x−x0​)++dydf​∣x0​,y0​​∗(y−y0​)
  • 多输出函数对输入向量求导公式:
    d f ⃗ ( x ⃗ ) d x ⃗ = [ d f 1 d x 1 d f 1 d x 2 ⋯ d f 1 d x m d f 2 d x 1 d f 2 d x 2 ⋯ d f 2 d x m ⋮ ⋮ ⋱ ⋮ d f n d x 1 d f n d x 2 ⋯ d f n d x m ] = 雅可比矩阵 \frac{d\vec{f}(\vec{x})}{d\vec{x}}=\left[\begin{matrix}\frac{d f_1}{d x_1} & \frac{d f_1}{dx_2} & \cdots & \frac{df_1}{dx_m} \\ \frac{df_2}{dx_1} & \frac{df_2}{dx_2} & \cdots & \frac{df_2}{dx_m} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{df_n}{dx_1} & \frac{df_n}{dx_2} & \cdots & \frac{df_n}{dx_m}\end{matrix}\right]=雅可比矩阵 dx df ​(x )​= ​dx1​df1​​dx1​df2​​⋮dx1​dfn​​​dx2​df1​​dx2​df2​​⋮dx2​dfn​​​⋯⋯⋱⋯​dxm​df1​​dxm​df2​​⋮dxm​dfn​​​ ​=雅可比矩阵

接下来进行泰勒展开:
记 f \mathrm{f} f对 z ⃗ \vec{z} z 求导的雅可比矩阵为 A \mathrm{A} A, f \mathrm{f} f对 w ⃗ \vec{w} w 求导的雅可比矩阵为 W \mathrm{W} W, h \mathrm{h} h对 z ⃗ \vec{z} z 求导的雅可比矩阵为 H \mathrm{H} H, h \mathrm{h} h对 v ⃗ \vec{v} v 求导的雅可比矩阵为 V \mathrm{V} V。
注意:

  • F k − 1 F_{k-1} Fk−1​是给定值而不是变量,不参与泰勒展开
  • 噪声的期望(平均值)是零,所以泰勒展开点的噪声值可以认为零

可以在任意已知点(比如模型值和上轮估计值都是已知的)展开,在哪个点展开都是为了方便推导。
测量方程在 z k 模 ⃗ \vec{z_{k模}} zk模​ ​处泰勒展开:
y k 测 ⃗ = h ( z k 模 ⃗ ) + H ∗ ( z k 测 ⃗ − z k 模 ⃗ ) \vec{y_{k测}}=h(\vec{z_{k模}})+\mathrm{H}*(\vec{z_{k测}}-\vec{z_{k模}}) yk测​ ​=h(zk模​ ​)+H∗(zk测​ ​−zk模​ ​)
真实系统模型分别在 ( z k − 1 估 ⃗ , 0 ⃗ ) , ( z k 模 ⃗ , 0 ⃗ ) (\vec{z_{k-1估}},\vec{0}),(\vec{z_{k模}},\vec{0}) (zk−1估​ ​,0 ),(zk模​ ​,0 )泰勒展开:
{ z k 真 ⃗ = f ( z k − 1 估 ⃗ , F k − 1 , 0 ⃗ ) + A ∗ ( z k − 1 真 ⃗ − z k − 1 估 ⃗ ) + W ∗ ( w k − 1 ⃗ − 0 ⃗ ) y k 测 ⃗ = h ( z k 模 ⃗ , 0 ⃗ ) + H ∗ ( z k 真 ⃗ − z k 模 ⃗ ) + V ∗ ( v k ⃗ − 0 ⃗ ) \begin{cases}\vec{z_{k真}}=f(\vec{z_{k-1估}},F_{k-1},\vec{0})+\mathrm{A}*(\vec{z_{k-1真}}-\vec{z_{k-1估}})+\mathrm{W}*(\vec{w_{k-1}}-\vec{0})\\\vec{y_{k测}}=h(\vec{z_{k模}},\vec{0})+\mathrm{H}*(\vec{z_{k真}}-\vec{z_{k模}})+\mathrm{V}*(\vec{v_k}-\vec{0})\end{cases} {zk真​ ​=f(zk−1估​ ​,Fk−1​,0 )+A∗(zk−1真​ ​−zk−1估​ ​)+W∗(wk−1​ ​−0 )yk测​ ​=h(zk模​ ​,0 )+H∗(zk真​ ​−zk模​ ​)+V∗(vk​ ​−0 )​

卡尔曼滤波

线性化后,接下来的推导过程和标准卡尔曼滤波不能说一摸一样,只能说九分甚至十分地相似。
这里再放一遍卡尔曼滤波核心思想:

用测量值修正系统模型值,得到当前轮次的最优估计值。再将该最优估计值当作下一轮的系统模型输入,继续进行下一轮的最优估计,如此迭代进行。

要最优化估计值,首先把估计值表达式写出来:
z k 估 ⃗ = z k 模 ⃗ + G k ∗ ( z k 测 ⃗ − z k 模 ⃗ ) \begin{aligned}\vec{z_{k估}}&=\vec{z_{k模}}+\mathrm{G_k}*(\vec{z_{k测}}-\vec{z_{k模}})&\end{aligned} zk估​ ​​=zk模​ ​+Gk​∗(zk测​ ​−zk模​ ​)​​
对 G \mathrm{G} G矩阵进行一个变换,出一个 y k 测 ⃗ \vec{y_{k测}} yk测​ ​出来,方便推导,令 G = K ∗ H \mathrm{G}=\mathrm{K}*\mathrm{H} G=K∗H,于是估计值表达式变为:
z k 估 ⃗ = z k 模 ⃗ + K k ∗ H ∗ ( z k 测 ⃗ − z k 模 ⃗ ) = z k 模 ⃗ + K k ∗ ( y k 测 ⃗ − h ( z k 模 ⃗ ) ) \begin{aligned}\vec{z_{k估}}&=\vec{z_{k模}}+\mathrm{K_k}*\mathrm{H}*(\vec{z_{k测}}-\vec{z_{k模}})\\&=\vec{z_{k模}}+\mathrm{K_k}*(\vec{y_{k测}}-h(\vec{z_{k模}}))\end{aligned} zk估​ ​​=zk模​ ​+Kk​∗H∗(zk测​ ​−zk模​ ​)=zk模​ ​+Kk​∗(yk测​ ​−h(zk模​ ​))​

卡尔曼增益

z k 估 ⃗ \vec{z_{k估}} zk估​ ​表达式右侧除了 K k \mathrm{K_k} Kk​不知道,其他都是已知数,继续推导 K k \mathrm{K_k} Kk​吧。那么就是推导最优估计下的 K k \mathrm{K_k} Kk​,就是使得估计误差协方差矩阵的迹最小,先把估计误差协方差矩阵写出来:
P k 估 = E [ e k 估 ⃗ e k 估 ⃗ T ] = E [ ( z k 真 ⃗ − z k 估 ⃗ ) ∗ ( z k 真 ⃗ − z k 估 ⃗ ) T ] \begin{aligned}\mathrm{P_{k估}}&=E[\vec{e_{k估}}\vec{e_{k估}}^T]\\&=E[(\vec{z_{k真}}-\vec{z_{k估}})*(\vec{z_{k真}}-\vec{z_{k估}})^T]\end{aligned} Pk估​​=E[ek估​ ​ek估​ ​T]=E[(zk真​ ​−zk估​ ​)∗(zk真​ ​−zk估​ ​)T]​

展开一下 z k 真 ⃗ − z k 估 ⃗ \vec{z_{k真}}-\vec{z_{k估}} zk真​ ​−zk估​ ​:
z k 真 ⃗ − z k 估 ⃗ = z k 真 ⃗ − z k 模 ⃗ − K k ∗ ( y k 测 ⃗ − h ( z k 模 ⃗ ) ) = e k 模 ⃗ − K k ∗ ( h ( z k 模 ⃗ , 0 ) + H ∗ ( z k 真 ⃗ − z k 模 ⃗ ) + V ∗ v k ⃗ − h ( z k 模 ⃗ ) ) = e k 模 ⃗ − K k ∗ ( H ∗ e k 模 ⃗ + V ∗ v k ⃗ ) = ( I − K k H ) e k 模 ⃗ − K k V ∗ v k ⃗ \begin{aligned}\vec{z_{k真}}-\vec{z_{k估}}&=\vec{z_{k真}}-\vec{z_{k模}}-\mathrm{K_k}*(\vec{y_{k测}}-\mathrm{h}(\vec{z_{k模}}))\\&=\vec{e_{k模}}-\mathrm{K_k}*(h(\vec{z_{k模}},0)+\mathrm{H}*(\vec{z_{k真}}-\vec{z_{k模}})+\mathrm{V}*\vec{v_k}-h(\vec{z_{k模}}))\\&=\vec{e_{k模}}-\mathrm{K_k}*(\mathrm{H}*\vec{e_{k模}}+\mathrm{V}*\vec{v_k})\\&=(\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}-\mathrm{K_k}\mathrm{V}*\vec{v_k}\end{aligned} zk真​ ​−zk估​ ​​=zk真​ ​−zk模​ ​−Kk​∗(yk测​ ​−h(zk模​ ​))=ek模​ ​−Kk​∗(h(zk模​ ​,0)+H∗(zk真​ ​−zk模​ ​)+V∗vk​ ​−h(zk模​ ​))=ek模​ ​−Kk​∗(H∗ek模​ ​+V∗vk​ ​)=(I−Kk​H)ek模​ ​−Kk​V∗vk​ ​​

P k 估 \mathrm{P_{k估}} Pk估​可以继续展开了:
P k 估 = E [ ( ( I − K k H ) e k 模 ⃗ − K k V ∗ v k ⃗ ) ∗ ( ( I − K k H ) e k 模 ⃗ − K k V ∗ v k ⃗ ) T ] = E [ ( ( I − K k H ) e k 模 ⃗ − K k V ∗ v k ⃗ ) ∗ ( e k 模 ⃗ T ( I − K k H ) T − v k ⃗ T V T K k T ) ] \begin{aligned}\mathrm{P_{k估}}&=E[((\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}-\mathrm{K_k}\mathrm{V}*\vec{v_k})*((\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}-\mathrm{K_k}\mathrm{V}*\vec{v_k})^T]\\&=E[((\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}-\mathrm{K_k}\mathrm{V}*\vec{v_k})*(\vec{e_{k模}}^T(\mathrm{I}-\mathrm{K_k}\mathrm{H})^T-\vec{v_k}^T\mathrm{V}^T\mathrm{K_k}^T)]\end{aligned} Pk估​​=E[((I−Kk​H)ek模​ ​−Kk​V∗vk​ ​)∗((I−Kk​H)ek模​ ​−Kk​V∗vk​ ​)T]=E[((I−Kk​H)ek模​ ​−Kk​V∗vk​ ​)∗(ek模​ ​T(I−Kk​H)T−vk​ ​TVTKk​T)]​
接下来将括号乘开。这里有两点有助于化简:噪声 v k ⃗ \vec{v_k} vk​ ​的期望是零,又与 e k 模 ⃗ \vec{e_{k模}} ek模​ ​相互独立,所以 v k ⃗ \vec{v_k} vk​ ​和 e k 模 ⃗ \vec{e_{k模}} ek模​ ​搭边的项都是零。
P k 估 = E [ ( I − K k H ) e k 模 ⃗ e k 模 ⃗ T ( I − K k H ) T + K k V ∗ v k ⃗ v k ⃗ T V T K k T ] = ( I − K k H ) P k 模 ( I − K k H ) T + K k V R V T K k T \begin{aligned}\mathrm{P_{k估}}&=E[(\mathrm{I}-\mathrm{K_k}\mathrm{H})\vec{e_{k模}}\vec{e_{k模}}^T(\mathrm{I}-\mathrm{K_k}\mathrm{H})^T+\mathrm{K_k}\mathrm{V}*\vec{v_k}\vec{v_k}^T\mathrm{V}^T\mathrm{K_k}^T]\\&=(\mathrm{I}-\mathrm{K_k}\mathrm{H})\mathrm{P_{k模}}(\mathrm{I}-\mathrm{K_k}\mathrm{H})^T+\mathrm{K_k}\mathrm{V}\mathrm{R}\mathrm{V}^T\mathrm{K_k}^T\end{aligned} Pk估​​=E[(I−Kk​H)ek模​ ​ek模​ ​T(I−Kk​H)T+Kk​V∗vk​ ​vk​ ​TVTKk​T]=(I−Kk​H)Pk模​(I−Kk​H)T+Kk​VRVTKk​T​
P k 估 \mathrm{P_{k估}} Pk估​的表达式也出来了, K k \mathrm{K_k} Kk​是自变量,想让 t r ( P k 估 ) tr(\mathrm{P_{k估}}) tr(Pk估​)最小,即最优估计。由于 t r ( P k 估 ) tr(\mathrm{P_{k估}}) tr(Pk估​)是二次函数,开口向上,极值点必定是极小值点,于是接下来准备 t r ( P k 估 ) d K k = 0 \frac{tr(\mathrm{P_{k估}})}{d\mathrm{K_k}}=0 dKk​tr(Pk估​)​=0。在算极值点前,有个矩阵求导公式需要提前知道:
d t r ( A B A T ) d A = 2 A B \frac{dtr(\mathrm{A}\mathrm{B}\mathrm{A}^T)}{d\mathrm{A}}=2\mathrm{A}\mathrm{B} dAdtr(ABAT)​=2AB
将 P k 估 \mathrm{P_{k估}} Pk估​的括号分解开,注意 V R V T \mathrm{V}\mathrm{R}\mathrm{V}^T VRVT看作一个整体,求导得到:
d P k 估 d K k = 2 ( I − K k H ) P k 模 ( − H T ) + 2 K k V R V T = 0 \begin{aligned}\frac{d\mathrm{P_{k估}}}{d\mathrm{K_k}}&=2(\mathrm{I}-\mathrm{K_k}\mathrm{H})\mathrm{P_{k模}}(-\mathrm{H}^T)+2\mathrm{K_k}\mathrm{V}\mathrm{R}\mathrm{V}^T\\&=0\end{aligned} dKk​dPk估​​​=2(I−Kk​H)Pk模​(−HT)+2Kk​VRVT=0​

K k \mathrm{K_k} Kk​这不就出来了,和标准卡尔曼滤波里的 K k \mathrm{K_k} Kk​挺像的:
K k = P k 模 H T H P k 模 H T + V R V T \mathrm{K_k}=\frac{\mathrm{P_{k模}}\mathrm{H}^T}{\mathrm{H}\mathrm{P_{k模}}\mathrm{H}^T+\mathrm{V}\mathrm{R}\mathrm{V}^T} Kk​=HPk模​HT+VRVTPk模​HT​

模型误差协方差矩阵

和标准卡尔曼滤波的推导套路一样,继续推导 P k 模 \mathrm{P_{k模}} Pk模​。
先把表达式搞出来:
P k 模 = E [ e k 模 ⃗ e k 模 ⃗ T ] = E [ ( z k 真 ⃗ − z k 模 ⃗ ) ∗ ( z k 真 ⃗ − z k 模 ⃗ ) T ] \begin{aligned}\mathrm{P_{k模}}&=E[\vec{e_{k模}}\vec{e_{k模}}^T]\\&=E[(\vec{z_{k真}}-\vec{z_{k模}})*(\vec{z_{k真}}-\vec{z_{k模}})^T]\end{aligned} Pk模​​=E[ek模​ ​ek模​ ​T]=E[(zk真​ ​−zk模​ ​)∗(zk真​ ​−zk模​ ​)T]​

展开一下 z k 真 ⃗ − z k 模 ⃗ \vec{z_{k真}}-\vec{z_{k模}} zk真​ ​−zk模​ ​:
z k 真 ⃗ − z k 模 ⃗ = f ( z k − 1 估 ⃗ , F k − 1 , 0 ) + A ∗ ( z k − 1 真 ⃗ − z k − 1 估 ⃗ ) + W ∗ w k − 1 ⃗ − f ( z k − 1 估 ⃗ , F k − 1 ) = A ( z k − 1 真 ⃗ − z k − 1 估 ⃗ ) + W ∗ w k − 1 ⃗ = A e k − 1 估 ⃗ + W w k − 1 ⃗ \begin{aligned}\vec{z_{k真}}-\vec{z_{k模}}&=f(\vec{z_{k-1估}},F_{k-1},0)+\mathrm{A}*(\vec{z_{k-1真}}-\vec{z_{k-1估}})+\mathrm{W}*\vec{w_{k-1}}-f(\vec{z_{k-1估}},F_{k-1})\\&=\mathrm{A}(\vec{z_{k-1真}}-\vec{z_{k-1估}})+\mathrm{W}*\vec{w_{k-1}}\\&=\mathrm{A}\vec{e_{k-1估}}+\mathrm{W}\vec{w_{k-1}}\end{aligned} zk真​ ​−zk模​ ​​=f(zk−1估​ ​,Fk−1​,0)+A∗(zk−1真​ ​−zk−1估​ ​)+W∗wk−1​ ​−f(zk−1估​ ​,Fk−1​)=A(zk−1真​ ​−zk−1估​ ​)+W∗wk−1​ ​=Aek−1估​ ​+Wwk−1​ ​​

P k 模 \mathrm{P_{k模}} Pk模​继续展开,展开后的表达式和标准卡尔曼滤波里的 P k 模 \mathrm{P_{k模}} Pk模​也挺像的:
P k 模 = E [ ( A e k − 1 估 ⃗ + W w k − 1 ⃗ ) ∗ ( A e k − 1 估 ⃗ + W w k − 1 ⃗ ) T ] = E [ ( A e k − 1 估 ⃗ + W w k − 1 ⃗ ) ∗ ( e k − 1 估 ⃗ T A T + w k − 1 ⃗ T W T ) ] = E [ A e k − 1 估 ⃗ e k − 1 估 ⃗ T A T + W w k − 1 ⃗ w k − 1 ⃗ T W T ] = A E [ e k − 1 估 ⃗ e k − 1 估 ⃗ T ] A T + W E [ w k − 1 ⃗ w k − 1 ⃗ T ] W T = A P k − 1 估 A T + W Q W T \begin{aligned}\mathrm{P_{k模}}&=E[(\mathrm{A}\vec{e_{k-1估}}+\mathrm{W}\vec{w_{k-1}})*(\mathrm{A}\vec{e_{k-1估}}+\mathrm{W}\vec{w_{k-1}})^T]\\&=E[(\mathrm{A}\vec{e_{k-1估}}+\mathrm{W}\vec{w_{k-1}})*(\vec{e_{k-1估}}^T\mathrm{A}^T+\vec{w_{k-1}}^T\mathrm{W}^T)]\\&=E[\mathrm{A}\vec{e_{k-1估}}\vec{e_{k-1估}}^T\mathrm{A}^T+\mathrm{W}\vec{w_{k-1}}\vec{w_{k-1}}^T\mathrm{W}^T]\\&=\mathrm{A}E[\vec{e_{k-1估}}\vec{e_{k-1估}}^T]\mathrm{A}^T+\mathrm{W}E[\vec{w_{k-1}}\vec{w_{k-1}}^T]\mathrm{W}^T\\&=\mathrm{A}\mathrm{P_{k-1估}}\mathrm{A}^T+\mathrm{W}\mathrm{Q}\mathrm{W}^T\end{aligned} Pk模​​=E[(Aek−1估​ ​+Wwk−1​ ​)∗(Aek−1估​ ​+Wwk−1​ ​)T]=E[(Aek−1估​ ​+Wwk−1​ ​)∗(ek−1估​ ​TAT+wk−1​ ​TWT)]=E[Aek−1估​ ​ek−1估​ ​TAT+Wwk−1​ ​wk−1​ ​TWT]=AE[ek−1估​ ​ek−1估​ ​T]AT+WE[wk−1​ ​wk−1​ ​T]WT=APk−1估​AT+WQWT​

P k − 1 估 \mathrm{P_{k-1估}} Pk−1估​表达式在上面推导过了,只不过 k k k换成 k − 1 k-1 k−1:
表达式: P k − 1 估 = ( I − K k − 1 H ) P k − 1 模 ( I − H T K k − 1 T ) + K k − 1 V R V T K k − 1 T , K k − 1 = P k − 1 模 H T H P k − 1 模 H T + V R V T 表达式:\mathrm{P_{k-1估}}=(\mathrm{I}-\mathrm{K_{k-1}}\mathrm{H})\mathrm{P_{k-1模}}(\mathrm{I}-\mathrm{H}^T\mathrm{K_{k-1}}^T)+\mathrm{K_{k-1}}\mathrm{V}\mathrm{R}\mathrm{V}^T\mathrm{K_{k-1}}^T,\mathrm{K_{k-1}}=\frac{\mathrm{P_{k-1模}}\mathrm{H}^T}{\mathrm{H}\mathrm{P_{k-1模}}\mathrm{H}^T+\mathrm{V}\mathrm{R}\mathrm{V}^T} 表达式:Pk−1估​=(I−Kk−1​H)Pk−1模​(I−HTKk−1​T)+Kk−1​VRVTKk−1​T,Kk−1​=HPk−1模​HT+VRVTPk−1模​HT​
把 K k − 1 \mathrm{K_{k-1}} Kk−1​代到 P k − 1 估 \mathrm{P_{k-1估}} Pk−1估​表达式里就得到 P k − 1 估 \mathrm{P_{k-1估}} Pk−1估​的具体值,你完全可以将 K k − 1 \mathrm{K_{k-1}} Kk−1​直接无脑代入 P k − 1 估 \mathrm{P_{k-1估}} Pk−1估​的表达式,毕竟 P k − 1 估 \mathrm{P_{k-1估}} Pk−1估​等式右边全是上轮迭代得到的已知数,但是 P k − 1 估 \mathrm{P_{k-1估}} Pk−1估​可以进行化简减少计算量:
P k − 1 估 = ( P k − 1 模 − K k − 1 H P k − 1 模 − P k − 1 模 H T K k − 1 T + K k − 1 H P k − 1 模 H T K k − 1 T ) + K k − 1 V R V T K k − 1 T = ( P k − 1 模 − K k − 1 H P k − 1 模 − P k − 1 模 H T K k − 1 T ) + K k − 1 ( H P k − 1 模 H T + V R V T ) K k − 1 T = ( P k − 1 模 − K k − 1 H P k − 1 模 − P k − 1 模 H T K k − 1 T ) + P k − 1 模 H T K k − 1 T = P k − 1 模 − K k − 1 H P k − 1 模 = ( I − K k − 1 H ) P k − 1 模 \begin{aligned}\mathrm{P_{k-1估}}&=(\mathrm{P_{k-1模}}-\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}-\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T+\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T)+\mathrm{K_{k-1}}\mathrm{V}\mathrm{R}\mathrm{V}^T\mathrm{K_{k-1}}^T\\&=(\mathrm{P_{k-1模}}-\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}-\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T)+\mathrm{K_{k-1}}(\mathrm{H}\mathrm{P_{k-1模}}\mathrm{H}^T+\mathrm{V}\mathrm{R}\mathrm{V}^T)\mathrm{K_{k-1}}^T\\&=(\mathrm{P_{k-1模}}-\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}-\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T)+\mathrm{P_{k-1模}}\mathrm{H}^T\mathrm{K_{k-1}}^T\\&=\mathrm{P_{k-1模}}-\mathrm{K_{k-1}}\mathrm{H}\mathrm{P_{k-1模}}\\&=(\mathrm{I}-\mathrm{K_{k-1}}\mathrm{H})\mathrm{P_{k-1模}}\end{aligned} Pk−1估​​=(Pk−1模​−Kk−1​HPk−1模​−Pk−1模​HTKk−1​T+Kk−1​HPk−1模​HTKk−1​T)+Kk−1​VRVTKk−1​T=(Pk−1模​−Kk−1​HPk−1模​−Pk−1模​HTKk−1​T)+Kk−1​(HPk−1模​HT+VRVT)Kk−1​T=(Pk−1模​−Kk−1​HPk−1模​−Pk−1模​HTKk−1​T)+Pk−1模​HTKk−1​T=Pk−1模​−Kk−1​HPk−1模​=(I−Kk−1​H)Pk−1模​​
又是和标准卡尔曼滤波里的 P k − 1 估 \mathrm{P_{k-1估}} Pk−1估​长得挺像的。
这样扩展卡尔曼滤波的公式全推导完了。

公式总结

  1. z k 模 ⃗ = f ( z k − 1 模 ⃗ , F k − 1 ) \vec{z_{k模}}=\mathrm{f}(\vec{z_{k-1模}},F_{k-1}) zk模​ ​=f(zk−1模​ ​,Fk−1​)
  2. P k 模 = A P k − 1 估 A T + W Q W T \mathrm{P_{k模}}=\mathrm{A}\mathrm{P_{k-1估}}\mathrm{A}^T+\mathrm{W}\mathrm{Q}\mathrm{W}^T Pk模​=APk−1估​AT+WQWT
  3. K k = P k 模 H T H P k 模 H T + V R V T \mathrm{K_k}=\frac{\mathrm{P_{k模}}\mathrm{H}^T}{\mathrm{H}\mathrm{P_{k模}}\mathrm{H}^T+\mathrm{V}\mathrm{R}\mathrm{V}^T} Kk​=HPk模​HT+VRVTPk模​HT​
  4. z k 估 ⃗ = z k 模 ⃗ + K k ∗ ( y k 测 ⃗ − h ( z k 模 ⃗ ) ) \vec{z_{k估}}=\vec{z_{k模}}+\mathrm{K_k}*(\vec{y_{k测}}-\mathrm{h}(\vec{z_{k模}})) zk估​ ​=zk模​ ​+Kk​∗(yk测​ ​−h(zk模​ ​))
  5. P k 估 = ( I − K k H ) P k 模 \mathrm{P_{k估}}=(\mathrm{I}-\mathrm{K_k}\mathrm{H})\mathrm{P_{k模}} Pk估​=(I−Kk​H)Pk模​

大致迭代过程和标准卡尔曼滤波一样,这五个公式按照顺序遍历计算。要注意的是标准卡尔曼滤波的 A , V , W \mathrm{A},\mathrm{V},\mathrm{W} A,V,W都是固定的矩阵,而扩展卡尔曼滤波中的 A , V , W \mathrm{A},\mathrm{V},\mathrm{W} A,V,W是雅可比矩阵,每次迭代过程中都需要更新计算一次。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐