卡尔曼滤波数据处理技巧通俗理解及python实现_第1页
卡尔曼滤波数据处理技巧通俗理解及python实现_第2页
卡尔曼滤波数据处理技巧通俗理解及python实现_第3页
卡尔曼滤波数据处理技巧通俗理解及python实现_第4页
卡尔曼滤波数据处理技巧通俗理解及python实现_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第卡尔曼滤波数据处理技巧通俗理解及python实现目录学习前言什么是卡尔曼滤波卡尔曼滤波是怎么滤波的卡尔曼滤波实例卡尔曼滤波的python代码实现

学习前言

好久没用过arduino了,接下去要用arduino和超声波做个小实验,对于读取的模拟量肯定要进行滤波呀,不然这模拟量咋咋呼呼的怎么用

什么是卡尔曼滤波

先看看百度百科解释哈:卡尔曼滤波(Kalmanfiltering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包括系统中的噪声和干扰的影响,所以最优估计也可看作是滤波过程。

重要的事说三遍:

还不如不看!

还不如不看!!

还不如不看!!!

其实大家并不需要把卡尔曼滤波当作一种很复杂的东西,用通俗的话来讲,卡尔曼滤波算法只是一种滤波算法,它的功能就是滤波,滤波的作用就是减少噪声与干扰对数据测量的影响。

卡尔曼滤波是怎么滤波的

接下来我会用一句话概括卡尔曼滤波的操作过程:

卡尔曼滤波是一种通过历史数据、历史积累误差、当前测量数据与当前误差联合计算出的当前被测量的最优预测值。

首先大家要先理解什么是当前被测量的最优预测值:

里面有两个重要的概念,分别是最优和预测值:

这意味着:

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。

卡尔曼滤波的python代码实现

importnumpyasnp

importmatplotlib.pyplotasplt

#Q为这一轮的心里的预估误差

Q=0.00001

#R为下一轮的测量误差

R=0.1

#Accumulated_Error为上一轮的估计误差,具体呈现为所有误差的累计

Accumulated_Error=1

#初始旧值

kalman_adc_old=0

SCOPE=50

defkalman(ADC_Value):

globalkalman_adc_old

globalAccumulated_Error

#新的值相比旧的值差太大时进行跟踪

if(abs(ADC_Value-kalman_adc_old)/SCOPE0.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

returnkalman_adc

array=np.array([50]*200)

s=np.random.normal(0,5,200)

test_array=array+s

plt.plot(test_array)

adc=[]

foriinrange(200):

adc.append(kalman(test_array[i]))

plt.plot(adc)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论