千家信息网

python怎么实现卡尔曼滤波数据处理

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要介绍"python怎么实现卡尔曼滤波数据处理"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"python怎么实现卡尔曼滤波数据处理"文章能帮助大家解
千家信息网最后更新 2024年11月11日python怎么实现卡尔曼滤波数据处理

这篇文章主要介绍"python怎么实现卡尔曼滤波数据处理"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"python怎么实现卡尔曼滤波数据处理"文章能帮助大家解决问题。

什么是卡尔曼滤波

先看看百度百科解释哈:卡尔曼滤波(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。

卡尔曼滤波的python代码实现

import numpy as npimport matplotlib.pyplot as plt# Q为这一轮的心里的预估误差Q = 0.00001# R为下一轮的测量误差R = 0.1# Accumulated_Error为上一轮的估计误差,具体呈现为所有误差的累计Accumulated_Error = 1# 初始旧值kalman_adc_old = 0SCOPE = 50def 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_adcarray = np.array([50]*200)s = np.random.normal(0, 5, 200)test_array = array + splt.plot(test_array)adc=[]for i in range(200):    adc.append(kalman(test_array[i]))plt.plot(adc)   plt.plot(array)   plt.show()

实验结果为:

关于"python怎么实现卡尔曼滤波数据处理"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0