Kalman Filter --卡尔曼滤波

简介

此处借鉴百度百科

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

数据滤波是去除噪声还原真实数据的一种数据处理技术,Kalman滤波在测量方差已知的情况下能够从一系列存在测量噪声的数据中,估计动态系统的状态。由于它便于计算机编程实现,并能够对现场采集的数据进行实时的更新和处理,Kalman滤波是目前应用最为广泛的滤波方法,在通信,导航,制导与控制等多领域得到了较好的应用。

实例解析

已知上个时刻飞机的位置,知道现在这个时刻收到的雷达测量的飞机的位置。用前面两个数据来估计此时飞机的位置。精简的说就是知道上个时刻状态,又知道测量数据,融合这两个数据来求当前状态。

因为雷达接受的数据与飞机实时位置数据有延时误差,所以即使收到测量数据但是还是不确飞机位置在哪。于是我得需要根据前一个时刻的位置估计出当前时刻的飞机位置 结合 测量数据 综合考虑来 估计当前飞机位置。这就是卡尔曼滤波的作用。

卡尔曼认为所有的状态变化(位置变化)都是线性的。什么叫做线性?即飞机作匀速直线运动。如若状态位置变化不是线性的如飞机做变速运动又该如何?其实此情况已被发明了新的算法:扩展卡尔曼滤波。这里我们只研究卡尔曼滤波。

滤波算法简介

滤波算法本质上就是利用多个数据来融合估计真实状态。

设有个飞机只会水平飞行。已知上个时刻t1t_1t1​飞机的位置x1x_1x1​和速度v1v_1v1​。雷达探测到t2t_2t2​时的位置x2∗x_2^*x2∗​。则有两种方法得到飞机位置:

1:飞机匀速运动(v2=v1v_2 = v_1v2​=v1​​),现在的位置:x1+v2(t2−t1)x_1 + v_2(t_2-t_1)x1​+v2​(t2​−t1​)。​

2:位置就是x2∗x_2^*x2∗​。

由于飞机速度可变,雷达测量不准,我们认为飞机在时刻t2t_2t2​​的位置为:
x2real=(x1+v2(t2−t1))+α[x2∗−(x1+v2(t2−t1))]x^{real}_2 =(x_1 + v_2(t_2-t_1)) + \alpha[x^*_2-(x_1 + v_2(t_2-t_1))] x2real​=(x1​+v2​(t2​−t1​))+α[x2∗​−(x1​+v2​(t2​−t1​))]
α\alphaα时雷达测量的置信度,若雷达不准将α 赋值很低如0.1.如果雷达很准那么就设置α 很接近1的值如0.9。你会发现α越接近0,那么所估计的位置越是接近认为飞机匀速走的那个思路。α越接近1那么所估计的位置越接近雷达测量值(等于认为飞机在时刻$ t_2$​的位置就是雷达测量值)。
————————————————
滤波算法就是为了确定α具体取值的计算方法。

在卡尔曼滤波中:α是用来调节根据上个位置估计出的当前位置值与测量值在最终结果中的占比用的。这个在卡尔曼滤波中叫做卡尔曼增益即KnK_{n}Kn​​。

KnK_nKn​​即是调节最终结果xrealx^{real}xreal​​​值靠近估计值和测量值中的哪一个。

现在我们得到了新的位置估计值,那么根据这个来估计下一个位置它的方差pn−1p_{n-1}pn−1​是多少呢?由于根据上个状态算出当前状态在最终结果的占比占了1−Kn1 -K_n1−Kn​。所以方差pn=(1−kn)pn−1p_{n}=(1-k_n)p_{n-1}pn​=(1−kn​)pn−1​

卡尔曼滤波最关键的是需要求出两种方差。一是纯粹依赖估计的这种方法的方差。二是测量仪器的方差。只要知道了这两个值那就可以知道估计值和测量值在最终结果中的占比。算方差的方法在不同应用场景是不同的需要以实际情况而定。

Python编程实践卡尔曼滤波


import numpy as np# 模拟数据
t = np.linspace(1, 100, 100)
a = 0.5
position = (a * t ** 2) / 2position_noise = position + np.random.normal(0, 120, size=(t.shape[0]))
import matplotlib.pyplot as pltplt.plot(t, position, label='truth position')
plt.plot(t, position_noise, label='only use measured position')# 初试的估计飞机的位置就直接用雷达测量的位置
predicts = [position_noise[0]]
position_predict = predicts[0]predict_var = 0
odo_var = 120 ** 2  # 这是我们自己设定的位置测量仪器的方差,越大则测量值占比越低
v_std = 50  # 测量仪器的方差
for i in range(1, t.shape[0]):dv = (position[i] - position[i - 1]) + np.random.normal(0, 50)  # 模拟从IMU读取出的速度position_predict = position_predict + dv  # 利用上个时刻的位置和速度预测当前位置predict_var += v_std ** 2  # 更新预测数据的方差# 下面是Kalman滤波position_predict = position_predict * odo_var / (predict_var + odo_var) + position_noise[i] * predict_var / (predict_var + odo_var)predict_var = (predict_var * odo_var) / (predict_var + odo_var) ** 2predicts.append(position_predict)plt.plot(t, predicts, label='kalman filtered position')plt.legend()
plt.show()

借鉴:若想深造请移步

Kalman Filter --卡尔曼滤波相关推荐

  1. Kalman Filter卡尔曼滤波 java实现

    我的理解 重点-理解1:卡尔曼滤波就是-测量值与预测值之间取最优结果-得到最优结果 重点-理解2:卡尔曼滤波就是-上一次最优结果预测当前的值,同时使用观测者修正当前值,得到最优结果 列子:再汽车行驶途 ...

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

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

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

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

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

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

  5. 【UWB】Kalman filter, KF卡尔曼滤波, EKF 扩展卡尔曼滤波

    文章目录 卡尔曼滤波器 扩展卡尔曼滤波器 协方差 Ref: 卡尔曼滤波器 首先从工程上看卡尔曼滤波算法. 引入一个离散控制过程的系统,该系统可用一个线性随机微分方程(linear stochastic ...

  6. 通俗的解释卡尔曼滤波(Kalman Filter)以及其Python的实现

    卡尔曼滤波 风力发电机中的风速估计,转速估计甚至扭矩估计都设计到卡尔曼滤波,如果只是单一传感变量的平滑处理也能用到卡尔曼滤波. 振动信号中的滤波大多采用低通去除高频噪音,而卡尔曼滤波则是通过不确定度把 ...

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

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

  8. 卡尔曼滤波(Kalman Filter)原理理解和测试

    Kalman Filter学原理学习 1. Kalman Filter 历史 Kalman滤波器的历史,最早要追溯到17世纪,Roger Cotes开始研究最小均方问题.但由于缺少实际案例的支撑(那个 ...

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

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

最新文章

  1. $0,$?,$!,$-,$*,$@,$#等的特殊用法
  2. 脑细胞膜等效神经网路简单分类实例
  3. java线程组 线程池_JAVA多线程(三)-----线程组、线程池和线程相关类
  4. python数组 swig_python中SWIG
  5. JAVA——实现json bean实体类的传参校验模板及注解详解
  6. ubuntu设置vim语法高亮显示和自动缩进
  7. 【论文写作】课程指导平台的开发中界面设计如何写
  8. 关于结合测试时,数据准备的一些注意点 (之开始篇:如何能更快,更好的准备测试数据)。
  9. 3.从Paxos到Zookeeper分布式一致性原理与实践---Paxos 工程实践
  10. Apalis Imx8qm记录
  11. 大连首闻grid二次开发增强文档
  12. python数据采集6-读取文档
  13. CENTOS上的网络安全工具(十二)走向Hadoop(4) Hadoop 集群搭建
  14. 如何编制试算平衡表_会计实务:试算平衡表的编制步骤
  15. 初识云计算和DevOps
  16. pull时出现错误及解决方法
  17. ai 计算机视觉_人工智能中的计算机视觉
  18. 从零开始学VUE之IDEA安装VUE插件
  19. SPSS简单介绍及入门
  20. mysql 除数为0显示100,保留两位小数,显示百分号的相关操作

热门文章

  1. Oracle获取一年中的所有日期和一个月中的所有日期
  2. 整理一下var和函数function的一些小知识点
  3. Socket超时时间设置
  4. python实现目录中制定内容查找
  5. [luogu3244 SHOI2016] 黑暗前的幻想乡(容斥原理+矩阵树定理)
  6. DAY102 - Rest Framework(七)- 手动编写配置文件、分页器和版本控制
  7. 怀念本科时代----科学入门的导师肖建华老师
  8. Linux中命令选项及参数简介
  9. String类的流程控制
  10. hdu_2476_String painter(区间DP)