卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用文章目录卡尔曼滤波一、滤波效果展示二、简介三、组成1.预测状态方程(1)目的:(2)方程:(3)备注2.预测协方差方程(1)目的(2)方程(3)备注3.卡尔曼增益方程(1)目的(2)方程(3)备注4.跟新最优值方程(卡尔曼滤波的输出)(1)目的(2)方程(3)备注5.更新协方差方程(1)目的(2)方程(3)备注四、C程序代码实现1.参数列表2.代码实现(一维数据滤波)五、发送波形到…

大家好,又见面了,我是你们的朋友全栈君。

卡尔曼滤波

一、滤波效果展示

  蓝色的波形是实际测得的数据,红色的波形是经 Kalman 滤波后的数据波形。
注:这里是实际应用激光测距传感器(TOF)vl53l0x 测得的距离数据。
卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

二、简介

  采用递归的方法解决线性滤波问题,只需要当前的测量值和前一个采样周期的估计值就能进行状态估计,需要的存储空间小,每一步的计算量小。

三、组成

1. 预测状态方程

(1)目的:

  由 系统状态变量k-1时刻的最优值系统输入 计算出k时刻的 系统预测值

(2)方程:

卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

(3)备注

  ①. X k-1|k-1 为k-1时刻的输出。
  ②. 当X为一维数据时,Fk的值是1。
  ③. 一维数据下(uk=0时):系统预测值 = 系统状态变量k-1时刻的最优值。

2. 预测协方差方程

(1)目的

  根据 k-1时刻的系统协方差 预测 k时刻系统协方差

(2)方程

卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

(3)备注

  ①. 当X为一维数据时,Fk的值是1。

3. 卡尔曼增益方程

(1)目的

  根据(k时刻) 协方差矩阵的预测值 计算 卡尔曼增益

(2)方程

卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

(3)备注

  ①. 当 Pk|k-1 为一个一维矩阵时,Hk 是1。

4. 跟新最优值方程(卡尔曼滤波的输出)

(1)目的

  根据 状态变量的预测值系统测量值 计算出 k时刻状态变量的最优值

(2)方程

卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

(3)备注

  ①. 当 Pk|k-1 为一个一维矩阵时,Hk 是1。

5. 更新协方差方程

(1)目的

  为了求 k时刻的协方差矩阵。(为得到k+1时刻的卡尔曼输出值做准备)

(2)方程

卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

(3)备注

  ①. 当 Pk|k-1 为一个一维矩阵时,Hk 是1。

四、C 程序代码实现

1. 参数列表

卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

2. 代码实现(一维数据滤波)

  实际参数是参照别人已经选好的参数,不过也可以自己改变参数,去观察波形的效果,体会每个参数对于滤波效果的影响,这里不详细介绍

//1. 结构体类型定义
typedef struct 
{ 
   
    float LastP;//上次估算协方差 初始化值为0.02
    float Now_P;//当前估算协方差 初始化值为0
    float out;//卡尔曼滤波器输出 初始化值为0
    float Kg;//卡尔曼增益 初始化值为0
    float Q;//过程噪声协方差 初始化值为0.001
    float R;//观测噪声协方差 初始化值为0.543
}KFP;//Kalman Filter parameter

//2. 以高度为例 定义卡尔曼结构体并初始化参数
KFP KFP_height={ 
   0.02,0,0,0,0.001,0.543};

/** *卡尔曼滤波器 *@param KFP *kfp 卡尔曼结构体参数 * float input 需要滤波的参数的测量值(即传感器的采集值) *@return 滤波后的参数(最优值) */
 float kalmanFilter(KFP *kfp,float input)
 { 
   
     //预测协方差方程:k时刻系统估算协方差 = k-1时刻的系统协方差 + 过程噪声协方差
     kfp->Now_P = kfp->LastP + kfp->Q;
     //卡尔曼增益方程:卡尔曼增益 = k时刻系统估算协方差 / (k时刻系统估算协方差 + 观测噪声协方差)
     kfp->Kg = kfp->Now_P / (kfp->NOw_P + kfp->R);
     //更新最优值方程:k时刻状态变量的最优值 = 状态变量的预测值 + 卡尔曼增益 * (测量值 - 状态变量的预测值)
     kfp->out = kfp->out + kfp->Kg * (input -kfp->out);//因为这一次的预测值就是上一次的输出值
     //更新协方差方程: 本次的系统协方差付给 kfp->LastP 威下一次运算准备。
     kfp->LastP = (1-kfp->Kg) * kfp->Now_P;
     return kfp->out;
 }

/** *调用卡尔曼滤波器 实践 */
int height;
int kalman_height=0;
kalman_height = kalmanFilter(&KFP_height,(float)height);

五、发送波形到上位机显示

  这里使用的是匿名的上位机 V65 版本,具体如何使用可以参考茶大的博客,并且茶大博客里面有上位机的下载地址。茶大博客地址:https://blog.csdn.net/wangjt1988/article/details/83684188
  
  
注:文章方程截图及参数来源于中科浩电。
  
  
Author : Beyonderwei
Email : Beyonderwei@163.com
Website : http://beyonderwei.com
WeChat:
微信公众平台

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/131023.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 交换变量的三种方法及简单分析

    交换变量的三种方法及简单分析

    2021年12月9日
    57
  • Dreamweaver 2019安装教程

    Dreamweaver 2019安装教程安装前先关闭杀毒软件和360卫士,注意安装路径不能有中文,安装包路径也不要有中文。1.选中【DreamweaverCC2019】压缩包,鼠标右击选择【解压到DreamweaverCC2019】。2.双击打开【DreamweaverCC2019】文件夹。3.选中【Set-up.exe】可执行文件,鼠标右击选择【以管理员身份运行】。4.点击文件夹小图标,然后选择【更改位置】。5.建议安装到除C盘以外的磁盘,可以在D盘或其他盘新建一个【DwCC2…

    2022年5月20日
    33
  • 神经网络优化(初始化权重)

    神经网络优化(初始化权重)使隐藏层饱和了,跟之前我们说的输出层饱和问题相似,对于输出层,我们用改进的cost函数,比如cross-entropy,但是对于隐藏层,我们无法通过cost函数来改进更好的方法来初始化权重?因为传统的初始化权重问题是用标准正态分布(均值为0,方差为1)随机初始化的,这其实是存在不合理的部分。标准正态分布:可以看出真实数据的

    2022年9月27日
    0
  • ubuntu12.04 安装 opencv 2.4.8(非源代码编译)

    ubuntu12.04 安装 opencv 2.4.8(非源代码编译)

    2022年1月24日
    34
  • latex缩进与对齐_latex 换行后缩进「建议收藏」

    latex缩进与对齐_latex 换行后缩进「建议收藏」且每个条目输入完毕之后不需要做任何的强迫换行记号,如:\\\\(换行符)或者\\par(分段符)Latex可以自动处理四重enumerate嵌套,编号规则为第一级自然数,第二级……那么,如何让空格在本行行尾自动换行?有两种方法可以实现:方法一:选中文字,然后点击格式——段落——缩进和间距,在常规栏中,选择对齐方式为“左对齐”……且每个条目输入完毕之后不需要…

    2022年5月15日
    353
  • matlab怎么定义矩阵变量_MATLAB01:基本的数学运算与矩阵运算

    若微信排版有问题,请点击阅读原文查看MATLAB01:基本的数学运算与矩阵运算MATLAB基本语法变量变量名保留变量不适合做变量名变量不应当覆盖内置函数变量类型数字型变量的显示格式MATLAB命令行使用MATLAB进行数字运算使用MATLAB计算数学表达式MATLAB内置的数学函数使用MATLAB进行矩阵运算定义矩阵向终端输入矩阵使用冒号运算符创建向量定义特殊矩阵矩阵的索引矩阵的操作操作…

    2022年4月6日
    96

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号