• 卡尔曼滤波(2):让算法运转起来


    系列文章目录

    卡尔曼滤波(1):状态更新方程的推导
    卡尔曼滤波(2):让算法运转起来



    前言

    在上一篇文章中,我们展示了卡尔曼滤波状态更新方程的推导思路,并得到状态更新方程:
    X ^ ( k + 1 / k + 1 ) = X ^ ( k + 1 / k ) + K ( k + 1 ) Z ~ ( k + 1 / k ) \hat{X}(k+1/k+1) = \hat{X}(k+1/k) + K(k+1) \tilde{Z}(k+1/k) X^(k+1/k+1)=X^(k+1/k)+K(k+1)Z~(k+1/k)
    其中,
    K ( k + 1 ) = P ( k + 1 / k ) H T ( k + 1 ) S − 1 ( k + 1 / k ) S ( k + 1 / k ) = H ( k + 1 ) P T ( k + 1 / k ) H T ( k + 1 ) + R ( k + 1 )

    K(k+1)=P(k+1/k)HT(k+1)S1(k+1/k)S(k+1/k)=H(k+1)PT(k+1/k)HT(k+1)+R(k+1)
    K(k+1)S(k+1/k)=P(k+1/k)HT(k+1)S1(k+1/k)=H(k+1)PT(k+1/k)HT(k+1)+R(k+1)
    本文,我们给出卡尔曼滤波算法的具体实现流程,让算法能够运转起来!


    一、明确变量是否已知

    1.状态值与测量值

    “状态”是物体固有的变化属性,故状态值是无法直接获得的,只能进行估计。与之相对的,经过工具测量,我们获得的数据为“量测”,故量测值是可以直接通过测量获得的。那么,

    变量说明
    X ( k ) X(k) X(k)未知
    X ^ ( k / k ) \hat{X}(k/k) X^(k/k) k k k时刻通过状态更新方程获得,在 k , k + 1 , ⋯ k,k+1,\cdots k,k+1,时刻已知
    X ^ ( k + 1 / k ) \hat{X}(k+1/k) X^(k+1/k) k + 1 k+1 k+1时刻通过状态预测方程获得,在 k + 1 , k + 2 , ⋯ k+1,k+2,\cdots k+1,k+2,时刻已知
    Z ( k ) Z(k) Z(k) k k k时刻直接测量获得,在 k , k + 1 , ⋯ k,k+1,\cdots k,k+1,时刻已知

    2.协方差矩阵

    首先,对于过程噪声的协方差矩阵 Q ( k ) Q(k) Q(k)和量测噪声的协方差矩阵 R ( k ) R(k) R(k),二者是无法获得的,通常作为先验参数进行设置。
    其次,状态协方差矩阵 P ( j / k ) P(j/k) P(j/k)和量测协方差 S ( j / k ) S(j/k) S(j/k)具有“统计意义”,即依据定义,二者是通过“均值”得到的。因此,对于少量样本数据,二者也是无法直接获得的,通常通过先验参数和递推公式进行计算。那么,

    变量说明
    P ( 0 / 0 ) , Q ( k ) , R ( k ) P(0/0),Q(k),R(k) P(0/0),Q(k),R(k)先验参数,人为设定
    P ( k / k − 1 ) , k ≥ 1 P(k/k-1), k \geq 1 P(k/k1),k1 k k k时刻通过 P ( k − 1 / k − 1 ) P(k-1/k-1) P(k1/k1)计算获得,在 k , k + 1 , ⋯ k,k+1,\cdots k,k+1,时刻已知
    P ( k / k ) , k ≥ 1 P(k/k), k \geq 1 P(k/k),k1 k k k时刻通过 P ( k / k − 1 ) P(k/k-1) P(k/k1)计算获得,在 k , k + 1 , ⋯ k,k+1,\cdots k,k+1,时刻已知
    S ( k / k − 1 ) , k ≥ 1 S(k/k-1), k \geq 1 S(k/k1),k1 k k k时刻通过 P ( k / k ) P(k/k) P(k/k)计算获得,在 k , k + 1 , ⋯ k,k+1,\cdots k,k+1,时刻已知

    二、让算法运转起来

    步骤序号公式说明
    0 P ( 0 / 0 ) = P 0 P(0/0)=P_0 P(0/0)=P0, X ( 0 / 0 ) = X 0 X(0/0)=X_0 X(0/0)=X0, Q ( k ) = Q 0 Q(k)=Q_0 Q(k)=Q0, R ( k ) = R 0 R(k)=R_0 R(k)=R0, G ( k ) = G 0 G(k)=G_0 G(k)=G0变量初始化,设定初始值,设定先验参数
    1 P ( k + 1 / k ) = Φ ( k + 1 ) P ( k / k ) Φ T ( k + 1 ) + G ( k ) Q ( k ) G T ( k ) P(k+1/k) = \Phi(k+1)P(k/k)\Phi^T(k+1) + G(k)Q(k)G^T(k) P(k+1/k)=Φ(k+1)P(k/k)ΦT(k+1)+G(k)Q(k)GT(k)计算状态预测协方差矩阵
    2 S ( k + 1 / k ) = H ( k + 1 ) P ( k + 1 / k ) H T ( k + 1 ) + R ( k + 1 ) S(k+1/k) = H(k+1)P(k+1/k)H^T(k+1) + R(k+1) S(k+1/k)=H(k+1)P(k+1/k)HT(k+1)+R(k+1)计算量测预测协方差矩阵
    3 K ( k + 1 ) = P ( k + 1 / k ) H T ( k + 1 ) S − 1 ( k + 1 / k ) K(k+1)=P(k+1/k)H^T(k+1)S^{-1}(k+1/k) K(k+1)=P(k+1/k)HT(k+1)S1(k+1/k)计算卡尔曼增益
    4 X ^ ( k + 1 / k ) = Φ ( k ) X ^ ( k / k ) + Γ ( k ) u ( k ) \hat{X}(k+1/k) = \Phi(k)\hat{X}(k/k) + \Gamma(k)u(k) X^(k+1/k)=Φ(k)X^(k/k)+Γ(k)u(k),或者, X ^ ( k + 1 / k ) = Φ ( k ) X ^ ( k / k ) \hat{X}(k+1/k) = \Phi(k)\hat{X}(k/k) X^(k+1/k)=Φ(k)X^(k/k)获得 k + 1 k+1 k+1时刻状态预测值
    5 Z ~ ( k + 1 / k ) = Z ( k + 1 ) − Z ^ ( k + 1 / k ) = Z ( k + 1 ) − H ( k + 1 ) X ^ ( k + 1 / k )
    Z~(k+1/k)=Z(k+1)Z^(k+1/k)=Z(k+1)H(k+1)X^(k+1/k)
    Z~(k+1/k)=Z(k+1)Z^(k+1/k)=Z(k+1)H(k+1)X^(k+1/k)
    获得 k + 1 k+1 k+1时刻量测预测误差
    6 X ^ ( k + 1 / k + 1 ) = X ^ ( k + 1 / k ) + K ( k + 1 ) Z ~ ( k + 1 / k ) \hat{X}(k+1/k+1) = \hat{X}(k+1/k) + K(k+1) \tilde{Z}(k+1/k) X^(k+1/k+1)=X^(k+1/k)+K(k+1)Z~(k+1/k)获得 k + 1 k+1 k+1时刻状态滤波值(目标)
    7 P ( k + 1 / k + 1 ) = P ( k + 1 / k ) − K ( k + 1 ) H ( k + 1 ) P ( k + 1 / k ) P(k+1/k+1) = P(k+1/k)-K(k+1)H(k+1)P(k+1/k) P(k+1/k+1)=P(k+1/k)K(k+1)H(k+1)P(k+1/k)获得 k + 1 k+1 k+1时刻状态滤波协方差矩阵(用于下一时刻状态预测协方差矩阵的计算)
    8 k = k + 1 k=k+1 k=k+1,跳转到步骤1开始下一时刻的循环

    总结

    以上列举了卡尔曼滤波算法的实现流程。

  • 相关阅读:
    系统驱动 day1
    【Android -- 开发】一份详细的 Android 知识体系
    LeetCode第32题-最长有效括号-java实现-图解思路与手撕代码
    C网络编程socket之connect函数
    Maven下载源码出现:Cannot download sources Sources not found for org.springframwork...
    企业架构LNMP学习笔记17
    nomachine连接无显示器的Ubuntu/Debian时黑屏
    Halcon实用:焊点检出设计思路
    New的原理
    持安科技何艺:基于可信验证的应用访问安全模型 | CCS2023演讲分享
  • 原文地址:https://blog.csdn.net/mddh_123/article/details/125397453