【扩展卡尔曼滤波理论推导与实践】【理论】【2/3 公式推导】
目录
- 非线性系统
- 泰勒展开
- 卡尔曼滤波
- 卡尔曼增益
- 模型误差协方差矩阵
- 公式总结
本节默认你能够完整推导标准卡尔曼滤波,将会简化一些推导的描述。如果你还不会完整推导标准卡尔曼滤波,请先从 【卡尔曼滤波理论推导与实践】系列开始看起。
非线性系统
扩展卡尔曼滤波解决的是非线性系统,其非线性状态空间方程为:
{ 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= xyvxvy 。
其非线性真实系统模型为:
{ 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]=雅可比矩阵 dxdf(x)= dx1df1dx1df2⋮dx1dfndx2df1dx2df2⋮dx2dfn⋯⋯⋱⋯dxmdf1dxmdf2⋮dxmdfn =雅可比矩阵
接下来进行泰勒展开:
记 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 − 1 估 ⃗ , z k 模 ⃗ \vec{z_{k-1估}},\vec{z_{k模}} zk−1估,zk模处泰勒展开:
{ z k 模 ⃗ = f ( z k − 1 估 ⃗ , F k − 1 ) + A ∗ ( z k − 1 模 ⃗ − z k − 1 估 ⃗ ) y k 测 ⃗ = h ( z k 模 ⃗ ) + H ∗ ( z k 测 ⃗ − z k 模 ⃗ ) \begin{cases}\vec{z_{k模}}=f(\vec{z_{k-1估}},F_{k-1})+\mathrm{A}*(\vec{z_{k-1模}}-\vec{z_{k-1估}})\\\vec{y_{k测}}=h(\vec{z_{k模}})+\mathrm{H}*(\vec{z_{k测}}-\vec{z_{k模}})\end{cases} {zk模=f(zk−1估,Fk−1)+A∗(zk−1模−zk−1估)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测}}-\mathrm{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−KkH)ek模−KkV∗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−KkH)ek模−KkV∗vk)∗((I−KkH)ek模−KkV∗vk)T]=E[((I−KkH)ek模−KkV∗vk)∗(ek模T(I−KkH)T−vkTVTKkT)]
接下来将括号乘开。这里有两点有助于化简:噪声 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−KkH)ek模ek模T(I−KkH)T+KkV∗vkvkTVTKkT]=(I−KkH)Pk模(I−KkH)T+KkVRVTKkT
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 dKktr(Pk估)=0。在算极值点前,有个矩阵求导公式需要提前知道:
d t r ( A B A T ) d A = 2 A B \frac{dtr(ABA^T)}{d\mathrm{A}}=2AB dAdtr(ABAT)=2AB
这个求导公式结合链式求导法则,就可以进行求极值点了,注意 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} dKkdPk估=2(I−KkH)Pk模(−HT)+2KkVRVT=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 估 ⃗ ) ) = A ( z k − 1 真 ⃗ − z k − 1 估 ⃗ ) + W ∗ w k − 1 ⃗ = A e k 估 ⃗ + 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{A}(\vec{z_{k-1真}}-\vec{z_{k-1估}})+\mathrm{W}*\vec{w_{k-1}}\\&=\mathrm{A}\vec{e_{k估}}+\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估))=A(zk−1真−zk−1估)+W∗wk−1=Aek估+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−1TWT)]=E[Aek−1估ek−1估TAT+Wwk−1wk−1TWT]=AE[ek−1估ek−1估T]AT+WE[wk−1wk−1T]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−1H)Pk−1模(I−HTKk−1T)+Kk−1VRVTKk−1T,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−1HPk−1模−Pk−1模HTKk−1T+Kk−1HPk−1模HTKk−1T)+Kk−1VRVTKk−1T=(Pk−1模−Kk−1HPk−1模−Pk−1模HTKk−1T)+Kk−1(HPk−1模HT+VRVT)Kk−1T=(Pk−1模−Kk−1HPk−1模−Pk−1模HTKk−1T)+Pk−1模HTKk−1T=Pk−1模−Kk−1HPk−1模=(I−Kk−1H)Pk−1模
又是和标准卡尔曼滤波里的 P k − 1 估 \mathrm{P_{k-1估}} Pk−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)
- 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
- 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
- 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模))
- P k 估 = ( I − K k H ) P k 模 \mathrm{P_{k估}}=(\mathrm{I}-\mathrm{K_k}\mathrm{H})\mathrm{P_{k模}} Pk估=(I−KkH)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是雅可比矩阵,每次迭代过程中都需要更新计算一次。
相关文章:
【扩展卡尔曼滤波理论推导与实践】【理论】【2/3 公式推导】
目录 非线性系统泰勒展开卡尔曼滤波卡尔曼增益模型误差协方差矩阵 公式总结 本节默认你能够完整推导标准卡尔曼滤波,将会简化一些推导的描述。如果你还不会完整推导标准卡尔曼滤波,请先从 【卡尔曼滤波理论推导与实践】系列开始看起。 非线性系统 扩展…...

springboot494基于java的综合小区管理系统(论文+源码)_kaic
摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大,容错率低&am…...

深度学习blog-Transformer-注意力机制和编码器解码器
注意力机制:当我们看一个图像或者听一段音频时,会根据自己的需求,集中注意力在关键元素上,以获取相关信息。 同样地,注意力机制中的模型也会根据输入的不同部分,给它们不同的权重,并集中注意力在…...
敏感词 v0.24.0 新特性支持标签分类,内置实现多种策略
开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好,我是老马。 敏感词标签分类一直是大家比较想要的一个功能特性,v0.24.0 了开始内置支持标签分类,…...

随身 WiFi 连接 X-Wrt 共享网络与 IPv6 中继配置
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 之前分享的《随身 WiFi 通过 USB 连接路由器共享网络 扩展网络覆盖范围》介绍了随身 WiFi 通过 USB 连接到路由器共享网络,其中留下两个小问题没有解决: OpenWrt 无法识别中兴微的…...

Keil-编译按钮Translate,Build,Rebuild
在Keil编程环境中,有三个编译源文件相关的按钮Translate,Build,Rebuild: Translate 仅仅(狭义)编译一下当前编辑的源文件(main.c 仅生成 main.o),并不生成最终可执行文件…...

No.1免费开源ERP:Odoo自定义字段添加到配置页中的技术分享
文 / 开源智造(OSCG) Odoo亚太金牌服务 在Odoo18之中,配置设定于管控各类系统配置层面发挥着关键之效用,使您能够对软件予以定制,以契合您特定的业务需求。尽管 Odoo 提供了一组强劲的默认配置选项,然而有…...
Linux 更改Jenkins使用其他账户启动
Linux 更改Jenkins使用其他账户启动 步骤一:修改 Jenkins 配置文件1. 编辑 Jenkins 的 systemd 服务文件:2. 在编辑器中添加以下内容:3. 保存并退出编辑器 步骤二:更改 Jenkins 目录的权限步骤三:重新加载 systemd 配置…...
wordpres当前分类调用父分类的名称和链接
在WordPress中,如果你想在当前分类页面调用并显示父分类的名称和链接,你可以使用以下代码片段: <?php // 获取当前分类的ID $cat_id get_queried_object_id();// 获取当前分类的父分类ID $parent_id get_term($cat_id, category)->…...

TCP客户端模拟链接websocket服务端发送消息(二)
兄弟们,我来填坑了,o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o o(╥﹏╥)o,前几天写了个tcp模拟websocket客户端的以为完成,后面需要发送消息给服务端,以为简单不就是一个发送消息么,这不是一…...
操作系统之同步与互斥的基本概念
1. 同步的基本概念 定义:同步是指在多个并发执行的进程或线程之间协调其行为,以使它们能够正确地相互合作。在计算机科学中,同步通常指对共享资源进行访问控制,以避免竞争条件和死锁等问题。 实现方式:为了实现同步&a…...
详细讲解axios封装与api接口封装管理
一、axios封装 axios是基于promise的http客户端,用于浏览器和nodejs发送http请求 ,对它进行封装主要是为了统一管理请求配置和处理请求和响应的通用逻辑等。以下是常用的封装逻辑和要点 1:引入axios相关依赖 首先引用项目中的axios库&…...
API 接口如何确保数据的安全?
在API接口的对接中,确保数据的安全性是至关重要的。以下是一些关键措施,可以帮助实现这一目标: 一、认证与授权 API密钥:为每个调用方分配唯一的API密钥,客户端在请求时携带该密钥,服务器端验证其有效性。…...

HAL库STM32硬件IIC驱动数字电位器MCP4017
目录 一、芯片特性 二、硬件电路 三、工程搭建 四、IIC硬件地址 五、驱动程序 项目需要,最近用到了一个IIC接口的数字电位器,型号:MCP4017T-502E。对应阻值5K,使用STM32G030F6的硬件IIC驱动,发现简单的不得了&…...

「地平线」副总裁余轶南与「理想汽车」智驾产品总监赵哲伦联手创业,入局具身智能赛道!
小编早期文章:智驾领域从业者,疯狂涌入人形机器人赛道!就有提到智驾领域从业者入局人形机器人赛道是趋势并分析原因。 之前媒体报道的智驾芯片上市公司【地平线】创始成员、副总裁、前软件平台产品线总裁余轶南(博士)…...

弹性盒子(display: flex)布局超全讲解|Flex 布局教程
文章目录 弹性盒子flex什么是弹性布局?弹性布局的特点?justify-contentalign-itemflex-direction (主轴的方向:水平或者垂直)flex-wrapflex-flowalign-contentflex-grow 属性flex-shrink 属性flex-basis 属性flex 属性align-self 属性 弹性盒…...

无问社区-无问AI模型
无问AI模型是无问社区新上线的一款AI功能,支持文本图像的输入,在文本理解能力、推理能力、视觉能力上相较于“社区助手”有了很大的提升。 我们在预训练模型的技术上增加1.7亿token的训练数据进行强化训练使其具备更好的效果。 更好的消息是我们准备了…...

如何记录日常笔记
如何使用Obsidian来记录日常的笔记吗?比如会议记录、读书笔记。 我认为,首先需要做好的就是建立一个单独的分类,比如设置会议记录的文件夹、读书笔记的文件夹,这样各个笔记相互不干扰。 而做日常记录,和我们进行卡片…...

【魅力golang】之-反射
1、引言 反射(Reflection)在 Golang中用于运行时检查和操作变量的类型和值。通过反射,可以实现动态类型处理,这在构建泛型代码、框架、序列化工具和动态代理等场景中非常有用。 2、什么是反射 反射是指程序在运行时能够动态地检…...
git--批量修改本地用户名和邮箱
原文网址:git--批量修改本地用户名和邮箱-CSDN博客 简介 本文介绍git如何批量修改项目的本地用户名和邮箱。 脚本 新建脚本:git_config.sh,内容如下: #!/bin/bash topDirpwd echo "开始处理" for file in ls ./ do…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
Django RBAC项目后端实战 - 03 DRF权限控制实现
项目背景 在上一篇文章中,我们完成了JWT认证系统的集成。本篇文章将实现基于Redis的RBAC权限控制系统,为系统提供细粒度的权限控制。 开发目标 实现基于Redis的权限缓存机制开发DRF权限控制类实现权限管理API配置权限白名单 前置配置 在开始开发权限…...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...