数据处理小技巧1——卡尔曼滤波的通俗理解及其python代码实现

数据处理小技巧1——卡尔曼滤波的通俗理解及其python代码实现

学习前言

好久没用过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。

卡尔曼滤波的python代码实现

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()

实验结果为:
在这里插入图片描述

卡尔曼滤波是一种滤波算法,它的作用是减少噪声和干扰对数据测量的影响,特别适用于需要对模拟量进行滤波的情况。对于使用Arduino和超声波传感器的小实验,你可以使用卡尔曼滤波来对读取的模拟量进行滤波,以减少噪声和干扰的影响。 卡尔曼滤波的原理相对复杂,但是通俗来讲,它通过结合先验信息和测量值,来估计真实的状态值,并且不断地进行更新和校正,从而得到更准确的估计值。在Arduino中,你可以使用相应的库和代码实现卡尔曼滤波算法来处理超声波传感器的数据,使得读取的模拟量更加稳定和可靠。 首先,你需要导入相应的卡尔曼滤波库,并定义一个卡尔曼滤波对象。然后,在每次读取超声波传感器的模拟量时,将其作为测量值输入到卡尔曼滤波器中,并通过调用相应的滤波函数来获取滤波后的结果。这样,你就可以得到经过卡尔曼滤波处理的模拟量数据,从而减少噪声和干扰的影响。 卡尔曼滤波的具体实现和参数调节可能需要一定的理论基础和实践经验,因此建议你在使用卡尔曼滤波算法之前,先学习相关的理论知识,并参考相应的教程和示例代码来进行实践。 通过合适的参数调节和优化,你可以得到更好的滤波效果,使得超声波传感器的读取结果更加准确和可靠。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [数据处理技巧1——卡尔曼滤波通俗理解及其python代码实现](https://blog.csdn.net/weixin_44791964/article/details/103094059)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bubbliiiing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值