第一重:初见Kalman

假设我养了一只猪:


一周前,这只猪的体重是46±0.5kg。注意,在这里我用了±0.5,表示其实我对这只猪一周前的体重并不是那么确定的,也就是说,46kg这个体重有0.5kg的误差。现在,我又养了这只猪一个星期。那么我想要知道它一个星期之后多重,又大概有多少的误差?


为了得到一周后的体重,我有两种方法:一是根据我多年的养猪经验得到的猪体重公式推求出一个大概的值,另一个就是直接去称它的体重。当然,两种方法都有一定的误差。假设经验公式得到的体重是48kg,误差2kg;直接称体重得到的是49kg,误差1kg:


可是,我是一个处女座的人,不管是经验公式得到的值,还是直接称量得到的值,我都觉得不够准。我希望有一种方法,可以同时结合这只猪一周前的体重、用经验公式估计的值以及直接称量得到的值,综合考虑,得出一个最接近猪真实体重的,误差最小的值。这就是卡尔曼滤波要完成的任务。现在我们来把养猪的模型抽象成数学公式:


上图的左边,上一周的猪的体重,可以抽象为也k-1时刻的状态值,用k-1时刻的最优估计值加上一个误差项来表示,右边同理。其中,

Pk=E[ekeTk]Pk=E[ekekT]

这一项表示的是估计值的协方差。这里要说明两点:
1. 上图中所有的变量都是用粗体,表示这是一个向量或者一个矩阵;
2. 之所以用(列)向量而非一个数来表示状态值,是因为,虽然一只猪的体重可以用一个值来表示,但是在实际的应用中很多状态并不是一个数就能表示的(比如导弹在空间中的位置,同时有x、y、z三个坐标)。
图中右边表示k时刻的状态值,这个值可以通过预测模块(也就是根据经验公式估计猪的体重)和纠错模块(也就是直接去称量猪的体重值)来估计。同样,预测模块和纠错模块都有着对应的误差和误差协方差矩阵。卡尔曼滤波要做的,就是根据贝叶斯估计的相关理论,同时考虑预测模块和纠错模块的协方差,对误差小的项赋予较大的权重,对误差大的项赋予较小的权重,并使预测的误差最小。


具体的实现过程如下:


参考:
https://www.zhihu.com/question/23971601/answer/137325095

第二重:Kalman的数学原理

首先,我们先要引入一个离散控制过程的系统。该系统可用一个线性随机微分方程(Linear Stochastic Difference equation)来描述:


上两式子中,x(k)是k时刻的系统状态,u(k)是k时刻对系统的控制量。A和B是系统参数,对于多模型系统,他们为矩阵。y(k)是k时刻的测量值,H是测量系统的参数,对于多测量系统,H为矩阵。q(k)和r(k)分别表示过程和测量的噪声。他们被假设成高斯白噪声(White Gaussian Noise),他们的covariance分别是Q,R(这里我们假设他们不随系统状态变化而变化)。

对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声),卡尔曼滤波器是最优的信息处理器。下图给出KF算法的流程和五个核心更新方程如下:


五个更新方程为:


举个栗子:

假设我们要研究的对象是一个房间的温度。根据你的经验判断,这个房间的温度是恒定的。(这里的假设相当于状态方程的系数A为1)假设你对你的经验不是100%的相信,可能会有上下偏差几度,我们把这些偏差看成是高斯白噪声(这里就是W(k))。另外,我们在房间里放一个温度计,但是这个温度计也不准确的,测量值会比实际值偏差。我们也把这些偏差看成是高斯白噪声。(温度计的测量值就是Z(k),而由于温度测到的温度就是温度,不用再换算,所以系数H就是1,偏差就是V(k))。好了,现在对于某一分钟我们有两个有关于该房间的温度值:你根据经验的预测值(系统的预测值X(k|k-1))和温度计的值(测量值Z(k))。下面我们要用这两个值结合他们各自的噪声来估算出房间的实际温度值。

假如我们要估算k时刻的是实际温度值。首先你要根据k-1时刻的温度值,来预测k时刻的温度。因为你相信温度是恒定的,所以你会得到k时刻的温度预测值是跟k-1时刻一样的,假设是23度,同时该值的高斯噪声的偏差是5度(5是这样得到的:如果k-1时刻估算出的最优温度值的偏差(p(k-1|k-1)就是上一时刻的p(k|k))是3,你对自己预测的不确定度是4度,他们平方相加再开方,就是5(算出来的就是P(k|k-1)))。然后,你从温度计那里得到了k时刻的温度值(测量值Z(k)),假设是25度,同时该值的偏差是4度。由于我们用于估算k时刻的实际温度有两个温度值,分别是23 度和25度。究竟实际温度是多少呢?相信自己还是相信温度计呢?究竟相信谁多一点,我们可以用他们的covariance(协方差)来判断。因为 Kg^2=5^2/(5^2+4^2)所以Kg=0.78,我们可以估算出k时刻的实际温度值是:23+0.78*(25-23)=24.56度。可以看出,因为温度计的covariance比较小(比较相信温度计),所以估算出的最优温度值偏向温度计的值。

现在我们已经得到k时刻的最优温度值了,下一步就是要进入 k+1时刻,进行新的最优估算。到现在为止,好像还没看到什么自回归的东西出现。对了,在进入k+1时刻之前,我们还要算出k时刻那个最优值(24.56 度)的偏差。算法如下:((1-Kg)*5^2)^0.5=2.35。这里的5就是上面的k时刻你预测的那个23度温度值的偏差,得出的2.35就是进入 k+1时刻以后k时刻估算出的最优温度值的偏差。就是这样,卡尔曼滤波器就不断的把 covariance递归,从而估算出最优的温度值。他运行的很快,而且它只保留了上一时刻的covariance。上面的Kg,就是卡尔曼增益(Kalman Gain)。他可以随不同的时刻而改变他自己的值,是不是很神奇!


第三重:Kalman的数学推导

首先要计算预测值、预测值和真实值之间误差协方差矩阵:


有了这两个就能计算卡尔曼增益K,再然后得到估计值:


最后还要计算估计值和真实值之间的误差协方差矩阵,为下次递推做准备:


具体原理推导过程参考:

《图像处理、分析与机器视觉》第四版16.6.1 卡尔曼滤波器

卡尔曼滤波 – 从推导到应用(一)

运动目标跟踪算法综述

转载自:https://blog.csdn.net/u012554092/article/details/78290223?utm_source=blogxgwz3

Kalman Filter : 理解卡尔曼滤波的三重境界相关推荐

  1. 卡尔曼滤波器(Kalman Filter) 理解

    卡尔曼滤波器 1 简介(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫"卡尔曼".跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是 ...

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

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

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

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

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

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

  5. Quaternion kinematics for the error-state Kalman filter 资料整理

    Quaternion kinematics for ESKF-预测 Quaternion kinematics for ESKF-更新 文章翻译-基于误差状态卡尔曼滤波器的四元数运动学-前言 ESKF ...

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

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

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

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

  8. 从理论到实战-如何理解那个把嫦娥送上天的卡尔曼滤波算法Kalman filter?

    文章目录 直观理解 卡尔曼滤波怎么做的? 卡尔曼滤波Python代码实践 原文链接:https://zhuanlan.zhihu.com/p/77327349 直观理解 **首先卡尔曼滤波要解决的问题 ...

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

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

最新文章

  1. Python xlrd 读取excel表格 常用用法整理
  2. 中医药专家开年会 推荐11种最靠谱的抗癌食物
  3. CentOS7 常用命令集合
  4. 腾讯招.NET,居然要求精通MySQL,而不是SQLServer!
  5. uva 12545——Bits Equalizer
  6. JAVA进阶教学之(String类的常用方法)
  7. 动态路由接收前台传值
  8. 面向对象程序设计c 语言描述 答案,c面向对象程序设计习题解答全.doc
  9. x86保护模式 任务状态段和控制门
  10. animate支持的css属性
  11. Android 性能分析工具介绍
  12. NOIP2013普及组复赛 解题分析
  13. (已更新)婚礼类小程序前端界面模板源码
  14. Unity3d 周分享(22期 2019.8.30 )
  15. 同旭堂同湿散真实效果,七大真实效果让你彻底放心
  16. 通过Windows任务计划 ,定期恢复虚拟机快照
  17. 精确到秒!一位清华学霸的学习生活计划表,值得借鉴!
  18. html 绘制矩形,HTML5中使用canvas绘制矩形
  19. Omni扫块,和非原生归集
  20. LabVIEW的for循环事例

热门文章

  1. ThreadLocal原理机制
  2. Java 11新特性
  3. Mac OS修改VSCode Go的默认缩进格式
  4. React v16版本 源码解读
  5. google search console的使用
  6. vscode创建代码截图_如何在VSCode中创建代码配置文件
  7. 如何构建一个简单的语音识别应用程序
  8. Gradle配置国内源
  9. IDEA的Struts2项目报错java.lang.ClassNotFoundException
  10. Go语言学习之GOPATH