卡尔曼滤波及其作用是什么,python代码如何实现
Admin 2022-09-15 群英技术资讯 327 次浏览
好久没用过arduino了,接下去要用arduino和超声波做个小实验,对于读取的模拟量肯定要进行滤波呀,不然这模拟量咋咋呼呼的怎么用
先看看百度百科解释哈:卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。
重要的事说三遍:
还不如不看!
还不如不看!!
还不如不看!!!
其实大家并不需要把卡尔曼滤波当作一种很复杂的东西,用通俗的话来讲,卡尔曼滤波算法只是一种 滤波算法,它的功能就是 滤波,滤波的作用就是减少噪声与干扰对数据测量的影响。
接下来我会用一句话概括卡尔曼滤波的操作过程:
卡尔曼滤波是一种通过 历史数据、历史积累误差、当前测量数据与当前误差 联合计算出的当前被测量的最优预测值。
首先大家要先理解什么是当前被测量的最优预测值:
里面有两个重要的概念,分别是 最优 和 预测值 :
这意味着:
1、卡尔曼滤波的结果不是确确实实被测量出来的,而是利用公式计算出来的预测结果(并不是说预测结果就不好,测量还存在误差呢!);
2、最优是因为卡尔曼滤波考虑的非常多,它结合了四个参数对当前的被测量进行预测,所以效果比较好。
接下里大家要理解 历史数据、历史积累误差、当前测量数据与当前误差 的概念。
我会通过实例给大家讲讲这四个东西的概念。
假设我们现在在用超声波测距离!现在是t时间,我们需要用t-1时间的距离来估计t时间的距离。
设在t-1时刻,超声波的被测量的最优预测值为50cm,而到t-1时刻的积累误差3cm,你自己对预测的不确定误差为4cm,那么在t-1时刻,其总误差为(32+42)1/2=5cm。
在t时刻,超声波测得的实际值53cm,测量误差为2cm,那我们要怎么去相信上一时刻的预测值和这一时刻的实际值呢?因为二者都不是准的,我们可以利用误差来计算。
因此,我们结合 历史数据、历史积累误差、当前测量数据与当前误差 来计算:
所以当前的最优预测值为52.59。
import numpy as np import matplotlib.pyplot as plt # Q为这一轮的心里的预估误差 Q = 0.00001 # R为下一轮的测量误差 R = 0.1 # Accumulated_Error为上一轮的估计误差,具体呈现为所有误差的累计 Accumulated_Error = 1 # 初始旧值 kalman_adc_old = 0 SCOPE = 50 def kalman(ADC_Value): global kalman_adc_old global Accumulated_Error # 新的值相比旧的值差太大时进行跟踪 if (abs(ADC_Value-kalman_adc_old)/SCOPE > 0.25): Old_Input = ADC_Value*0.382 + kalman_adc_old*0.618 else: Old_Input = kalman_adc_old # 上一轮的 总误差=累计误差^2+预估误差^2 Old_Error_All = (Accumulated_Error**2 + Q**2)**(1/2) # R为这一轮的预估误差 # H为利用均方差计算出来的双方的相信度 H = Old_Error_All**2/(Old_Error_All**2 + R**2) # 旧值 + 1.00001/(1.00001+0.1) * (新值-旧值) kalman_adc = Old_Input + H * (ADC_Value - Old_Input) # 计算新的累计误差 Accumulated_Error = ((1 - H)*Old_Error_All**2)**(1/2) # 新值变为旧值 kalman_adc_old = kalman_adc return kalman_adc array = np.array([50]*200) s = np.random.normal(0, 5, 200) test_array = array + s plt.plot(test_array) adc=[] for i in range(200): adc.append(kalman(test_array[i])) plt.plot(adc) plt.plot(array) plt.show()
实验结果为:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
cookie:在网站中,http请求是无状态的。也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户
本文主要介绍了numpy array找出符合条件的数并赋值的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
做开发的时候,我们经常会使用到进度条,因此这篇文章想给大家分享关于python进度条控件的使用。主要介绍tkinter进度条控件Progressbar的内容,感兴趣的朋友可以参考学习。
这篇文章介绍了Python中的re正则表达式模块,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间、描述信息以及错误或者异常发生时候的特定上下文信息。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008