卡尔曼滤波

news2024/11/23 19:30:24

文章目录

  • References
  • 卡尔曼滤波的作用
    • 世界中充满着不确定性
    • 在工程中
  • 整体感受
    • 状态空间方程
    • 结合例子理解公式
      • 公式6-1说明
      • 公式6-2说明
      • 参数H的意义
    • 总结
  • 怎么融合?
    • 从简单的例子入手-测量一枚硬币的直径
    • 融合实例
  • 卡尔曼公式详细推导
  • 扩展的卡尔曼滤波
    • 线性化
    • 线性化解决EKF

References

How a Kalman filter works, in pictures | Bzarg

详解卡尔曼滤波原理_清风莞尔的博客-CSDN博客

参考链接3:当然还有DR_CAN的视频

注:链接1是一位国外大神写的,所以是英文,链接2是其翻译版。

卡尔曼滤波的作用

你可以在任何含有不确定信息动态系统中使用卡尔曼滤波,对系统下一步的走向做出有根据的预测,即使伴随着各种干扰,卡尔曼滤波总是能指出真实发生的情况。

世界中充满着不确定性

系统的运行过程中有过程噪音,仪器测量有测量误差。[就连喜欢一个人也都有不确定性,时而喜欢、时而无感觉,~嗯、渣男]。既然现实生活中充满着不确定性,那么有没有一种方法可以获得相对准确的结果呢?卡尔曼滤波就有这样的作用。

在工程中

我们常常根据系统的上一状态来计算出系统的当前状态,但是由于外界的影响,计算出来的结果和系统真实的结果是有差异的;我们又同时通过系统中的传感器获得系统的当前状态,但是由于传感器本身的误差,我们从传感器获得的结果和系统真实值也是有差异的。

即我们得到了系统两个具有误差的结果:

  • 一个是根据系统的状态空间方程计算而得的计算值,真实值是在计算值的基础上会被加入过程噪声(比如小车在行驶过程中被风吹歪了,那么真实值就不是计算值了。);
  • 一个是根据传感器测量而得的、具有测量误差的测量值

我们的目标是把两个具有误差的结果融合为一个误差不太大的、可信的结果。

整体感受

状态空间方程

系统的状态方程:
X k − = A X k − 1 + B u k − 1 X_k^- = AX_{k-1} + Bu_{k-1}\\ Xk=AXk1+Buk1
但系统会受到**环境噪声 w k − 1 w_{k-1} wk1**的影响,系统真实的状态并不是数学表达式所表示的结果,即系统真实的状态 X k X_k Xk应该加上环境噪声,为:
X k = X k − + w k − 1 = A X k − 1 + B u k − 1 + w k − 1 \begin{align} X_k &= X_k^- + w_{k-1}\\ &= AX_{k-1} + Bu_{k-1} + w_{k-1}\\ \end{align} Xk=Xk+wk1=AXk1+Buk1+wk1
系统的计算值(先验估计) X k − = A X k − 1 + B u k − 1 X_k^- = AX_{k-1} + Bu_{k-1} Xk=AXk1+Buk1

传感器测量方程:
Z k = H X k {Z_k} = HX_k Zk=HXk
系统的测量值 X k M e a s u r e = H − Z k X_k^{Measure}=H^-Z_k XkMeasure=HZk,记住:这个测量值包含了测量误差。因为传感器本身有误差,即**传感器读数值 Z k Z_k Zk**包括了误差,即真实的传感器测量方程是:
Z k = H X k + v k \begin{align} Z_k &= HX_k + {\color{green}v_k} \end{align} Zk=HXk+vk
综上可得系统真实的状态方程为:
{ X k = X k − + w k − 1 = A X k − 1 + B u k − 1 + w k − 1 ( 6 − 1 ) Z k = H X k + v k ( 6 − 2 ) \begin{cases} X_k = {\color{blue}X_k^-} + w_{k-1} = {\color{blue}AX_{k-1} + Bu_{k-1}} + w_{k-1}{\quad}(6-1)\\ Z_k = HX_k + v_k{\quad}(6-2) \end{cases} {Xk=Xk+wk1=AXk1+Buk1+wk1(61)Zk=HXk+vk(62)
式中:

  • X k X_k Xk是当前系统真实的状态;
  • X k − X_k^- Xk是根据状态方程算出来当前系统本应该处于的状态(计算值);
  • u k − 1 u_{k-1} uk1是外部控制输入;
  • Z k Z_k Zk是当前传感器的读数值(包含了测量误差 v k v_k vk);
  • w k − 1 w_{k-1} wk1 v k v_k vk一个是过程噪声,一个是测量噪声,它们在卡尔曼滤波中都被认为服从高斯分布
  • H H H是一个系数,比如有的传感器测出的值是0~1024之间的值,还需要转换才能得到对应的物理量。

结合例子理解公式

一辆小车上装有位置传感器,并且向前匀速的运动。

公式6-1说明

系统的状态是可以用数学表达式表达出来的(或者这样说,系统的运行状态满足某些数学公式),也就意味着系统的当前状态可以根据上一状态计算而出,即通过系统的状态方程,可以计算出系统当前的状态 X k − X_k^- Xk。但是由于具有过程噪声 w k − 1 w_{k-1} wk1,所以这个结果不是系统当前的真实状态。

比如:上一时刻小车的位置是5,速度是2,那么通过计算可以知道下一时刻小车的位置是7。但是由于环境风的影响,导致小车真实的位置其实是6.8,所以小车的真实值 X k X_k Xk=计算值 X k − X_k^- Xk+过程噪声 w k − 1 w_{k-1} wk1此处噪声是-0.2,计算值是7,真实值就是6.8了)。在卡尔曼滤波中认为过程噪声 w w w是服从 ( 0 , c o v ( w ) ) (0,cov(w)) (0,cov(w))的正态分布。

公式6-2说明

通过小车上的传感器,可以得到小车当前的测量位置,但是由于传感器具有测量误差,所以这个传感器传回的值包含了测量噪声,即真实值 X k X_k Xk+测量噪声 v k v_k vk=传感器测量的结果(读数值) Z k Z_k Zk

比如:续上,小车当前的真实位置是6.8(传感器测量的就是小车的真实位置,只不过传感器自己有误差),由于测量误差,传感器测量得到的值是6.7(测量值才是我们可以得到的,是读数值),即 6.7 = 6.8 − 0.1 6.7=6.8-0.1 6.7=6.80.1,6.7是我们从传感器读数得知,0.1是测量误差(服从正态分布),6.8是真实值。

参数H的意义

这里首先要明白一点:传感器的值不一定就等于系统的状态,这里不是说误差的影响,而是传感器特性的影响。比如传感器的1代表了系统的100,这是生产传感器时就规定好的。所以由传感器上的值得到系统的状态还需要乘以100(就是H这个系数),如果传感器的值就代表了系统的状态,那么H=1,比如位置传感器直接给出小车位置,而速度传感器还需要转换才能得出位置。

总结

在公式7中,我们可以得到的是:

  • 系统的计算值(计算值) X k − X_k^- Xk
  • 系统的观测值(读数值) Z k Z_k Zk
  • 又基于实际生活和大量实验,我们可以大致得到过程噪声测量噪声的分布情况(卡尔曼滤波认为是正态分布)。

最终我们就可以根据两个和正态误差相关的结果( X k − X_k^- Xk Z k Z_k Zk)融合为一个误差较小的结果 X k + X_k^+ Xk+,这个融合值是最优估计。

怎么融合?

从简单的例子入手-测量一枚硬币的直径

由于尺子误差和认为读数误差,结果是不准确的,我们自然会测量多次以平均值作为其真实值。
x k ~ = 1 k ( z 1 + z 2 + . . . + z k ) = 1 k ( z 1 + z 2 + . . . + z k − 1 ) + 1 k z k = 1 k k − 1 k − 1 ( z 1 + z 2 + . . . + z k − 1 ) + 1 k z k = k − 1 k x k − 1 ~ + 1 k z k = x k − 1 ~ − 1 k x k − 1 ~ + 1 k z k = x k − 1 ~ + 1 k ( z k − x k − 1 ~ ) \begin{align} \widetilde{x_k} &= \frac{1}{k}(z_1+z_2+...+z_k)\\ &=\frac{1}{k}(z_1+z_2+...+z_{k-1})+\frac{1}{k}z_k\\ &=\frac{1}{k}\frac{k-1}{\color{blue}{k-1}}{\color{blue}(z_1+z_2+...+z_{k-1})}+\frac{1}{k}z_k\\ &=\frac{k-1}{k}\widetilde{x_{k-1}}+\frac{1}{k}z_k\\ &=\widetilde{x_{k-1}}-\frac{1}{k}\widetilde{x_{k-1}}+\frac{1}{k}z_k\\ &={\color{red}\widetilde{x_{k-1}}+\frac{1}{k}(z_k-\widetilde{x_{k-1}})} \end{align} xk =k1(z1+z2+...+zk)=k1(z1+z2+...+zk1)+k1zk=k1k1k1(z1+z2+...+zk1)+k1zk=kk1xk1 +k1zk=xk1 k1xk1 +k1zk=xk1 +k1(zkxk1 )
z k z_k zk表示第k次的测量值, x k ~ \widetilde{x_k} xk 表示第k次的估计值(即前k次的平均值)。通过一个简单的变换,我们得到了一个公式,即:当前估计值=上一次估计值+比例(当前测量值-上一次估计值)。这里的比例*其实就是融合比例(卡尔曼增益),谁多一点、谁少一点。

比如

  • k = 1 k=1 k=1时,此时估计值就等于测量值 x k ~ = z k \widetilde{x_k}=z_k xk =zk,因为目前就测量了一次,没有更多数据做平均嘛;
  • k → ∞ k{\to}\infin k时,此时估计值就等于上一次的估计值 x k ~ = x k − 1 ~ \widetilde{x_k}=\widetilde{x_{k-1}} xk =xk1 ,因为我有足够多的历史数据了,这一次的测量数据对我的影响很小。

融合实例

由两把不同的天平(误差都服从正态分布)得出不同的重量,天平1误差的标准差是2g,天平2误差的标准差是4g。现在天平1的结果是30g,天平2的结果是32g,怎么把两个结果融合为一个最优的估计值。从下面的正态分布图可以知道,最终的结果应该在30~32g之间,并且靠近30g更多一点。
z 1 = 30 g σ 1 = 2 g z 2 = 32 g σ 2 = 4 g z ~ = z 1 + k ( z 2 − z 1 ) z_1=30g {\quad} \sigma_1=2g \\ z_2=32g {\quad} \sigma_2=4g \\ \widetilde{z}=z_1 + {\color{red}k}(z_2 - z_1) z1=30gσ1=2gz2=32gσ2=4gz =z1+k(z2z1)
融合目标:找到k,使得 v a r ( z ~ ) var(\widetilde{z}) var(z )最小,融合后误差最小就是使融合后方差最小(方差越小越接近真实值)。
σ z ~ 2 = v a r ( z 1 + k ( z 2 − z 1 ) ) = v a r ( z 1 − k z 1 + k z 2 ) = v a r ( ( 1 − k ) z 1 + k z 2 ) = v a r ( ( 1 − k ) z 1 ) + v a r ( k z 2 ) = ( 1 − k ) 2 v a r ( z 1 ) + k 2 v a r ( z 2 ) = ( 1 − k ) 2 σ 1 2 + k 2 σ 2 2 \begin{align} \sigma_{\widetilde{z}}^2&=var(z_1+k(z_2-z_1)) \\ &= var(z_1-kz_1+kz_2) \\ &= var((1-k)z_1+kz_2) \\ &= var((1-k)z_1) + var(kz_2) \\ &= (1-k)^2var(z_1)+k^2var(z_2) \\ &= (1-k)^2\sigma_1^2+k^2\sigma_2^2 \\ \end{align} σz 2=var(z1+k(z2z1))=var(z1kz1+kz2)=var((1k)z1+kz2)=var((1k)z1)+var(kz2)=(1k)2var(z1)+k2var(z2)=(1k)2σ12+k2σ22
要使 σ z ~ 2 \sigma_{\widetilde{z}^2} σz 2最小,求导令其为0,求其最小值。
d σ z ~ 2 d k = 0 − 2 ( 1 − k ) σ 1 2 + 2 k σ 2 2 = 0 − σ 1 2 + k σ 1 2 + k σ 2 2 = 0 k ( σ 1 2 + σ 2 2 ) = σ 2 2 ⟹ k = σ 1 2 σ 1 2 + σ 2 2 \frac{d\sigma_{\widetilde{z}}^2}{dk}=0 \\ -2(1-k)\sigma_1^2+2k\sigma_2^2 = 0 \\ -\sigma_1^2+k\sigma_1^2+k\sigma_2^2 = 0 \\ \\ k(\sigma_1^2+\sigma_2^2)=\sigma_2^2 \\ {\Longrightarrow}{\color{red} k = \frac{\sigma_1^2}{\sigma_1^2+\sigma_2^2}} dkdσz 2=02(1k)σ12+2kσ22=0σ12+kσ12+kσ22=0k(σ12+σ22)=σ22k=σ12+σ22σ12
所以:
k = 4 4 + 16 = 0.2 σ z ~ 2 = ( 1 − 0.2 ) 2 × 2 2 + 0. 2 2 × 4 2 = 3.2 σ z ~ = 3.2 = 1.79 g k=\frac{4}{4+16}=0.2 \\ \sigma_{\widetilde{z}}^2=(1-0.2)^2\times2^2+0.2^2\times4^2=3.2 \\ \sigma_{\widetilde{z}}=\sqrt{3.2}=1.79g k=4+164=0.2σz 2=(10.2)2×22+0.22×42=3.2σz =3.2 =1.79g

卡尔曼公式详细推导

可以不用看,推导较复杂!!!

协方差矩阵

E [ w   w T ] E[w\ w^T] E[w wT]就代表了 w w w的协方差矩阵,如下:
E [ w   w T ] = E [ [ w 1   w 2   w 3 ] T [ w 1   w 2   w 3 ] ] = [ E [ w 1   w 1 ] E [ w 1   w 2 ] E [ w 1   w 3 ] ⋯ E [ w 2   w 1 ] E [ w 2   w 2 ] E [ w 2   w 3 ] ⋯ E [ w 3   w 1 ] E [ w 3   w 2 ] E [ w 3   w 3 ] ⋯ ⋯ ⋯ ⋯ ] = [ σ 1 2 σ 1 σ 2 σ 1 σ 3 ⋯ σ 2 σ 1 σ 2 2 σ 2 σ 3 ⋯ σ 3 σ 1 σ 3 σ 2 σ 3 2 ⋯ ⋯ ⋯ ⋯ ] = c o v ( w ) \begin{align} E[w\ w^T] &= E\left[[w_1\ w_2\ w_3]^T[w_1\ w_2\ w_3]\right] \\ &= \left [\begin{array}{cccc|r} E[w_1\ w_1] & E[w_1\ w_2] & E[w_1\ w_3] & \cdots\\ E[w_2\ w_1] & E[w_2\ w_2] & E[w_2\ w_3] & \cdots\\ E[w_3\ w_1] & E[w_3\ w_2] & E[w_3\ w_3] & \cdots\\ \cdots & \cdots & \cdots \end{array} \right] \\ &= \left [\begin{array}{cccc|r} \sigma_1^2 & \sigma_1\sigma_2 & \sigma_1\sigma_3 & \cdots\\ \sigma_2\sigma_1 & \sigma_2^2 & \sigma_2\sigma_3 & \cdots\\ \sigma_3\sigma_1 & \sigma_3\sigma_2 & \sigma_3^2 & \cdots\\ \cdots & \cdots & \cdots \end{array} \right] \\ &=cov(w) \end{align} E[w wT]=E[[w1 w2 w3]T[w1 w2 w3]]= E[w1 w1]E[w2 w1]E[w3 w1]E[w1 w2]E[w2 w2]E[w3 w2]E[w1 w3]E[w2 w3]E[w3 w3] = σ12σ2σ1σ3σ1σ1σ2σ22σ3σ2σ1σ3σ2σ3σ32 =cov(w)

过程噪声协方差矩阵为 Q Q Q,服从 w k − ( 0 , Q ) w_k-(0,Q) wk(0,Q),没有下标 k k k的原因是一般认为高斯噪声分布不变化。
E [ w k w k T ] = Q E[w_k w_k^T] = Q E[wkwkT]=Q
测量噪声协方差矩阵为 R R R,服从 v k − ( 0 , R ) v_k-(0,R) vk(0,R)
E [ v k v k T ] = R E[v_k v_k^T] = R E[vkvkT]=R
误差协方差矩阵为 P k P_k Pk,服从 e k − ( 0 , P k ) e_k-(0,P_k) ek(0,Pk)
E [ e k e k T ] = P k E[e_k e_k^T] = P_k E[ekekT]=Pk

卡尔曼增益的推导

状态空间方程:
{ X k = X k − + w k − 1 = A X k − 1 + B u k − 1 + w k − 1 ( 29 − 1 ) Z k = H X k + v k ( 29 − 2 ) \begin{cases} X_k = {\color{blue}X_k^-} + w_{k-1} = {\color{blue}AX_{k-1} + Bu_{k-1}} + w_{k-1}{\quad}(29-1)\\ Z_k = HX_k + v_k{\quad}(29-2) \end{cases} {Xk=Xk+wk1=AXk1+Buk1+wk1(291)Zk=HXk+vk(292)
其中:

  • X k − = A X k − 1 + B u k − 1 X_k^-=AX_{k-1} + Bu_{k-1} Xk=AXk1+Buk1被称为先验估计(计算值),和真实值还是有误差(被风吹歪了);
  • X k M e a s u r e = H − Z k X_k^{Measure}=H^-Z_k XkMeasure=HZk是测量值,包含了测量噪声。

估计值/后验估计 X k + X_k^+ Xk+
融合值 = 计算值 + G ( 测量值 − 计算值 ) X k + = X k − + G ( X k M e a s u r e − X k − ) = X k − + G ( H − Z k − X k − ) { X k + = X K − = 计算值 , G = 0 X K + = H − Z k = 测量值 , G = 1 令 G = K k H X k + = X k − + K k ( Z k − H X k − ) { X k + = X K − = 计算值 , K = 0 X K + = H − Z k = 测量值 , K = H − {\color{red}融合值=计算值+G(测量值-计算值)} \\ X_k^+=X_k^-+G({\color{blue}X_k^{Measure}}-X_k^-) \\ =X_k^-+G({\color{blue}H^-Z_k}-X_k^-) \\ \begin{cases} X_k^+ = X_K^-=计算值 {\quad},G=0 \\ X_K^+ = H^-Z_k=测量值 {\quad},G=1 \\ \end{cases} \\ {\color{red}令{\quad} G = K_kH} \\ X_k^+=X_k^-+K_k(Z_k-HX_k^-) \\ \begin{cases} X_k^+ = X_K^-=计算值 {\quad},K=0 \\ X_K^+ = H^-Z_k=测量值 {\quad},K=H^- \\ \end{cases} 融合值=计算值+G(测量值计算值)Xk+=Xk+G(XkMeasureXk)=Xk+G(HZkXk){Xk+=XK=计算值,G=0XK+=HZk=测量值,G=1G=KkHXk+=Xk+Kk(ZkHXk){Xk+=XK=计算值,K=0XK+=HZk=测量值,K=H

  • 定义误差(真实值-估计值) e k = X k − X k + e_k=X_k-X_k^+ ek=XkXk+,寻找 K k K_k Kk使得 X k + → X k X_k^+{\to}X_k Xk+Xk,即 e k → 0 e_k{\to}0 ek0
  • 误差也服从高斯分布,即 P ( e k ) − ( 0 , P k ) P(e_k)-(0,P_k) P(ek)(0,Pk) P k P_k Pk为误差 e k e_k ek的协方差矩阵,即使得 P k P_k Pk的迹最小;
  • 定义先验误差(真实值-先验估计) e k − = X k − X k − e_k^-=X_k-X_k^- ek=XkXk
  • P k P_k Pk代表第k次的误差协方差矩阵, P k − P_k^- Pk代表第k次的先验误差协方差矩阵。

详细推导

在这里插入图片描述

配合食用:

( 1 − 1 ) → ( 1 − 2 ) (1-1){\to}(1-2) (11)(12)
X k − X k + = X k − [ X k − + K k ( Z k − H X k − ) ] = X k − X k − − K k Z k + K k H X k − ( ∵ Z k = H X k + v k ) = X k − X k − − K k H X k − K k v k + K k H X k − = ( X k − X k − ) − K k H ( X k − X k − ) − K k v k = ( I − K k H ) ( X k − X k − ) − K k v k = ( I − K k H ) e k − − K k v k \begin{align*} {\color{blue}X_k-X_k^+} &= X_k-[X_k^-+K_k(Z_k-HX_k^-)] \\ &=X_k-X_k^- - K_k{\color{red}Z_k} + K_kHX_k^- \\ &{\qquad}({\because}{\qquad}{\color{red}Z_k} = HX_k+v_k) \\ &=X_k-X_k^- - K_kHX_k - K_kv_k + K_kHX_k^- \\ &=(X_k - X_k^-) - K_kH(X_k - X_k^-) - K_kv_k \\ &=(I - K_kH)(X_k - X_k^-) - K_kv_k \\ &=(I - K_kH)e_k^- - K_kv_k \end{align*} XkXk+=Xk[Xk+Kk(ZkHXk)]=XkXkKkZk+KkHXk(Zk=HXk+vk)=XkXkKkHXkKkvk+KkHXk=(XkXk)KkH(XkXk)Kkvk=(IKkH)(XkXk)Kkvk=(IKkH)ekKkvk
( 1 − 2 ) → ( 1 − 3 ) (1-2){\to}(1-3) (12)(13)
( A B ) T = B T A T ( A + B ) T = A T + B T (AB)^T = B^TA^T \\ (A+B)^T = A^T + B^T (AB)T=BTAT(A+B)T=AT+BT
( 1 − 4 ) → ( 1 − 5 ) (1-4){\to}(1-5) (14)(15)
∵ E [ ( I − K k H ) e k − v k T K k T ] = ( I − K k H ) K k T E [ e k − v k T ] e k − , v k T 互不相关 = ( I − K k H ) K k T E [ e k − ] E [ v k T ] e k − , v k T 均服从 ( 0 , σ 2 ) = 0 {\because}{\quad}E{\color{green}[(I - K_kH)e_k^-v_k^TK_k^T]} \\ {\color{green}=(I - K_kH)K_k^TE[e_k^-v_k^T]} \\ e_k^-,v_k^T互不相关 \\ {\color{green}=(I - K_kH)K_k^TE[e_k^-]E[v_k^T]}\\ e_k^-,v_k^T均服从(0,\sigma^2) \\ =0 E[(IKkH)ekvkTKkT]=(IKkH)KkTE[ekvkT]ek,vkT互不相关=(IKkH)KkTE[ek]E[vkT]ek,vkT均服从(0,σ2)=0
( 1 − 6 ) → ( 1 − 7 ) (1-6){\to}(1-7) (16)(17):测量噪声协方差矩阵
E [ v k v k T ] = R E[v_kv_k^T] = R E[vkvkT]=R
( 1 − 8 ) → ( 1 − 9 ) (1-8){\to}(1-9) (18)(19)
[ ( P k − H T ) K k T ] T = K k ( P K − H T ) T = K k H P k − T t r ( K k H P k − ) = t r ( K k H P k − T ) [(P_k^-H^T)K_k^T]^T = K_k(P_K^-H^T)^T = K_kHP_k^{-T} \\ tr(K_kHP_k^-) = tr(K_kHP_k^{-T}) [(PkHT)KkT]T=Kk(PKHT)T=KkHPkTtr(KkHPk)=tr(KkHPkT)
( 1 − 9 ) → ( 1 − 10 ) (1-9){\to}(1-10) (19)(110)
P k − 跟 K k 无关 d ( A B ) d A = B T d ( A B A T ) d A = 2 A B P_k^-跟K_k无关 \\ \frac{d(AB)}{dA} = B^T \\ \frac{d(ABA^T)}{dA} = 2AB PkKk无关dAd(AB)=BTdAd(ABAT)=2AB
卡尔曼滤波中最核心的公式:卡尔曼增益
K k = P k − H T H P K − H T + R K_k = \frac{P_k^-H^T}{HP_K^-H^T+R} Kk=HPKHT+RPkHT

  • R → ∞ R{\to}\infin R K k → 0 K_k{\to}0 Kk0 R R R是测量噪声协方差矩阵,测量噪声很大,更愿意相信计算的结果;
  • R → 0 R{\to}0 R0 K k → H − K_k{\to}H^- KkH,测量噪声小,更愿意相信测量的结果。

误差协方差矩阵 P k − P_k^- Pk

先验估计:
X k − = A X k − 1 + B u k − 1 X_k^- = AX_{k-1} + Bu_{k-1} Xk=AXk1+Buk1
后验估计:
X k + = X k − + K k ( Z k − H X k − ) X_k^+=X_k^-+K_k(Z_k-HX_k^-) \\ Xk+=Xk+Kk(ZkHXk)
卡尔曼增益:
K k = P k − H T H P K − H T + R K_k = \frac{P_k^-H^T}{HP_K^-H^T+R} Kk=HPKHT+RPkHT
误差协方差矩阵的推导:
P k − = E [ e k − e k − T ] = E [ ( A e k − 1 + w k − 1 ) ( A e k − 1 + w k − 1 ) T ] = . . . = A P k − 1 A T + Q \begin{align*} P_k^- &= E[{\color{blue}e_k^-} e_k^{-T}] \\ &=E[(Ae_{k-1}+w_{k-1})(Ae_{k-1}+w_{k-1})^T] \\ &= ... \\ &=AP_{k-1}A^T + Q \end{align*} Pk=E[ekekT]=E[(Aek1+wk1)(Aek1+wk1)T]=...=APk1AT+Q
配合食用(这里的 X k − = A X k − 1 − − B u k − 1 X_k^-=AX_{k-1}^--Bu_{k-1} Xk=AXk1Buk1),和前面的先验估计不一样,不好理解:
e k − = X k − X k − = A X k − 1 + B u k − 1 + w k − 1 − A X k − 1 − − B u k − 1 = A e k − 1 − + w k − 1 \begin{align*} {\color{blue}e_k^-} &= X_k - X_k^- \\ &=AX_{k-1} + Bu_{k-1} + w_{k-1} - AX_{k-1}^- - Bu_{k-1} \\ &=Ae_{k-1}^- + w_{k-1} \end{align*} ek=XkXk=AXk1+Buk1+wk1AXk1Buk1=Aek1+wk1

卡尔曼滤波的5个公式

重要变量:先验估计(即计算值),测量值,先验误差,先验误差协方差矩阵,误差,误差协方差矩阵,卡尔曼增益,最优估计。
X k − = A X k − 1 + B u k − 1 P k − = A P k − 1 A T + Q K k = P k − H T H P K − H T + R X k + = X k − + K k ( Z k − H X k − ) P k = ( I − K k H ) P k − \begin{align*} & X_k^- = AX_{k-1} + Bu_{k-1} \\ & P_k^- = AP_{k-1}A^T + Q \\ & K_k = \frac{P_k^-H^T}{HP_K^-H^T+R} \\ & X_k^+ = X_k^- + K_k(Z_k - HX_k^-) \\ & P_k = (I - K_kH)P_k^- \end{align*} Xk=AXk1+Buk1Pk=APk1AT+QKk=HPKHT+RPkHTXk+=Xk+Kk(ZkHXk)Pk=(IKkH)Pk
前两步是预测,后两步是校正,最后一步是更新。
在这里插入图片描述

扩展的卡尔曼滤波

参考1

参考2

前面是是标准的卡尔曼滤波,即线性卡尔曼滤波,不能作用于非线性系统,而扩展的卡尔曼滤波可用于非线性系统。

线性化

利用泰勒级数对 f ( x ) f(x) f(x) x 0 x_0 x0处展开得:
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) 1 ! ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + ⋯ + f n ( x 0 ) n ! ( x − x 0 ) n f(x) = f(x_0) + \frac{f'(x_0)}{1!}(x-x_0) + \frac{f''(x_0)}{2!}(x-x_0)^2 + \cdots + \frac{f^n(x_0)}{n!}(x-x_0)^n f(x)=f(x0)+1!f(x0)(xx0)+2!f′′(x0)(xx0)2++n!fn(x0)(xx0)n
如果 x → x 0 x{\to}x_0 xx0,则 ( x − x 0 ) 2 → 0 , ⋯   , ( x − x 0 ) n → 0 (x-x_0)^2{\to}0,\cdots,(x-x_0)^n{\to}0 (xx0)20,,(xx0)n0
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) = k 1 + k 2 ( x − x 0 ) = k x + b f(x) = f(x_0) + f'(x_0)(x-x_0) \\ = k_1 + k_2(x-x_0) \\ = kx+b f(x)=f(x0)+f(x0)(xx0)=k1+k2(xx0)=kx+b
如上,我们把 f ( x ) f(x) f(x)线性化成了 k x + b kx+b kx+b

例:
f ( x ) = sin ⁡ ( x ) = sin ⁡ ( x 0 ) + cos ⁡ ( x 0 ) ( x − x 0 ) ( l e t x 0 = 0 ) = 0 + x − x 0 = x \begin{align*} f(x) &= \sin(x) \\ &= \sin(x_0) + \cos(x_0)(x-x_0) \\ &{\qquad}(let{\quad}x_0=0) \\ &= 0 + x-x_0 \\ &= x \end{align*} f(x)=sin(x)=sin(x0)+cos(x0)(xx0)(letx0=0)=0+xx0=x
上式表明, s i n ( x ) sin(x) sin(x) x = 0 x=0 x=0附近和 x x x是相等的,分析误差:
{ sin ⁡ ( π 6 ) = 1 / 2 , π 6 = 0.52 , e r r = 0.52 − 0.5 0.5 = 4 % sin ⁡ ( π 4 ) = 0.707 , π 4 = 0.785 , e r r = 0.785 − 0.707 0.707 = 11 % \begin{cases} \sin(\frac{\pi}{6}) = 1/2,{\quad}\frac{\pi}{6}=0.52,{\quad}err=\frac{0.52-0.5}{0.5}=4\% \\ \sin(\frac{\pi}{4}) = 0.707,{\quad}\frac{\pi}{4}=0.785,{\quad}err=\frac{0.785-0.707}{0.707}=11\% \\ \end{cases} {sin(6π)=1/2,6π=0.52,err=0.50.520.5=4%sin(4π)=0.707,4π=0.785,err=0.7070.7850.707=11%

线性化解决EKF

EKF的基本思想是利用泰勒级数展开将非线性系统线性化,然后采用卡尔曼滤波框架对信号进行滤波,因此它是一种次优滤波

**标准(线性)**卡尔曼滤波KF的状态转移方程和观测方程为:
{ θ k = A θ k − 1 + B u k − 1 + s k z k = C θ k + v k \begin{cases} \theta_k=A\theta_{k-1}+Bu_{k-1}+s_k\\ z_k=C\theta_k+v_k \end{cases} {θk=Aθk1+Buk1+skzk=Cθk+vk
**扩展(非线性)**卡尔曼滤波EKF的状态转移方程和观测方程为:
{ θ k = f ( θ k − 1 ) + s k z k = h ( θ k ) + v k \begin{cases} \theta_k=f(\theta_{k-1})+s_k\\ z_k=h(\theta_k)+v_k \end{cases} {θk=f(θk1)+skzk=h(θk)+vk
利用泰勒展开式对式xx在上一次的估计值 < θ k − 1 > <\theta_{k-1}> <θk1>处展开得:
θ k = f ( θ k − 1 ) + s k = f ( < θ k − 1 > ) + F k − 1 ( θ k − 1 − < θ k − 1 > ) + s k \theta_k = f(\theta_{k-1})+s_k \\ = f(<\theta_{k-1}>) + F_{k-1}(\theta_{k-1}-<\theta_{k-1}>) + s_k \\ θk=f(θk1)+sk=f(<θk1>)+Fk1(θk1<θk1>)+sk
再利用泰勒展开式对式xx在本轮得状态预测值 θ k ′ \theta_k' θk处展开得:
z k = h ( θ k ) + v k = h ( θ k ′ ) + H k ( θ k − θ k ′ ) + v k z_k = h(\theta_k) + v_k = h(\theta_k') + H_k(\theta_k - \theta_k') + v_k zk=h(θk)+vk=h(θk)+Hk(θkθk)+vk
其中, F k − 1 F_{k-1} Fk1 H k H_k Hk分别表示函数 f ( θ ) f(\theta) f(θ) h ( θ ) h(\theta) h(θ) < θ k − 1 <\theta_{k-1} <θk1 θ k ′ \theta_k' θk处的雅可比矩阵。

注:这里对泰勒展开式只保留到一阶导,二阶导数以上的都舍去,噪声假设均为加性高斯噪声。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于规则的分类(顺序覆盖算法)及最近邻分类器(KNN算法)

顺序覆盖算法的步骤 顺序覆盖算法的目标是提取一个分类规则&#xff0c;该规则覆盖训练集中大量正例&#xff0c;没有或仅覆盖少量反例。 整个过程包含以下四个步骤&#xff1a; 规则增长规则评估停止准则规则剪枝 顺序覆盖算法的第一步——规则增长 一般到特殊&#xff08…

高压功率放大器基于液晶生物光电传感器中的应用

实验名称&#xff1a;基于液晶的高通量蛋白质光电生物传感器 研究方向&#xff1a;生物识别与检测 测试目的&#xff1a; 蛋白质分析是疾病诊断和医学研究中一类重要的方法。本文提出了一种单基底的液晶生物光电传感器&#xff0c;可用于快速检测蛋白质的浓度。实验发现单基底液…

ZigBee案例笔记 -- LED控制与按键检测(输入/输出)

文章目录1.相关寄存器2.按键检测&#xff08;引脚输入配置&#xff09;3.LED控制&#xff08;引脚输出配置&#xff09;1.相关寄存器 CC2530&#xff08;ZigBee&#xff09;的开发也是类似51单片机一样针对寄存器进行配置&#xff0c;因为其内核实质上也是51内核&#xff0c;对…

Sulfo CY5-MAL|磺基-CY5 马来酰亚胺

Sulfo CY5-MAL|磺基-CY5 马来酰亚胺 英文名称&#xff1a;Cyanine5 maleimide Cyanine5 MAL Cy5 maleimide Cy5 MAL CAS&#xff1a;1437872-46-2 外观&#xff1a;深蓝色粉末 分子量&#xff1a;641.24 分子式&#xff1a;C38H45ClN4O3 花菁染料&#xff0c;一种发…

Hive实训任务

文章目录Hive 实训任务Hive 实训任务 熟练掌握如何创建外部表&#xff0c;加载数据&#xff0c;查询等 先创建一个cx_stu02 外部表&#xff0c;external 指定外部表关键字 create external table cx_stu02(name string,gender string,age int ) row format delimited fields…

一文初识大数据Flink框架

文章目录什么是Flinkflink在github上的现状flink发展历史flink能做什么flink 的高并发能力一些计算框架对比图flink发展方向flink生态体系处理无界和有界数据随处部署应用程序运行任何规模的应用程序利用内存性能官方文档地址:https://flink.apache.org/ 什么是Flink &#x…

php宝塔搭建部署实战Piwigo开源相册管理系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的Piwigo开源相册管理系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#x…

基于Python + Requests 的Web接口自动化测试框架

之前采用JMeter进行接口测试&#xff0c;每次给带新人进行培训比较麻烦&#xff0c;干脆用Python实现&#xff0c;将代码和用例分离&#xff0c;易于维护。 项目背景 公司的软件采用B/S架构&#xff0c;进行数据存储、分析、管理 工具选择 python开发的速度很快&#xff0c…

【计算机考研408】数据结构代码规范

408-数据结构代码规范 文章目录408-数据结构代码规范序言优化参考文献考前预测线性表-链表单链表静态链表栈、队列、数组栈的顺序存储类型队列树与二叉树二叉树的定义二叉树的层序遍历树的双亲表示法孩子表示法树的孩子兄弟表示法图邻接矩阵存储法邻接表法二分查找/折半查找模板…

在linux上运行python脚本(安装pytorch踩坑记录,pyinstaller使用方式,构建docker镜像)

背景 脚本需要导入pytorch等库才能运行。 脚本在windows上运行成功&#xff0c;尝试放到linux上运行。 linux服务器内存较小。 方法一&#xff1a;在linux上安装依赖 把脚本放到linux上&#xff0c;直接安装依赖。 安装环境也有两种方法&#xff1a;一是先安装conda&#xf…

爬虫学习-requests模块

python中原生的一款基于网络请求的模块&#xff0c;功能强大&#xff0c;简单便捷&#xff0c;效率极高作用&#xff1a;模拟游览器发请求(15条消息) Header:请求头参数详解_平常心丷的博客-CSDN博客_headers参数(15条消息) requests的get方法和post方法_不问散人的博客-CSDN博…

二十九、之Java 数据结构

Java 数据结构 Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类&#xff1a; 枚举&#xff08;Enumeration&#xff09;位集合&#xff08;BitSet&#xff09;向量&#xff08;Vector&#xff09;栈&#xff08;Stack&#xff09;字典&#xff…

Linux 下安装多个mysql

1、下载mysql https://downloads.mysql.com/archives/community/2、创建用户组 groupadd mysql 3、创建用户 useradd -r -g mysql5736 mysql5736 4、解压文件 tar zxvf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz 5、重命名 mv mysql-5.7.39-linux-glibc2.12-x86_64 …

随着企业信息化发展之源代码防泄密需求分析

源代码防泄密需求&#xff1a; 随着企业信息化发展的日益增长&#xff0c;软件行业厂商之间的竞争也愈加白热化&#xff0c;加上国内对知识产权的不够重视、山寨模仿产品的横行。保护源代码、保证企业的核心竞争力&#xff0c;成为众多软件研发企业的第一要务。那么企业应该如…

深度学习入门(六十一)循环神经网络——长短期记忆网络LSTM

深度学习入门&#xff08;六十一&#xff09;循环神经网络——长短期记忆网络LSTM前言循环神经网络——长短期记忆网络LSTM课件长短期记忆网络门候选记忆单元记忆单元隐状态总结教材1 门控记忆元1.1 输入门、忘记门和输出门1.2 候选记忆元1.3 记忆元1.4 隐状态2 从零开始实现2.…

mysql常用操作(亲测自用,持续更新...)

文章目录一、新建数据库1、字符集1.1 字符集作用1.2 常用选择2、排序规则2.1 排序规则作用2.2 常用选择二、新建表1、字符串类型1.1 CHAR 和 VARCHAR 的定义1.2 字符占用三、常用基础知识1、什么是方言&#xff1f;2、SQL书写规范3、SQL分类1&#xff09;DDL &#xff08;data …

day6 递推

P1928 外星密码 对于 100% 的数据&#xff1a;解压后的字符串长度在 20000 以内&#xff0c;最多只有十重压缩。保证只包含数字、大写字母、[ 和 ]。 #include <bits/stdc.h> using namespace std;string fun(){char ch;//输入字符 int n;//复制次数 string ans"&…

Teststand-控件

文章目录管理控件应用程序管理控件序列文件视图管理控件执行视图管理控件可视化控件视图连接列表连接命令连接信息源连接在 LabVIEW 中&#xff0c;TestStand 相关的所有控件都在estStand 选板上这些控件全部是Active X控件&#xff0c;LabVIEW对它的编程是属性节点、方法节点及…

ActivityManagerService,给我启动个App瞅瞅呗

前言 其实早在几年前&#xff0c;我就有一个疑问。 为什么我们的逻辑代码写在Activity中&#xff0c;在App启动后就会执行到它。为什么第三方库的初始化要写在Application中&#xff0c;而它为什么执行顺序比Activity还要靠前。 如果您想搞清楚这些原因&#xff0c;那么本文…

3年经验去面试20k测试岗,看到这样的面试题我还是心虚了....

我是着急忙慌的准备简历——3年软件测试经验&#xff0c;可独立测试大型产品项目&#xff0c;熟悉项目测试流程...薪资要求&#xff1f;3年测试经验起码能要个20K吧 我加班肝了一页半简历&#xff0c;投出去一周&#xff0c;面试电话倒是不少&#xff0c;自信满满去面试&#…