卡尔曼滤波--简单了解,还不够系统

  一、文字介绍描述

      卡尔曼滤波算法的核心思想是利用系统模型和测量数据来推断未知的状态变量,从而达到最优估计的目的。它在处理估计问题时通过连续的基于“先验”信息和测量数据更新估计值,得到最优的估计结果。卡尔曼滤波算法在处理线性动态系统、高斯噪声情况下具有广泛应用。

        卡尔曼滤波算法的基本过程分为两个部分:预测更新

        预测部分根据上一时刻估计出的状态值系统的状态转移方程,通过递归的方式对当前时刻的系统状态进行预测。状态转移方程描述了系统由上一时刻到当前时刻状态的变化规律。

        更新部分根据当前时刻的观测值和观测噪声协方差矩阵,对当前时刻的状态值进行修正,得到更为精确的状态估计值。这个过程被称为校正。

        在卡尔曼滤波中,比例-积分-微分(PID)控制器可以看做是一个特殊的卡尔曼滤波器,只不过其中的预测和更新是针对控制信号而不是状态变量的。PID控制器中通过比例、积分、微分三个部分,对误差进行调整,以控制过程或系统的行为。

        一句话简述卡尔曼滤波器就是:解决估计值和测量值之间的权重关系,从而得到一个更接近真实值的结果,这个结果我们叫最优估计。

        卡尔曼滤波算法能够有效地处理系统状态估计问题,常用于信号处理、控制系统、机器人、计算机图像处理等领域

二、公式

用卡尔曼滤波之前要知道:

①状态变量

        卡尔曼滤波的状态变量指的是系统或过程中需要估计或预测的内部状态。在卡尔曼滤波中,通常将系统的内部状态表示为一个向量,称为状态向量,用符号x表示。

②状态转移方程

        在卡尔曼滤波中,状态转移方程描述了系统内部状态如何随时间的推移而变化。

③观测量是什么

        采集到的数据

        上图是一个以位置和速度作为状态变量的例子,X的导数中的F就是状态转移阵

       连续的状态转移阵和离散的状态转移阵有什么区别:在采集数据时如果数据是一个一个点收集的不是连续完整的数据就需要用到离散的状态转移阵。

        上图是一个以位置和速度和加速度作为状态变量的例子

        H的表示形式就是观测模型矩阵

三、伪代码例子

/  ******  *
  卡尔曼滤波  滤X坐标
  返回值:X坐标
  形参  :X坐标
  ******  **/
  uint16_t Kalman_X(uint16_t Coord_Now_X)
  {
           Coord_X.Z_mearure = Coord_Now_X;
            
      Coord_X.X_mid = Coord_X.X_last;
           Coord_X.P_mid = Coord_X.P_last + Coord_X.Q;
   
           Coord_X.Kg = Coord_X.P_mid/(Coord_X.P_mid+Coord_X.R);//卡尔曼增益
           Coord_X.X_now = Coord_X.X_mid + Coord_X.Kg*(Coord_X.Z_mearure-Coord_X.X_mid);//最优估计值
           Coord_X.P_now = (1 - Coord_X.Kg)*Coord_X.P_mid;//
               
             
           Coord_X.X_last = Coord_X.X_now;
           Coord_X.P_last = Coord_X.P_now;
               
             
           return Coord_X.X_now;
  }
  /  ******  *
  卡尔曼滤波  滤Y坐标
  返回值:Y坐标
  形参  :Y坐标
  ******  **/
  uint16_t Kalman_Y(uint16_t Coord_Now_Y)
  {
           Coord_Y.Z_mearure = Coord_Now_Y;
            
      Coord_Y.X_mid = Coord_Y.X_last;
           Coord_Y.P_mid = Coord_Y.P_last + Coord_Y.Q;
   
           Coord_Y.Kg = Coord_Y.P_mid/(Coord_Y.P_mid+Coord_Y.R);//卡尔曼增益
           Coord_Y.X_now = Coord_Y.X_mid + Coord_Y.Kg*(Coord_Y.Z_mearure-Coord_Y.X_mid);//最优估计值
           Coord_Y.P_now = (1 - Coord_Y.Kg)*Coord_Y.P_mid;//
               
             
           Coord_Y.X_last = Coord_Y.X_now;
           Coord_Y.P_last = Coord_Y.P_now;
               
             
           return Coord_Y.X_now;

        这段代码是一个简单的卡尔曼滤波器,用于对输入的X坐标和Y坐标进行滤波处理,返回滤波后的坐标值。

        在代码中,使用了两个结构体Coord_X和Coord_Y来保存X坐标和Y坐标的状态信息。主要包括以下几个变量:

        Z_mearure:当前的测量值,即输入的坐标值。

        X_mid:状态预测值,也可以理解为上一时刻的坐标估计值。

        P_mid:状态预测的误差协方差矩阵。

        Kg:卡尔曼增益。

        X_now:校正后的最优估计值,即滤波后的坐标值。

        P_now:校正后的状态估计的误差协方差矩阵。

        X_last:上一时刻的最优估计值。

        P_last:上一时刻的状态估计的误差协方差矩阵。

        Q:过程噪声协方差矩阵。(手动调参)

        R:测量噪声协方差矩阵。(手动调参)

        代码首先将当前的测量值赋给Z_mearure,然后进行状态预测。状态预测的过程包括更新X_mid和P_mid的值,其中X_mid等于上一时刻的坐标估计值,P_mid等于上一时刻的状态估计的误差协方差矩阵加上过程噪声协方差矩阵。

        接下来,计算卡尔曼增益Kg,通过将卡尔曼增益应用于状态预测值和测量值之间的差异,得到校正后的最优估计值X_now。

        最后,更新X_last和P_last的值,并返回滤波后的坐标值X_now。

        值得注意的是,代码中只给出了对X坐标和Y坐标分别进行滤波的函数Kalman_X和Kalman_Y的实现,但是未给出使用这些函数的示例代码。在实际使用时,需要将输入的坐标值传递给相应的函数并获取滤波后的坐标值。

        Q:过程噪声协方差矩阵,它表示系统模型中存在的误差。通常情况下,Q的值应该越大,这意味着更充分地考虑了系统模型中的噪声。但是,如果Q设置过大,则卡尔曼滤波器可能会快速适应系统模型中的噪声,而无法正确地估计真实状态。因此,通常建议根据实际情况和试验结果来选择Q的大小。

        R:测量噪声协方差矩阵,它表示传感器或测量设备本身的精度。与Q类似,如果R设置过大,则会导致卡尔曼滤波器无法正确估计真实状态。建议根据实际情况选择适当的R值,在实验中进行调整。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值