【扩展卡尔曼滤波理论推导与实践】【理论】【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…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...