首页 > 其他分享 >卡尔曼滤波通俗易懂理解和代码实现

卡尔曼滤波通俗易懂理解和代码实现

时间:2023-02-01 21:39:21浏览次数:49  
标签:kg lastTimePredCovVal kalman 卡尔曼滤波 float 估计值 通俗易懂 协方差 代码


卡尔曼滤波算法应用—滤波单片机采集的温度


易懂。


公式

卡尔曼滤波通俗易懂理解和代码实现_温度传感器


卡尔曼滤波通俗易懂理解和代码实现_卡尔曼滤波_02

看公式1,ECR是估计变化比,也就是一个系统参数,需要我们根据实际情况调的。因为我们只有一个温度传感器,假如是测室温,那么我们认为短时间内室温是恒定的,所以这个变化比就等一。

将上面的公式转为汉字可以理解为:

公式1:

本次估计值 = 估计变化比 * 上次估计值 + 卡尔曼增益 * (测量值 - 上次估计值)

公式2:

卡尔曼增益 = 根号下(当前估计协方差的平方 / (当前估计协方差的平方 + 当前测量测方差的平方))

公式3:

下次估计协方差 = [根号下(1 - 卡尔曼增益)] * 当前估计协方差

公式4:

下次测量协方差 = [根号下(1 - 卡尔曼增益)] * 当前测量协方差




算法步骤:

1、初始化:

上次估计值 = 0
当前估计协方差 = 0.1 (任意不为0的值)
当前测量协方差 = 0.2 (任意不为0初值)

2、计算

1、获得测量值(也就是温度传感器测到的温度)
2、计算卡尔曼增益(公式二)
3、计算当前估计值,并将当前估计值赋值给上次估计变量,用于下次使用
4、利用公式三和四,计算下次估计协方差和下次测量协方差
5、更新协方差: 下次估计协方差 = 当前估计协方差,下次测量协方差 = 当前估计协方差
6、返回本次估计值,也就是返回本次滤波之后的温度

Python代码

from matplotlib import pyplot
import math
import random

lastTimePredVal = 0 # 上次估计值
lastTimePredCovVal = 0.1 # 上次估计协方差
lastTimeRealCovVal = 0.1 # 上次实际协方差
kg = 0.0

# val: 本次测量值
def kalman(val):

global lastTimePredVal # 上次估计值
global lastTimePredCovVal # 上次估计协方差
global lastTimeRealCovVal # 上次实际协方差
global kg

currRealVal = val # 本次实际值
currPredCovVal = lastTimePredCovVal # 本次估计协方差值
currRealCovVal = lastTimeRealCovVal # 本次实际协方差值

# 计算本次估计值,并更新保留上次预测值的变量
currPredVal = lastTimePredVal + kg * (currRealVal - lastTimePredVal)
lastTimePredVal = currPredVal

#计算卡尔曼增益
kg = math.sqrt(math.pow(lastTimePredCovVal, 2) / (math.pow(lastTimePredCovVal, 2) + math.pow(lastTimeRealCovVal, 2)))

# 计算下次估计和实际协方差
lastTimePredCovVal = math.sqrt(1.0 - kg) * currPredCovVal
lastTimeRealCovVal = math.sqrt(1.0 - kg) * currRealCovVal

# 返回本次的估计值,也就是滤波输出值
return currPredVal


if __name__ == "__main__":
realTemp = [] # 真实温度
predTemp = [] # 预测温度

# 生成50个真实温度,20度到23度之间
for i in range(50):
realTemp.append(random.uniform(20, 23))

# 卡尔曼滤波
for t in realTemp:
predVal = kalman(t)
predTemp.append(predVal)

# 绘制真实温度和预测温度折线图
pyplot.figure()
pyplot.plot(predTemp, label='predict_temp')
pyplot.plot(realTemp, label='real_temp')
pyplot.tick_params(axis='x', which='major', labelsize=int(len(predTemp)/10))
pyplot.xlabel('Count')
pyplot.ylabel('Temperature')
pyplot.show()

红线代表实际测量的温度,蓝线代表滤波的温度。

卡尔曼滤波通俗易懂理解和代码实现_协方差_03

C代码

typedef struct
{
float lastTimePredVal; // 上次估计值
float lastTimePredCovVal; // 上次估计协方差
float lastTimeRealCovVal; // 上次实际协方差
float kg;
}kalman_typedef;

void kalman_init(kalman_typedef* kalman)
{
kalman->lastTimePredVal = 0;
kalman->lastTimePredCovVal = 0.1;
kalman->lastTimeRealCovVal = 0.1;
kalman->kg = 0;
}

// val: 本次测量值
float kalman_calc(kalman_typedef* kalman, float val)
{
float currPredVal = 0; // 本次估计值
float currRealVal = val; // 本次实际值
float currPredCovVal = kalman->lastTimePredCovVal; // 本次估计协方差值
float currRealCovVal = kalman->lastTimeRealCovVal; // 本次实际协方差值

// 计算本次估计值,并更新保留上次预测值的变量
currPredVal = kalman->lastTimePredVal + kalman->kg * (currRealVal - kalman->lastTimePredVal);
kalman->lastTimePredVal = currPredVal;

//计算卡尔曼增益
kalman->kg = sqrt(pow(kalman->lastTimePredCovVal, 2) / (pow(kalman->lastTimePredCovVal, 2) + pow(kalman->lastTimeRealCovVal, 2)));

// 计算下次估计和实际协方差
kalman->lastTimePredCovVal = sqrt(1.0 - kalman->kg) * currPredCovVal;
kalman->lastTimeRealCovVal = sqrt(1.0 - kalman->kg) * currRealCovVal;

// 返回本次的估计值,也就是滤波输出值
return currPredVal;
}

ends…


标签:kg,lastTimePredCovVal,kalman,卡尔曼滤波,float,估计值,通俗易懂,协方差,代码
From: https://blog.51cto.com/u_15950551/6031851

相关文章

  • 基于KubeSphere在K8S发布微服务ruoyi----7.可视化Pipeline:1拉取代码
      选择JenkinsAgenthttps://kubesphere.com.cn/docs/v3.3/devops-user-guide/how-to-use/pipelines/choose-jenkins-agent/  创建DevOps项目demo-devops,并......
  • github与jenkins相结合实现push代码后自动部署
    首先在settings里面设置  jenkins-token记得设置勾选  至此github设置完成jenkins  credentials:选择私钥复制进去,github上放置公钥  将之前的gith......
  • VSCode 自定义代码片段
    Ctrl+Shift+P输入“代码片段:配置用户代码片段”:搜索你想要设置的语言代码片段,比如,我设置.vue文件的代码片段,选择vue.json:可以配置多个代码片段,一个片段通过一个pr......
  • 代码随想录算法训练营day1
    代码随想录打卡day1今日学习内容(2月1日)阅读数组的基本理论学习二分查找并完成题目学习移除元素并完成题目总结学习到了二分法的两种情况(左闭右闭,左闭右开)......
  • 再探前端低代码的“野路子”
    之前码过很多低代码的文章,发现大家口中的低代码挺不一样的,这次心血来潮想探探低代码的野路子。只需要拖拽操作或者几行基础代码,就能完成以往需要程序员才能搭建的各类应......
  • 硬件IIC主从机中断代码注释解析
    目录硬件IIC的主从中断在582的最新EVT中已支持。例程中已封装好中断处理过程,用户调用app_i2c时,初始化中需要配置回调函数即可。若需要串口打印日志,可以在工程预编译中增......
  • 代码规范配置editorconfig
    root=true[*]#表示所有文件适用charset=utf-8#设置文件字符集为utf-8indent_style=space#缩进风格indent_size=2#缩进大小end_of_line=lf#控制......
  • 【Frida】调试js代码
    方法一attach启动js代码动态注入app,app需要保持运行状态#coding:utf-8importsysimportfridaapp_name="猿人学APP"#app的名字js_file_path="./demo.js"#......
  • SimpleAdmin手摸手教学之:代码生成
    一、说明大部分项目里,其实有很多代码是重复的,几乎每个模块都有CRUD增删改查的功能,而这些功能的实现代码往往是大同小异的。如果这些功能都要自己去手写,非常无聊枯燥,浪费......
  • 图解华为云代码检查服务CodeArts Check
    华为云代码检查服务CodeArtsCheck为用户提供代码风格、通用质量与代码安全风险等检查能力,并提供问题闭环处理、检查报告等功能,可一站式完成代码检查作业。六大特性守护软件......