卡尔曼滤波(Kalman Filter,KF)基础推导及其实例

2023-10-29 18:20

本文主要是介绍卡尔曼滤波(Kalman Filter,KF)基础推导及其实例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 卡尔曼滤波(Kalman Filter,KF)
    • 涉及到的主要知识
    • 卡尔曼滤波中涉及的几个常用概念
    • 卡尔曼滤波中最重要的五个公式
    • 卡尔曼增益的推导
    • 后验估计表达式的推导
    • 误差协方差矩阵的推导
    • 卡尔曼滤波在控制领域应用的推导
  • 卡尔曼增益详解
    • 卡尔曼增益的计算方式
    • 卡尔曼增益的解读
  • 卡尔曼滤波的应用
    • 普通应用中的一般流程
    • 实例说明
    • 应用实例(matlab):预测实际硬币的直径

卡尔曼滤波(Kalman Filter,KF)

自用笔记,带一些个人理解和知识拓展,详见b站Dr.CAN卡尔曼滤波专题,权侵删
本篇为卡尔曼滤波入门介绍,推导基于线性控制系统,但使用例子为测量硬币真实直径

涉及到的主要知识

  • 线性代数
  • 概率论
  • 矩阵论
  • 最优估计

卡尔曼滤波中涉及的几个常用概念

  • 先验估计:通过理论公式计算得到的,无干扰情况下理论的输出值
  • 卡尔曼增益:通过概率论知识,估计出对理论输出值的实际输出误差补偿
  • 后验估计:理论计算+综合考虑了干扰影响后的实际输出值(通过概率对误差进行估计,然后反馈补偿到理论输出值上)

卡尔曼滤波中最重要的五个公式

已知:实际控制系统中存在过程噪声 w w w和测量噪声 v v v,它们均符合高斯分布,分别写作
{ x k = A x k − 1 + w k − 1 z k = H x k + v k { w ∼ p ( 0 , Q ) v ∼ p ( 0 , R ) \begin{cases} x_k = Ax_{k-1}+w_{k-1}\\ z_k = Hx_k + v_k \end{cases}\\ \begin{cases} w \sim p(0,Q)\\ v \sim p(0,R) \end{cases} {xk=Axk1+wk1zk=Hxk+vk{wp(0,Q)vp(0,R)
式中 0 0 0表示两种噪声的期望值, Q Q Q R R R分别表示两种噪声分布的方差。
经过推导,得到以下五个重要公式
先验估计: x ^ k − = A x 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 − 1 + K k ( z k − x ^ k − 1 ) 更新误差协方差: P k = ( I − K k H ) P k − \begin{split} 先验估计:\hat x_k^- &= Ax_{k-1}\\ 先验误差协方差:P_k^- &= AP_{k-1}A^T + Q\\ 卡尔曼增益:K_k &= \frac{P_k^-H^T}{HP_k^-H^T + R}\\ 后验估计:\hat x_k &= \hat x_{k-1}+K_k(z_k - \hat x_{k-1})\\ 更新误差协方差:P_k &= (I - K_kH)P_k^- \end{split} 先验估计:x^k先验误差协方差:Pk卡尔曼增益:Kk后验估计:x^k更新误差协方差:Pk=Axk1=APk1AT+Q=HPkHT+RPkHT=x^k1+Kk(zkx^k1)=(IKkH)Pk

卡尔曼增益的推导

已知两个相互独立事件的目标发生概率分别为 σ 1 \sigma_1 σ1 σ 2 \sigma_2 σ2,求其联合概率 σ Z ^ \sigma_{\hat Z} σZ^。求 K k K_k Kk促使 σ Z ^ \sigma_{\hat Z} σZ^的不确定性最小,即求方差 v a r ( Z ^ ) var(\hat Z) var(Z^)最小值,此时即为最优解,推导过程如下
σ Z ^ 2 = v a r [ Z 1 + K k ( Z 2 − Z 1 ) ] = v a r ( Z 1 − K k Z 1 + K k Z 2 ) = v a r [ ( 1 − K k ) Z 1 + K k Z 2 ] = v a r [ ( 1 − K k ) Z 1 ] + v a r ( K k Z 2 ) = ( 1 − K k ) 2 v a r ( Z 1 ) + K k 2 v a r ( Z 2 ) = ( 1 − K k ) 2 σ 1 2 + K k 2 σ 2 2 \begin{split} \sigma_{\hat Z}^2 &= var[Z_1+K_k(Z_2-Z_1)]\\ &=var(Z_1-K_kZ_1+K_kZ_2)\\ &=var[(1-K_k)Z_1+K_kZ_2]\\ &=var[(1-K_k)Z_1]+var(K_kZ_2)\\ &=(1-K_k)^2var(Z_1)+K_k^2var(Z_2)\\ &=(1-K_k)^2\sigma_1^2+K_k^2\sigma_2^2\\ \end{split} σZ^2=var[Z1+Kk(Z2Z1)]=var(Z1KkZ1+KkZ2)=var[(1Kk)Z1+KkZ2]=var[(1Kk)Z1]+var(KkZ2)=(1Kk)2var(Z1)+Kk2var(Z2)=(1Kk)2σ12+Kk2σ22
为了求解方差 v a r ( Z ^ ) var(\hat Z) var(Z^)最小值,对上式进行求导,找其零点,因此易得
δ σ Z ^ 2 δ K k = − 2 ( 1 − K k ) σ 1 2 + 2 K k σ 2 2 = 0 \frac{\delta\sigma_{\hat Z}^2}{\delta K_k} = -2(1-K_k)\sigma_1^2+2K_k\sigma_2^2=0\\ δKkδσZ^2=2(1Kk)σ12+2Kkσ22=0
对其进行整理,有
− σ 1 2 + K k σ 1 2 + K k σ 1 2 = 0 K k ( σ 1 2 + σ 2 2 ) = σ 1 2 ⇒ K k = σ 1 2 σ 1 2 + σ 2 2 \begin{split} -\sigma_1^2+K_k\sigma_1^2+K_k\sigma_1^2&=0\\ K_k(\sigma_1^2+\sigma_2^2)&=\sigma_1^2\\ \Rightarrow K_k&=\frac{\sigma_1^2}{\sigma_1^2+\sigma_2^2} \end{split} σ12+Kkσ12+Kkσ12Kk(σ12+σ22)Kk=0=σ12=σ12+σ22σ12

后验估计表达式的推导

估计真实数据的通常做法为:取多次测量的平均值。根据该思想,写出测量k次时的估计真实值,表达式如下
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 \begin{split} \hat x_k &= \frac 1k(z_1+z_2+...+z_k)\\ &= \frac 1k(z_1+z_2+...+z_{k-1})+\frac 1kz_k\\ &= \frac 1k·\frac{k-1}{k-1}(z_1+z_2+...+z_{k-1})+\frac 1kz_k\\ \end{split} x^k=k1(z1+z2+...+zk)=k1(z1+z2+...+zk1)+k1zk=k1k1k1(z1+z2+...+zk1)+k1zk
上式中 ( z 1 + z 2 + . . . + z k − 1 ) / k − 1 (z_1+z_2+...+z_{k-1})/{k-1} (z1+z2+...+zk1)/k1为第k-1次测量时的平均估计值 x ^ k − 1 \hat x_{k-1} x^k1,因此上式可改写为
x ^ 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{split} \hat x_k &= \frac {k-1}{k}\hat x_{k-1}+\frac 1kz_k\\ &= \hat x_{k-1} - \frac 1k \hat x_{k-1} + \frac 1kz_k\\ &= \hat x_{k-1}+\frac 1k(z_k - \hat x_{k-1}) \end{split} x^k=kk1x^k1+k1zk=x^k1k1x^k1+k1zk=x^k1+k1(zkx^k1)
式中的 1 k \frac 1k k1称为卡尔曼增益(卡尔曼系数),常写作 K k K_k Kk。经过整理后即为尔曼滤波的核心公式之一,写作
x ^ k = x ^ k − 1 + K k ( z k − x ^ k − 1 ) \hat x_k= \hat x_{k-1}+K_k(z_k - \hat x_{k-1}) x^k=x^k1+Kk(zkx^k1)
该式的物理含义为:

当前的估计值 = 上一次的估计值 + 卡尔曼增益*(当前测量值-上一次的估计值)

误差协方差矩阵的推导

经过上面的推导,现在应用卡尔曼滤波时只剩下联合概率的先验值 P k − P_k^- Pk是未知的了,因此我们即将推导它的公式,已知联合概率的先验表达式如下
P k − = E ( e k − e k − T ) P_k^- = E(e_k^-e_k^{-T}) Pk=E(ekekT)
由之前的推导已知
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 ( x k − 1 − x ^ k − ) + w k − 1 = A e k − 1 + w k − 1 \begin{split} e_k^- &= x_k^- - \hat x_k^-\\ &= Ax_{k-1} + Bu_{k-1} + w_{k-1} - A \hat x_{k-1} - Bu_{k-1}\\ &= A(x_{k-1} - \hat x_k^-) + w_{k-1}\\ &= Ae_{k-1} + w_{k-1} \end{split} ek=xkx^k=Axk1+Buk1+wk1Ax^k1Buk1=A(xk1x^k)+wk1=Aek1+wk1
将该结果代入原式后可得
P k − = E ( e k − e k − T ) = E [ ( A e k − 1 + w k − 1 ) ( A e k − 1 + w k − 1 ) T ] = E [ ( A e k − 1 + w k − 1 ) ( A e k − 1 ) T + ( w k − 1 ) T ] = E [ ( A e k − 1 + w k − 1 ) ( e k − 1 T A T + w k − 1 T ] = E ( A e k − 1 e k − 1 T A T + A e k − 1 w k − 1 T + w k − 1 e k − 1 T A T + w k − 1 w k − 1 T ) = E ( A e k − 1 e k − 1 T A T ) + E ( A e k − 1 w k − 1 T ) + E ( w k − 1 e k − 1 T A T ) + E ( w k − 1 w k − 1 T ) \begin{split} P_k^- &= E(e_k^-e_k^{-T})\\ &= E[(Ae_{k-1} + w_{k-1})(Ae_{k-1} + w_{k-1})^T]\\ &= E[(Ae_{k-1} + w_{k-1})(Ae_{k-1})^T + (w_{k-1})^T]\\ &= E[(Ae_{k-1} + w_{k-1})(e_{k-1}^TA^T + w_{k-1}^T]\\ &= E(Ae_{k-1}e_{k-1}^TA^T + Ae_{k-1}w_{k-1}^T + w_{k-1}e_{k-1}^TA^T + w_{k-1}w_{k-1}^T)\\ &= E(Ae_{k-1}e_{k-1}^TA^T) + E(Ae_{k-1}w_{k-1}^T) + E(w_{k-1}e_{k-1}^TA^T) + E(w_{k-1}w_{k-1}^T)\\ \end{split} Pk=E(ekekT)=E[(Aek1+wk1)(Aek1+wk1)T]=E[(Aek1+wk1)(Aek1)T+(wk1)T]=E[(Aek1+wk1)(ek1TAT+wk1T]=E(Aek1ek1TAT+Aek1wk1T+wk1ek1TAT+wk1wk1T)=E(Aek1ek1TAT)+E(Aek1wk1T)+E(wk1ek1TAT)+E(wk1wk1T)
关注上式中的第二项与第三项,根据下式
e k − 1 = x k − 1 − x ^ k − 1 x k = A x k − 1 + B u k − 1 + w k − 1 e_{k-1} = x_{k-1} - \hat x_{k-1}\\ x_k = Ax_{k-1}+Bu_{k-1} + w_{k-1}\\ ek1=xk1x^k1xk=Axk1+Buk1+wk1
可知, e k − 1 e_{k-1} ek1作用于k-1时刻,而 w k − 1 w_{k-1} wk1作用于k时刻,因此两个概率是独立的,并且两者均满足高斯分布,因此它们的期望均为0,因此推导式可写为
P k − = E ( A e k − 1 e k − 1 T A T ) + E ( A e k − 1 ) E ( w k − 1 T ) + A T E ( w k − 1 ) E ( e k − 1 T ) + E ( w k − 1 w k − 1 T ) = E ( A e k − 1 e k − 1 T A T ) + 0 + 0 + E ( w k − 1 w k − 1 T ) = A E ( e k − 1 e k − 1 T ) A T + E ( w k − 1 w k − 1 T ) ⇒ = A P k − 1 A T + Q \begin{split} P_k^- &= E(Ae_{k-1}e_{k-1}^TA^T) + E(Ae_{k-1})E(w_{k-1}^T) + A^TE(w_{k-1})E(e_{k-1}^T) + E(w_{k-1}w_{k-1}^T)\\ &= E(Ae_{k-1}e_{k-1}^TA^T) + 0 + 0 + E(w_{k-1}w_{k-1}^T)\\ &= AE(e_{k-1}e_{k-1}^T)A^T + E(w_{k-1}w_{k-1}^T)\\ \Rightarrow&= AP_{k-1}A^T + Q\\ \end{split} Pk=E(Aek1ek1TAT)+E(Aek1)E(wk1T)+ATE(wk1)E(ek1T)+E(wk1wk1T)=E(Aek1ek1TAT)+0+0+E(wk1wk1T)=AE(ek1ek1T)AT+E(wk1wk1T)=APk1AT+Q

卡尔曼滤波在控制领域应用的推导

控制领域的状态空间方程在实际应用过程中存在着两个问题,其一为表示系统状态的状态量在传输过程中存在着过程噪声 w w w,以及基于传感器等的测量的实际输出量存在着测量噪声 v v v。由于这两个未知量的引入,导致我们实际得到的数据与真实值存在一个波动的误差。带噪声的状态空间方程表示如下
{ x k = A x k − 1 + B u k − 1 + w k − 1 z k = H x k + v k \begin{cases} x_k = Ax_{k-1}+Bu_{k-1}+w_{k-1}\\ z_k = Hx_k + v_k \end{cases} {xk=Axk1+Buk1+wk1zk=Hxk+vk
噪声的取值满足高斯分布,分别写作 P ( w ) ∼ N ( 0 , Q ) P(w)\sim N(0,Q) P(w)N(0,Q)以及 P ( w ) ∼ N ( 0 , R ) P(w)\sim N(0,R) P(w)N(0,R)。由于这两个噪声的存在,状态量与输出量就从原来的真实值变成了带偏差的估计值。根据原有的状态空间方程我们可以得到状态量的先验估计值(算出来的结果) x ^ k − \hat x_k^- x^k以及测量估计值(测出来的结果) x ^ k m e a s \hat x_{k_{meas}} x^kmeas,他们的计算公式如下
{ x k = A x k − 1 + B u k − 1 z k = H x k ⇒ { x ^ k − = A x k − 1 + B u k − 1 x ^ k m e a s = H − 1 z k \begin{cases} x_k = Ax_{k-1}+Bu_{k-1}\\ z_k = Hx_k \end{cases}\\ \Rightarrow \begin{cases} \hat x_k^- = Ax_{k-1}+Bu_{k-1}\\ \hat x_{k_{meas}} = H^{-1}z_k \end{cases} {xk=Axk1+Buk1zk=Hxk{x^k=Axk1+Buk1x^kmeas=H1zk
由于误差是无法通过建模得到的,因此只能引入概率论中的相关知识,由这两个带误差的结果得到一个更加接近真实值的结果(上节的推导)。根据之前的推导,它们之间存在如下关系
x ^ k = x ^ k − + G ( H − 1 z k − x ^ k − ) \hat x_k = \hat x_k^- + G(H^{-1}z_k - \hat x_k^-) x^k=x^k+G(H1zkx^k)
这种经过处理得到的更为接近的对真值的估计值被称作后验估计 x ^ k \hat x_k x^k。为了方便理解,上式通常会进行该变换 G = K k H G=K_kH G=KkH,经该变换后 K k K_k Kk的取值由原来的 [ 0 , 1 ] [0,1] [0,1]变为 [ 0 , H − 1 ] [0,H^{-1}] [0,H1]。上式经整理后写作
x ^ k = x ^ k − + K k ( z k − H x ^ k − ) \hat x_k = \hat x_k^- + K_k(z_k - H\hat x_k^-) x^k=x^k+Kk(zkHx^k)
此时我们的目标就变为了:寻找一个 K k K_k Kk使得 x ^ k ⇒ x k \hat x_k \Rightarrow x_k x^kxk,在概率论中表示即为 t r ( p ) tr(p) tr(p)最小。写作
e k = 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 − = x k − x ^ k − − K k ( H x k + v k ) + K k H x ^ 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 \begin{split} e_k &= x_k - \hat x_k\\ &= x_k -[\hat x_k^- + K_k(z_k - H\hat x_k^-)]\\ &= x_k -\hat x_k^- - K_kz_k + K_kH\hat x_k^-\\ &= x_k -\hat x_k^- - K_k(Hx_k + v_k) + K_kH\hat x_k^-\\ &= x_k -\hat x_k^- - K_kHx_k - K_kv_k + K_kH\hat x_k^-\\ &= (x_k -\hat x_k^-) - K_kH(x_k - \hat x_k^-) - K_kv_k \\ &= (I-K_kH)(x_k -\hat x_k^-) - K_kv_k \\ \end{split} ek=xkx^k=xk[x^k+Kk(zkHx^k)]=xkx^kKkzk+KkHx^k=xkx^kKk(Hxk+vk)+KkHx^k=xkx^kKkHxkKkvk+KkHx^k=(xkx^k)KkH(xkx^k)Kkvk=(IKkH)(xkx^k)Kkvk
其中, x k − x ^ k − x_k -\hat x_k^- xkx^k可以写作误差的先验值 e k − e_k^- ek。假设误差 e k e_k ek满足高斯分布,即 p ( e k ) ∼ N ( 0 ( 期望 ) , P ( 方差 ) ) p(e_k)\sim N(0(期望),P(方差)) p(ek)N(0(期望),P(方差)),其方差可表示为
P k = E [ e k e k T ] = E [ ( x k − x ^ k ) ( x k − x ^ k ) T ] = E { [ ( I − K k H ) e k − − K k v k ] [ ( I − K k H ) e k − − K k v k ] T } = E { [ ( I − K k H ) e k − − K k v k ] [ e k − T ( I − K k H ) T − v k T K k T } = E { [ ( I − K k H ) e k − − K k v k ] [ e k − T ( I − K k H ) T − v k T K k T } = E [ ( I − K k H ) e k − e k − T ( I − K k H ) T − ( I − K k H ) e k − v k T K k T − v k K k e k − T ( I − K k H ) T + v k K k v k T K k T ] = E [ ( I − K k H ) e k − e k − T ( I − K k H ) T ] − E [ ( I − K k H ) e k − v k T K k T ] − E [ v k K k e k − T ( I − K k H ) T ] + E [ v k K k v k T K k T ] \begin{split} P_k &= E[e_ke_k^T]\\ &=E[(x_k -\hat x_k)(x_k -\hat x_k)^T]\\ &=E \lbrace [(I-K_kH)e_k^- - K_kv_k][(I-K_kH)e_k^- - K_kv_k]^T \rbrace\\ &=E \lbrace [(I-K_kH)e_k^- - K_kv_k] [e_k^{-T}(I-K_kH)^T - v_k^TK_k^T \rbrace\\ &=E \lbrace [(I-K_kH)e_k^- - K_kv_k] [e_k^{-T}(I-K_kH)^T - v_k^TK_k^T \rbrace\\ &=E [ (I-K_kH)e_k^-e_k^{-T}(I-K_kH)^T - (I-K_kH)e_k^-v_k^TK_k^T - v_kK_ke_k^{-T}(I-K_kH)^T + v_kK_kv_k^TK_k^T ]\\ &=E[(I-K_kH)e_k^-e_k^{-T}(I-K_kH)^T] - E[(I-K_kH)e_k^-v_k^TK_k^T] - E[v_kK_ke_k^{-T}(I-K_kH)^T] + E[v_kK_kv_k^TK_k^T]\\ \end{split} Pk=E[ekekT]=E[(xkx^k)(xkx^k)T]=E{[(IKkH)ekKkvk][(IKkH)ekKkvk]T}=E{[(IKkH)ekKkvk][ekT(IKkH)TvkTKkT}=E{[(IKkH)ekKkvk][ekT(IKkH)TvkTKkT}=E[(IKkH)ekekT(IKkH)T(IKkH)ekvkTKkTvkKkekT(IKkH)T+vkKkvkTKkT]=E[(IKkH)ekekT(IKkH)T]E[(IKkH)ekvkTKkT]E[vkKkekT(IKkH)T]+E[vkKkvkTKkT]
其中 ( I − K k H ) (I-K_kH) (IKkH) K k T K_k^T KkT都是常数,可以直接从期望计算中提取出来。第二项和第三项其实是等价的,进一步写为
2 ( I − K k H ) K k T ⋅ E ( e k − v k T ) 2(I-K_kH)K_k^T·E(e_k^-v_k^T) 2(IKkH)KkTE(ekvkT)
由于先验误差和测量误差是相互独立的,因此上式改写为
2 ( I − K k H ) K k T ⋅ E ( e k − ) E ( v k T ) 2(I-K_kH)K_k^T·E(e_k^-)E(v_k^T) 2(IKkH)KkTE(ek)E(vkT)
而二者都满足高斯分布,因此它们各自的期望值均为0,该项的结果为0。则原式子写为
P k = ( I − K k H ) E ( e k − e k − T ) ( I − K k H ) T − E [ ( I − K k H ) e k − v k T K k T ] + K k E ( v k v k T ) K k T = ( P k − − K k H P k − ) ( I − H T K k T ) + K k R K k T ⇒ = P k − − P k − H T K k T − K k H P k − + K k H P k − H T K k T + K k R K k T \begin{split} P_k &= (I-K_kH)E(e_k^-e_k^{-T})(I-K_kH)^T - E[(I-K_kH)e_k^-v_k^TK_k^T] + K_kE(v_kv_k^T)K_k^T\\ &= (P_k^- - K_kHP_k^-)(I - H^TK_k^T) + K_kRK_k^T\\ \Rightarrow&= P_k^- - P_k^-H^TK_k^T - K_kHP_k^- + K_kHP_k^-H^TK_k^T + K_kRK_k^T \end{split} Pk=(IKkH)E(ekekT)(IKkH)TE[(IKkH)ekvkTKkT]+KkE(vkvkT)KkT=(PkKkHPk)(IHTKkT)+KkRKkT=PkPkHTKkTKkHPk+KkHPkHTKkT+KkRKkT
t r ( A B ) tr(AB) tr(AB)为矩阵A与矩阵B相乘后对角线元素之和,改写为求解 P k P_k Pk的迹的形式为
t r ( P k ) = t r ( P k − ) − 2 t r ( K k H P k − ) + t r ( K k H P k − H T K k T ) + t r ( K k R K k T ) tr(P_k) = tr(P_k^-) - 2tr(K_kHP_k^-) + tr(K_kHP_k^-H^TK_k^T) + tr(K_kRK_k^T) tr(Pk)=tr(Pk)2tr(KkHPk)+tr(KkHPkHTKkT)+tr(KkRKkT)
为了求解迹最小的情况,以下表述出其一阶导数形式
d t r ( P k ) d K k = 0 − 2 ( H P k − ) T + 2 K k H P k − H T + 2 K k R = P k − T H T + K k ( H P k − H T + R ) (协方差矩阵的转置等于它自己) = P k − T H + K k ( H P k − H T + R ) \begin{split} \frac{dtr(P_k)}{dK_k} &= 0 - 2(HP_k^-)^T + 2K_kHP_k^-H^T + 2K_kR\\ &= P_k^{-T}H^T + K_k(HP_k^-H^T + R)\\ (协方差矩阵的转置等于它自己)&= P_k^{-T}H + K_k(HP_k^-H^T + R)\\ \end{split} dKkdtr(Pk)(协方差矩阵的转置等于它自己)=02(HPk)T+2KkHPkHT+2KkR=PkTHT+Kk(HPkHT+R)=PkTH+Kk(HPkHT+R)
上式求解中涉及到一个矩阵求偏导的变换,写作
d t r ( A B ) d A = B T \frac{dtr(AB)}{dA} = B^T dAdtr(AB)=BT
其证明如下
t r ( A B ) = A ⋅ B = [ a 11 a 12 a 21 a 22 ] [ b 11 b 12 b 21 b 22 ] 取对角元素之和 = a 11 b 11 + a 12 b 21 + a 21 b 12 + a 22 b 22 d t r ( A B ) d A = [ ∂ t r ( A B ) ∂ a 11 ∂ t r ( A B ) ∂ a 12 ∂ t r ( A B ) ∂ a 21 ∂ t r ( A B ) ∂ a 22 ] = [ b 11 b 12 b 21 b 22 ] = B T \begin{split} tr(AB) &= A·B \\ &= \begin{bmatrix} a_{11}&a_{12}\\a_{21}&a_{22} \end{bmatrix} \begin{bmatrix} b_{11}&b_{12}\\b_{21}&b_{22} \end{bmatrix}\\ 取对角元素之和&= a_{11}b_{11} + a_{12}b_{21} + a_{21}b_{12} + a_{22}b_{22}\\ \frac{dtr(AB)}{dA} &= \begin{bmatrix} \frac{\partial tr(AB)}{\partial a_{11}}& \frac{\partial tr(AB)}{\partial a_{12}}\\ \frac{\partial tr(AB)}{\partial a_{21}}& \frac{\partial tr(AB)}{\partial a_{22}}\\ \end{bmatrix}\\ &= \begin{bmatrix} b_{11}&b_{12}\\ b_{21}&b_{22}\\ \end{bmatrix}\\ &= B^T \end{split} tr(AB)取对角元素之和dAdtr(AB)=AB=[a11a21a12a22][b11b21b12b22]=a11b11+a12b21+a21b12+a22b22=[a11tr(AB)a21tr(AB)a12tr(AB)a22tr(AB)]=[b11b21b12b22]=BT
当一阶导为零时,此时求得的值为迹的最小(最优解),整理如下
d t r ( P k ) d K k = P k − T H + K k ( H P k − H T + R ) = 0 ⇒ 0 − 2 ( h P k − ) T + 2 K k H P k − H T + 2 K k R = 0 − P k − H T + K k ( H P k − + R ) = 0 K k ( H P k − H T + R ) = P k − H T ⇒ K k = P k − H T H P k − H T + R \frac{dtr(P_k)}{dK_k} = P_k^{-T}H + K_k(HP_k^-H^T + R) = 0\\ \begin{split} \Rightarrow 0 - 2(hP_k^-)^T + 2K_kHP_k^-H^T + 2K_kR &= 0\\ -P_k^-H^T + K_k(HP_k^-+R) &= 0\\ K_k(HP_k^-H^T + R) &= P_k^-H^T\\ \Rightarrow K_k = \frac{P_k^-H^T}{HP_k^-H^T + R} \end{split} dKkdtr(Pk)=PkTH+Kk(HPkHT+R)=002(hPk)T+2KkHPkHT+2KkRPkHT+Kk(HPk+R)Kk(HPkHT+R)Kk=HPkHT+RPkHT=0=0=PkHT

卡尔曼增益详解

卡尔曼增益的计算方式

估计误差 ( e s t i m a t e ) e E S T = ∣ x − x ^ ∣ 测量误差 ( m e a s u r e ) e M E A = ∣ x − z ∣ 卡尔曼增益 K k = e E S T k − 1 e E S T k − 1 + e M E A k 估计误差(estimate)\hspace{0.5cm}e_{EST} = |x - \hat x|\\ 测量误差(measure)\hspace{0.5cm}e_{MEA} = |x - z|\\ 卡尔曼增益\hspace{0.5cm}K_k = \frac{e_{EST_{k-1}}}{e_{EST_{k-1}}+e_{MEA_k} } 估计误差(estimate)eEST=xx^测量误差(measure)eMEA=xz卡尔曼增益Kk=eESTk1+eMEAkeESTk1

卡尔曼增益的解读

在k时刻,存在两种情况
① k-1时刻的估计误差远远大于k时的测量误差,即
e E S T k − 1 ≫ e M E A k e_{EST_{k-1}} \gg e_{MEA_k} eESTk1eMEAk
有以下关系
{ K k ⇒ 1 x ^ k = x ^ k − 1 + z k − x ^ k − 1 = z k \begin{cases} \begin{split} K_k&\Rightarrow1\\ \hat x_k &= \hat x_{k-1} + z_k - \hat x_{k-1} \\ &= z_k \end{split} \end{cases} Kkx^k1=x^k1+zkx^k1=zk
此时第k次的估计真值等于第k次的测量值
② k-1时刻的估计误差远远小于k时的测量误差
e E S T k − 1 ≪ e M E A k e_{EST_{k-1}} \ll e_{MEA_k} eESTk1eMEAk
有以下关系
{ K k ⇒ 0 x ^ k = x ^ k − 1 \begin{cases} K_k\Rightarrow0\\ \hat x_k = \hat x_{k-1} \end{cases} {Kk0x^k=x^k1
此时第k次的估计真值等于上一次的估计真值。

卡尔曼滤波的应用

普通应用中的一般流程

  1. 计算卡尔曼增益 K k K_k Kk
    K k = e E S T k − 1 e E S T k − 1 + e M E A k K_k = \frac{e_{EST_{k-1}}}{e_{EST_{k-1}}+e_{MEA_k}} Kk=eESTk1+eMEAkeESTk1
  2. 计算当前的估计值 x ^ k \hat x_k x^k
    x ^ k = x ^ k − 1 + K k ⋅ ( z k − x ^ k − 1 ) \hat x_k= \hat x_{k-1}+K_k·(z_k - \hat x_{k-1}) x^k=x^k1+Kk(zkx^k1)
  3. 更新当前的估计误差 e E S T k e_{EST_k} eESTk
    e E S T k = ( 1 − K k ) ⋅ e E S T k − 1 e_{EST_k} = (1-K_k)·e_{EST_{k-1}} eESTk=(1Kk)eESTk1

实例说明

生产硬币的机器在实际生产时会由于各种影响因素导致误差生产出来的硬币直径与设计尺寸存在一定误差(误差1),当我们对真实硬币的直径进行测量时,每次也会引入一定误差(误差2)。利用卡尔曼滤波对硬币真实的直径进行预测。

应用实例(matlab):预测实际硬币的直径

clear;clc;close all;
%% 测量硬币的直径,已知条件
x = 50;          % 实际长度,mm
hat_x = 45;    % 第一次估计值
est_error = 5;  % 估计误差
z = [51 48 47 52 51 48 49 53 48 49 52 53 51 52 49 50];      % 测量长度
mea_error = 3;   % 测量误差,即测量值在真实值±3mm内波动
%% main
k = 16;
K_k = zeros(k,1);
for i = 1:kK_k(i) = est_error/(est_error + mea_error); % Kalman_Gainhat_x = hat_x + K_k(i)*(z(i)-hat_x);Hat_x(i) = hat_x;est_error = (1-K_k(i))*est_error;Est_error(i) = est_error;
end
figure;
plot(ones(1,17)*x,'g-');hold on;
plot(z,'ro-');hold on;
plot([45,Hat_x],'bo-')
legend("真实值","测量值","滤波后的估计值",'Location','southeast')

在这里插入图片描述

这篇关于卡尔曼滤波(Kalman Filter,KF)基础推导及其实例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/302496

相关文章

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

C 语言基础之数组

文章目录 什么是数组数组变量的声明多维数组 什么是数组 数组,顾名思义,就是一组数。 假如班上有 30 个同学,让你编程统计每个人的分数,求最高分、最低分、平均分等。如果不知道数组,你只能这样写代码: int ZhangSan_score = 95;int LiSi_score = 90;......int LiuDong_score = 100;int Zhou

Java Websocket实例【服务端与客户端实现全双工通讯】

Java Websocket实例【服务端与客户端实现全双工通讯】 现很多网站为了实现即时通讯,所用的技术都是轮询(polling)。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP request,然后由服务器返回最新的数据给客服端的浏览器。这种传统的HTTP request 的模式带来很明显的缺点 – 浏 览器需要不断的向服务器发出请求,然而HTTP