以NASA之名: 卡尔曼滤波器

'That's one small step for man,one giant leap for mankind.' — Neil Alden Armstron

引言

二十世纪的阿波罗登月计划在人类历史上是浓墨重彩的一笔, 是人类科学发展极其重要的里程碑. 在此计划中, 阿姆斯特朗在月球上说出了上面的一句话,是对此计划最最恰当的注释. 说起来这个计划很''简单'': 送人到月球转一圈,然后再回来. 这么一个'简单'的计划实施起来得有多困难大家心中早有尺度.而卡尔曼滤波器(Kalman filter)就是其中的功臣.

荣耀骑士

卡尔曼滤波(器)是以其主要贡献者 Rudolf Emil Kalman 命名的. 这个滤波器做什么的呢?

现在,时间闪回到 1969年 七月, 当时 Armstrong 正坐在阿波罗11号中,飞向月球. 在此期间掌握飞船的位置及其速度是非常重要的.因为只要偏差超过一定阈值, 飞船的超高速就会将这偏差迅速放大,进而飞船就会偏离预定轨道,最终,极有可能飞向太空就再也回不来了.

那要如何得到飞船在某个时间点的位置与速度呢?

我们知道地面上的科学家在将阿波罗11号发射升空之前肯定会预先计算飞船每个点的位置,或者一定有一个计算精确的计算公式.但, 无论多么精确的公式都无法包含所有因素,不确定性是无法避免的. 而阿波罗上面肯定会有一套复杂的传感系统来测算飞船的位置与速度, 然而, 传感觉器必然地会有偏差. 也就是说我们会从两种不同的途径获得两套参数(位置与速度), 这两套参数一般是不同的,却又都是不准确的.

我们当然会想到:能不能综合地考虑这两套参数,从而获得一套靠谱的参数,来指导飞船航行? 那这两个参数如何综合考虑呢? 在此关键时刻,荣耀骑士 — 卡尔曼滤波器登场了.它的出现就是解决此等棘手问题的.

卡尔曼滤波器是如何工作的呢? 我们知道科学家的公式是不会错的,只不过外界因素干扰,才使其失准的.因此我们以其为基准,用传感器的参数来对基校准. 传感器的参数也有不确定性. 我们的目的是获得更精准的参数, 故需要在传感参数校正公式参数时,首要任务即是在当前所有信息面前最小化不确定性.这就是卡尔曼滤波器的作用. 至于它是如何最小化不确定性的,就要涉及公式了, 你确定要上吗? 如果是,请继续~

卡尔曼滤波器*

卡尔曼滤波(器)基于线性动态系统,是建立在线性模型上的带有白噪声的马氏链. 其与隐马尔可夫模型(HMM)很相像,最主要的不同点在其隐状态是连续的,而HMM是离散的.

模型:
\[
\left\{
\begin{array}\
x_{k} = A_kx_{k-1}+B_k u_k + w_k\\
y_k = C_k x_k + v_k
\end{array}
\right.
\]
其中所有变量均为矩阵(或向量), \(x_k\): k 时刻的状态向量; \(A_k\): 状态转移矩阵; \(B_k\): 控制矩阵,\(u_k\): 控制向量; 一般,将此控制部分当作确定部分而不包含在模型中,因此上式可简化为:
\[
\left\{
\begin{array}\
x_{k} = A_kx_{k-1} + w_k\\
y_k = C_k x_k + v_k
\end{array}
\right.
\]
\(y_k\) : k时刻的观测向量; \(C_k\) : 观测矩阵; \(w_k, v_k\)均为零均值白噪声,方差分别为 \(Q_k, R_k\), 其互不相关,并与初始状态亦不相关:
\[
w_k : E[w_k] = 0,\sigma_k^2 = Q_k;\\
v_k: E[v_k] = 0,\sigma_k^2 = R_k;\\
cov[x_0, w_k] = 0;\\
cov(x_0,v_k) = 0;\\
E[w_kv_k^T] = 0.\\
\]
卡尔曼滤波器即是利用递推方法及状态方程(式1或式2) 寻找最小均方误差状态变量 \(x_k\) 的估计值 \(\hat{x}_k\):
\[
\tilde{x}_k = x_k - \hat{x}_k\\
\min E[\tilde{x}_k\tilde{x}_k^T] \rightarrow \hat{x}_k
\]
当不考虑白噪声时:
\[
\hat{x}'_k = A_k \hat{x}_{k-1}\\
\hat{y}_k = C_k \hat{x}'_k = C_k A_k \hat{x}_{k-1}
\]
其中 \(\hat{x}'_k\) 为 k 时刻状态的估计值(由上一时刻状态经转移矩阵得到), \(\hat{y}_k\) 为测量值的估计值(由状态估计值推出), 而 \(\hat{x}_k\) 现在称为状态校正后的估计值.

观测向量的误差(也即新息):
\[
\tilde{y}_k = y_k - \hat{y}_k
\]
用观测值来校正状态变量:
\[
\begin{array}
\\
\hat{x}_k &=&A_k \hat{x}_{k-1} + H_k (y_k - \hat{y}_k)\\
&=&A_k \hat{x}_{k-1} + H_k (y_k - \ C_k A_k \hat{x}_{k-1})
\end{array}
\]
其中, \(H_k\)称为增益矩阵,即为一新息加权矩阵.

新息(Innovation)\(\tilde{y}_k\)即是在 k 时刻之前没有但在 t 时刻产生的新的新信息. 用代数的语言即是 新息与过去的信息是正交的:
\[
E[\tilde{y}_ky_j^T] = \boldsymbol{O}, \qquad 1\le j<k
\]
而且可以容易的推论出, 新息之间也是正交的:
\[
E[\tilde{y}_i\tilde{y}_j^T] =\boldsymbol{O},\qquad i\ne j, and\quad 1\le i,j\le k
\]
从而可知, 新息\(\tilde{y}_k\)是一个与k 之前时刻的数据不相关,且有白噪声性质的随机过程.

校正后的状态变量估计误差及其均方值 (\(P_k\)) 还有未经校正的状态变量估计误差的均方值 (\(P_k'\)):
\[
\begin{array}\\
\tilde{x}_k &=& x_k - \hat{x}_k\\
P_k &=& E[\tilde{x}_k\tilde{x}_k^T] = E[(x_k - \hat{x}_k)(x_k - \hat{x}_k)^T] \\
P_k' &=& E[(x_k - \hat{x}_k')(x_k - \hat{x}_k')^T]\\
\end{array}
\]
卡尔曼滤波器即是最小化 \(P_k\)(不确定性) 的方式来得到 \(H_k\) ,最终得到 \(\hat{x}_k\) :
\[
\min P_k \rightarrow H_k \rightarrow \hat{x}_k
\]

\[
\begin{array}\\
\tilde{x}_k &=& x_k - \hat{x}_k\\
&=& A_kx_{k-1} + w_k -(A_k \hat{x}_{k-1} + H_k (y_k - \ C_k A_k \hat{x}_{k-1}))\\
&=& A_kx_{k-1} + w_k\\
&&-(A_k \hat{x}_{k-1} + H_k (\ C_k (A_k x_{k-1}+w_k)+ v_k - \ C_k A_k \hat{x}_{k-1}))\\
&=& (A_k -H_kC_kA_k)(x_{k-1} - \hat{x}_{k-1}) + (I - H_kC_k)w_k - H_k v_k\\
\end{array}
\]

偷个懒吧, 接着就是'暴力'推导, 没有什么技术含量, 只看你有没有仔细,否则结果一定会出来.

经过几张\(A_4\) 纸的推导, 你可以得到以下几个重要公式:
\[
\left\{\begin{array}\\
\hat{x}_k &=& A_k \hat{x}_{k-1} + H_k(y_k - C_kA_k\hat{x}_{k-1})\\
H_k &=& P_k'C_k^T(C_kP'_kC_k^T+R_k)^{-1}\\
P_k' &=& A_kP_{k-1}A_k^T + Q_{k-1}\\
P_k &=& (I - H_kC_k)P_k'
\end{array}\right.
\]
这就是卡尔曼滤波器的递推公式了.

参考文献:

  1. 现代信号处理(第二版), 张贤达, 2002, 清华大学出版社.
  2. How a Kalman filter works, in pictures, 2015, bzarg.com.
  3. Kalman filter with Real-Time Applications, 2009,Springer.
  4. Understanding the Basis of the Kalman filter via a simple and intuitive derivation.

时间序列八: 以NASA之名: 卡尔曼滤波器的更多相关文章

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

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

  2. 对Kalman(卡尔曼)滤波器的理解@@zz

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

  3. opencv 卡尔曼滤波器例子,自己修改过

    一.卡尔曼滤波器的理论解释 http://blog.csdn.net/lindazhou2005/article/details/1534234(推荐) 二.代码中一些随机数设置函数,在opencv中 ...

  4. 卡尔曼滤波器 Kalman Filter (转载)

    在学习卡尔曼滤波器之前,首先看看为什么叫“卡尔曼”.跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他是个现代人! 卡 尔曼全名Rudolf Emil ...

  5. [转载]卡尔曼滤波器及其基于opencv的实现

    卡尔曼滤波器及其基于opencv的实现 源地址:http://hi.baidu.com/superkiki1989/item/029f65013a128cd91ff0461b 这个是维基百科中的链接, ...

  6. kalman filter卡尔曼滤波器- 数学推导和原理理解-----网上讲的比较好的kalman filter和整理、将预测值和观测值融和

    = 参考/转自: 1 ---https://blog.csdn.net/u010720661/article/details/63253509 2----http://www.bzarg.com/p/ ...

  7. 卡尔曼滤波器实例:跟踪自由落体运动:设计与Matlab实现

    [首发:cnblogs    作者:byeyear    Email:byeyear@hotmail.com] 本文所用实例来自于以下书籍: Fundamentals of Kalman Filter ...

  8. [Math]理解卡尔曼滤波器 (Understanding Kalman Filter) zz

    1. 卡尔曼滤波器介绍 卡尔曼滤波器的介绍, 见 Wiki 这篇文章主要是翻译了 Understanding the Basis of the Kalman Filter Via a Simple a ...

  9. [Math]理解卡尔曼滤波器 (Understanding Kalman Filter)

    1. 卡尔曼滤波器介绍 卡尔曼滤波器的介绍, 见 Wiki 这篇文章主要是翻译了 Understanding the Basis of the Kalman Filter Via a Simple a ...

随机推荐

  1. C#接口的作用详解

    .C#接口的作用 : C#接口是一个让很多初学C#者容易迷糊的东西,用起来好像很简单,定义接口,里面包含方法,但没有方法具体实现的代码,然后在继承该接口的类里面要实现接口的所有方法的代码,但没有真正认 ...

  2. ASP.NET —— Web Pages

    为简单起见,新建一个空的web工程,再新建一个MVC的视图(.cshtml),因为WP是单页面模型,所以以后就在这个页面中进行试验. Razor语法简介: 变量可用var或者其确切类型声明. 遍历fo ...

  3. ImgNoGoodWindow

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using UnityEditor; ...

  4. P2002 消息扩散

    其实这道题蛮水的 思路: 根据题意,他说有环,自然想到要用tarjan,后面就很简单了: 缩完点之后重新建图,开一个inin数组表示该点的入度是多少(psps:该点表示缩完点之后的大点): 最后统计一 ...

  5. 微信小程序 数据绑定方式

    与vue不同,在微信小程序中,js的数据和前端显示的数据是单数据流,也就是说,js里边的数据变了(通过setData),前端能立刻显示.但如果前端数据变了,js中的变量不能改变. 这个相比传统的前端已 ...

  6. 哈密顿绕行世界问题 HDU 2181

    题意让你先输20行数表示20个城市及所相邻的三个城市(行数就是该城市),然后给你一个数,从这个(给的数就表示城市)城市出发走遍所有城市一次回到出发的城市:看着复杂,仔细想想是个不算太难的深搜题,主要你 ...

  7. es6中的find filter 在数组中查找对象

    数组的方法find和filter var aa=[{id:1,name:'张三'},{id:2,name:'李四'},{id:3,name:'王五'},{id:2,name:'赵六'}] aa.fin ...

  8. Meta referrer标签的,可以防止CSRF的攻击

    Meta referrer标签的简要介绍 在某些情况下,出于一些原因,网站想要控制页面发送给 server 的 referer 信息的情况下,可以使用这一 referer metadata 参数. 参 ...

  9. image以最小边为标准填满正方形父级元素

    需求: 上传图片并实现预览, 图片以最小边为标准填满正方形的父级div,且不变形,且点击可以预览大图. 有两种实现方式: 1.div+img标签, 利用object-fit:cover,据说兼容性不好 ...

  10. 《剑指offer》第五十八题(左旋转字符串)

    // 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. // 请定义一个函数实现字符串左旋转操作的功能.比如输入字符串"abcde ...