卡尔曼滤波

风力发电机中的风速估计,转速估计甚至扭矩估计都设计到卡尔曼滤波,如果只是单一传感变量的平滑处理也能用到卡尔曼滤波。
振动信号中的滤波大多采用低通去除高频噪音,而卡尔曼滤波则是通过不确定度把置信度高的值滤出来。综合看了不少文献和资料,能把卡尔曼滤波讲清楚的最好的几篇分别是:
Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation
https://zhuanlan.zhihu.com/p/45238681
https://www.zhihu.com/question/23971601
https://zhuanlan.zhihu.com/p/64539108
http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/

本质上来说,工业上对对象的动态认知主要来自两方面,一方面是基于之前状态和动力学理论进行的的状态推导,另一中方法是直接通过传感器读取状态栏。遗憾的是不管是间接推导还是直接测量的结果都有一定的误差,分别来自推导的不确定度和传感器本身的不确定度。如何融合推导和直接测量得出最优估计就是卡尔曼滤波针对不确定信息的动态系统所做的事情,简单来说就是谁的结果可靠性高些就信的更多点,在推导结果的正太分布和传感器测量结果的正太分布求个并集,推导出新的正太分布,这个正太分布的平均值就是最优估计。

'Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation’这篇文章用几幅图比较生动的解释了这一点:

这是一个小车的运动状态示意图,有个传感器可以直接观测到小车的状态(距离S,速度V),同时也有运动学方程可以根据上一时刻小车的速度和距离预测一个当前小车的状态量,当然这两种方法都是有一定的误差,并且符合正太分布:

卡尔曼滤波是一种降噪手段,目的是减少预测的噪声和测量的噪声,得到最优估计,也就是下图中绿色的概率分布均值:

好了,下面贴上卡尔曼滤波典型的几个方程:

第一个方程

是状态预测公式,矩阵 Ft 为状态转移矩阵,表示如何从上一状态来推测当前时刻的状态;Bt为控制矩阵,表示控制量 ut如何作用于当前矩阵;xt 有顶帽子,表示只是估计值,并不是最优的:


状态预测公式只能告诉我们状态预测的均值,前面说过预测也是正太分布,因此还需要协方差矩阵P,假设前一时刻Pt-1已知,那么t时刻的协方差矩阵表示为:

上式中Q是一些无法确认的干扰噪音。

对于传感器的读数分布也是需要方程来进行表述:

Ht为观测矩阵,v为观测噪音,很多文章和博客写H矩阵是用于将传感器读取的数据尺度转换为我们关系的状态,但实际从英文原文中应该指的是将预测的值转换到传感器观测预的矩阵,这样才能在同一尺度上做两者的融合。从测量到的传感器数据中,我们大致能猜到系统当前处于什么状态。但是由于存在不确定性,某些状态可能比我们得到的读数更接近真实状态。我们将这种不确定性(例如:传感器噪声)用协方差Rt 表示,即上式中的v,该分布的均值就是我们读取到的传感器数据,称之为Zt。


K即为卡尔曼增益,主要作用为协调预测协方差矩阵和观测协方差矩阵,或者说为预测和观测分配权重。

利用卡尔曼增益进行状态量的更新,综合考虑预测和观测,得到:

最后我们还要对协方差矩阵Pt进行更新用作下一次迭代:

总结起来,卡尔曼滤波主要是以下5个公式:

前两个表示的是根据上一时刻的状态来预测当前时刻的状态,通过这两个公式我们得到的是非最佳估计的x和P;后三个公式就是通过当前的观测值来更新x和P,更新之后的就是最佳观测值。

直接点说,只要能写出P,Q,R,H和F矩阵的动态系统,都能用卡尔曼滤波解决动态状态估计问题。

下面是我用Python简单测试下风速仪测试的风速结果卡尔曼滤波估计的效果:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import math
import glob
import natsortplt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号file_path = 'D:/Works/ten_avg_val.csv'
df = pd.read_csv(file_path, index_col = False, engine = 'python').dropna()
df['时间'] = pd.to_datetime(df['时间'])
df = df.set_index('时间')n_iter = 10000
sz = (n_iter,) # size of array
# x = -3*np.sin(np.arange(n_iter)) # truth value (typo in example at top of p. 13 calls this z)
z = np.array(df['风速'][0:n_iter]) # observations (normal about x, sigma=0.1)plt.plot(z)
plt.show()Q = 1e-5 # process variance# allocate space for arrays
xhat=np.zeros(sz)      # a posteri estimate of x
P=np.zeros(sz)         # a posteri error estimate
xhatminus=np.zeros(sz) # a priori estimate of x
Pminus=np.zeros(sz)    # a priori error estimate
K=np.zeros(sz)         # gain or blending factorR = 0.1**2 # estimate of measurement variance, change to see effect# intial guesses
xhat[0] = 0.0
P[0] = 1.0for k in range(1,n_iter):# time updatexhatminus[k] = xhat[k-1]Pminus[k] = P[k-1]+Q# measurement updateK[k] = Pminus[k]/( Pminus[k]+R )xhat[k] = xhatminus[k]+K[k]*(z[k]-xhatminus[k])P[k] = (1-K[k])*Pminus[k]plt.figure()
plt.plot(z,'k-',label='noisy measurements')
plt.plot(xhat,'r-',label='a posteri estimate')
plt.legend()
plt.title('Estimate vs. iteration step', fontweight='bold')
plt.xlabel('Iteration')
plt.ylabel('temp')
plt.show()


如果将测量不确定度R改为接近于0,取R=0.001 ** 2,则卡尔曼滤波认为传感器测的非常真实,降噪结果也和观测结果很一致,如下图:

如果将测量不确定度R改为较大,取R=1 ** 2,则卡尔曼滤波认为传感器测的真实性降低,降噪结果则会更平滑,即离观测值较远,如下图:

通俗的解释卡尔曼滤波(Kalman Filter)以及其Python的实现相关推荐

  1. 一文图解卡尔曼滤波(Kalman Filter)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 译者注:这恐怕是全网有关卡尔曼滤波最简单易懂的解释,如果你认真的读 ...

  2. 图解卡尔曼滤波(Kalman Filter)

    背景 关于滤波 首先援引来自知乎大神的解释. "一位专业课的教授给我们上课的时候,曾谈到:filtering is weighting(滤波即加权).滤波的作用就是给不同的信号分量不同的权重 ...

  3. 卡尔曼滤波(kalman filter)超详细推导

    1. 概率论相关知识 这一节主要回忆概率论的一些相关基础知识,包括全概率公式.贝叶斯公式.协方差矩阵.多维高斯分布等等,对这些熟悉的可以直接跳到第2节看贝叶斯滤波 1.1 条件概率 P(x,y)=P( ...

  4. 卡尔曼滤波(Kalman filter)算法

    卡尔曼滤波思想 你可以在任何含有不确定信息的动态系统中使用卡尔曼滤波,对系统下一步的走向做出有根据的预测,即使伴随着各种干扰,卡尔曼滤波总是能指出真实发生的情况. 在连续变化的系统中使用卡尔曼滤波是非 ...

  5. matlab温度数据怎么滤波_卡尔曼滤波算法思想理解 Kalman filter 第一篇

    卡尔曼滤波算法思想理解 Kalman filter 第一篇 最近在初步的理解目标跟踪的领域, 其中一个非常经典的算法卡尔曼滤波Kalman filter是需要有很好的理解才行, 由于已经脱离了学校,懂 ...

  6. 卡尔曼滤波算法-Kalman Filter Algorithm

    1.简介 1.1 滤波是什么 所谓了滤波,就是从混合在一起的诸多信号中提取出所需要的信号. 1.2 信号的分类: (1)确定性信号:可以表示为确定的时间函数,可确定其在任何时刻的量值.(具有确定的频谱 ...

  7. 多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解

    多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解 1. 概览 在开始具体讨论卡尔曼滤波和匈牙利算法之前,首先我们来看一下基于检测的目标跟踪算法的大 ...

  8. Ensemble Kalman filter集合卡尔曼滤波

    在气象预测领域,很多时候,模型具有O(10e8)O(10e8)O(10e8)以上的量级,如果使用传统的卡尔曼滤波,协方差矩阵的更新将是一个~10e2210e2210e22量级的计算操作,因此传统的卡尔 ...

  9. Kalman Filter 通俗讲解

    引言 Kalman Filter,很多人刚听到这个名词时,总是会下意识认为这就是个滤波器.我这里想要重点声明的是,Kalman Filter不是滤波,它是一种信息融合的过程. 那么Kalman Fil ...

最新文章

  1. 还在用分页?你out了 !试试 MyBatis 流式查询,真心强大!
  2. ubuntu firefox播放不了视频的解决办法 安装chrome 解决
  3. 原创 | 《相机标定》深入理解原理与实战(一)
  4. ArcSDE建Table在ArcCatalog中不可见
  5. 用C#抓取AJAX页面的内容
  6. 工作两个月的感受随笔
  7. 处于停机等非正常状态_一文聊透 Dubbo 优雅停机
  8. 404、500、502等HTTP状态码介绍
  9. openGauss与PostgreSQL分区策略语法测试
  10. [转]Ionic系列——CodePen上的优秀Ionic_Demo
  11. 父工程的版本号决定上传私服仓库的位置
  12. [我总结]8月第二周总结
  13. 【CCCC】L3-009 长城 (30分),计算几何+凸包,极角排序
  14. 【linux】最常用 150 个Linux命令汇总
  15. 构建工具Bazel入门
  16. learn git 廖雪峰GIT教材1 创建与合并分支
  17. DllMain 参数解释
  18. 微信支付失败-1彻底扫坑
  19. python中判断生肖和星座哪个准_十二生肖PK十二星座,到底哪个更准?
  20. el-date-picker 实现禁止选择今日以后的日期,以及时间跨度不超过365天,和设置默认选择日期,解决选择当天无效问题

热门文章

  1. C语言笔试题(嵌入式软件开发)
  2. c语言编写邮箱注册登录的程序,c语言实现邮箱地址验证
  3. 孩子想养宠物,该不该同意?
  4. 大学课程能给我们带来什么?
  5. scilab和matlab的区别,Fortran, Matlab, Octave, Scilab计算速度比较
  6. 微信小程序使用 setInterval 制作计时器后台延迟问题
  7. 计算机班内排名公式,巧用Excel数组公式统计各班优秀人数EXCEL基本教程 -电脑资料...
  8. 学习通、优课联盟不让粘贴?那就让计算机帮你手打!
  9. 马蜂窝陈罡:用户、内容、商业化3C矩阵,是新一代旅游市场密码
  10. The global shader cache file'X:/XXXX/GlobalShaderCache-PCD3D_SM5.bin' is missing——UE4工程运行失败