1. 卡尔曼滤波器介绍

卡尔曼滤波器的介绍, 见 Wiki

这篇文章主要是翻译了 Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation

感谢原作者。

如果叙述有误,欢迎指正!


2. 基本模型

2.1 系统模型

卡尔曼滤波模型假设k时刻的真实状态是从(k − 1)时刻的状态演化而来,符合下式:

(1)

  • Fk 是作用在 Xk−1 上的状态变换模型(/矩阵/矢量)。
  • Bk 是作用在控制器向量uk上的输入-控制模型。
  • Wk 是过程噪声,并假定其符合均值为零,协方差矩阵为Qk的多元正态分布。

(2)

2.2 测量模型

时刻k,对真实状态 xk的一个测量zk满足下式:

(3)

其中Hk是观测模型,它把真实状态空间映射成观测空间,vk 是观测噪声,其均值为零,协方差矩阵为Rk,且服从正态分布。

(4)

初始状态以及每一时刻的噪声{x0, w1, ..., wk, v1 ... vk} 都认为是互相独立的.

卡尔曼滤波要做的是:

已知:

  1. 系统的初始状态 x0

  2. 每个时间的测量 Z

  3. 系统模型和测量模型

求解:

状态x随着时间变化而产生的值


3. 预测与更新

3.1 预测方程

预测是这样一个问题:

已知:

  1. 上一个状态的更新值
  2. 上一个状态的更新值和真实值之间的误差

求解:

  1. 这一个状态的预测值
  2. 这一个状态的预测值和真实值之间的误差

过程包括两个方面:

一、由上一个更新值 Xk-1|k-1 预测这一个预测值 Xk|k-1

二、由上一个更新值和真实值之间的误差 Pk-1|k-1 预测下一个预测值和真实值之间的误差 Pk|k-1

具体来说,就是以下两个方程。

(预测状态) (5)

(预测估计协方差矩阵) (6)

这里:

Xk-1|k-1 这种记法代表的是上一次的更新值,后面一个 k-1可以看做 Zk-1, 也就是上一次经过对比Zk-1(实际就是更新)之后所估计出的状态Xk-1。

Xk|k-1 这种记法代表这一次的预测值, 同理于刚才的介绍, 经过上一次Zk-1之后所估计出的状态Xk。

预测公式-预测状态
也就是公式(5), 可以直接由系统模型导出。

预测公式-协方差矩阵:

P代表着估计误差的协方差,代表着一种 confidence ,比如先验估计误差(预测值与真实值之间误差)的协方差


注:

方差有两种形式

协方差的定义:

如果说方差是用来衡量一个样本中,样本值的偏离程度的话。协方差就是用来衡量两个样本之间的相关性有多少,也就是一个样本的值的偏离程度,会对另外一个样本的值偏离产生多大的影响,协方差是可以用来计算相关系数的,相关系数P=Cov(a.b)/Sa*Sb,
Cov(a.b)是协方差, Sa Sb 分别是样本标准差。【可以参考另一篇博客《理解协方差》】

cov(x,y)
= E( (x-u)(y-v)' )
= E(xy' - xv' - uy' + uv')
= E(xy') - E(xv') - E(uy') + E(uv')
= E(xy') - uv' - uv' + uv'
= E(xy') - uv'


比较(5)和(1), 相减:

由于 状态估计误差 和 系统噪声 是不相关的

注:

如果随机变量 x和y是不相关的, 那么

Cov(x,y) = 0
=> E( (x-ex)(y-ey)' ) = 0
=> E(xy') - ex*ey' = 0

如果 ex 和ey为0 => E(x,y') = 0 就像上面的情况, 误差和噪声都服从正态分布,所以期望都是0 .

独立的充要条件:P(xy) = P(x)P(y)

3.2 更新方程

更新过程实际上就是一下问题:

已知:

  1. 由上一个更新值得到的当前的预测值。
  2. 当前的观测值
  3. 观测模型

求解:

  1. 融合了预测值和观测的更新值
  2. 由预测值的估计误差得到更新值的估计误差

更新方程如下:

其中K称为kalman增益, 就像一个补偿,决定着预测值应该变化多少幅度,才能变成更新值。

先看一个简单的例子,从这个例子中来推导出这三个方程。

3.3 简单的例子

3.3.1 举例

有一个直线轨道, 轨道上有一个火车,从火车站出发, 在t时刻,火车想要知道自己距离火车站的位置,可以有两个信息来源:

  1. 根据 t-1时刻的状态信息,以及一些控制信息来推断, 状态包括 t-1时刻的位置、速度等, 控制信息包括司机刹车、加速等等。
  2. 根据 t时刻的测量数据来推断, 这里假设车上有一个声波发射器,可以探测到发射到火车站需要多少时间,进而得到离车站的距离。

要想得到一个比较好的结果,显然不能只依靠某一种方法来推断,而 Kalman Filter的方法是:

  • 首先, 利用t-1时刻进行推断, 这一步叫预测

  • 然后, 利用t时刻的measurement 也可以推断, 使用这个推断对预测进行校正, 这一步叫更新

3.3.2 火车位置 - 预测

t=0的时候, 火车状态如 Figure.2 ,这时候, 火车的位置是比较准确的。

t=1的时候, 火车的预测状态如 Figure.3 可以看到, 位置的方差变大了。

火车的预测主要遵循 式(1),而预测的方差在不断变大,也就是说预测的准确度在下降, 这是由累积误差 w 导致的。

3.3.3 火车位置 - 测量

t=1 的时候,我们还有 measurement ,同样可以推断火车的位置,见下图中的蓝色的pdf

3.3.4 火车位置 - 更新

将两个pdf相乘,得到下图中的绿色pdf, 绿色pdf中较高的位置, 意味着预测和测量对这个位置都比较支持。

这里有一个高斯分布的一个重要性质就是,两个高斯分布的乘积还是高斯分布。

This is critical as it permits an endless number of Gaussian pdfs to be multiplied over time, but the resulting
function does not increase in complexity or number of terms; after each
time epoch the new pdf is fully represented by a Gaussian function. This
is the key to the elegant recursive properties of the Kalman filter。

3.3.5 推导更新方程

红色的pdf是预测的火车位置, 方程如下:

蓝色的pdf是测量的火车位置, 方程如下:

绿色的pdf二者融合的或者位置, 方程如下:

写成如下形式:

这里:


这两个式子,就是kalman滤波的更新方程

但是,这只是一个很特殊的例子,因为这里假设预测和测量都是采用同样的坐标系

更现实的情况是二者需要统一到一个 domain 中

比如上面所举的例子中:

预测的时候, 预测值是用米作为单位的。
但是当测量的时候, 测量得到的值是用声波经过的秒数作为单位的。

必须先要把两个量统一到同一个domain才能进行融合。

比如上式子中, y2 (measurement)实际是声波传递时间的一个正态分布,也就是说单位是秒。

一般做法是把
预测值 => 测量值

y1就变成:

y2不变:

这样两个坐标系都在 mesaurement domain 了。

两个pdf所在坐标系的横轴都是表示时间,而且以秒为单位了。

`
统一domain之后,更新方程就有了如下形式

3.3.5.1 期望更新方程:

H = 1/c

K = 代入,得到

这里的H就相当于观测方程中的H, K就是卡尔曼增益。

3.3.5.2 方差更新方程:

类似地, 融合之后的方差更新变成了

4. 总结

各个变量对应的情况如下:

最终的更新方程

5. 实现

Talk is cheap, show me the code.

%本例子从百度文库中得到, 稍加注释
clear
N=200;%取200个数 %% 生成噪声数据 计算噪声方差
w=randn(1,N); %产生一个1×N的行向量,第一个数为0,w为过程噪声(其和后边的v在卡尔曼理论里均为高斯白噪声)
w(1)=0;
Q=var(w); % R、Q分别为过程噪声和测量噪声的协方差(此方程的状态只有一维,方差与协方差相同) v=randn(1,N);%测量噪声
R=var(v); %% 计算真实状态
x_true(1)=0;%状态x_true初始值
A=1;%a为状态转移阵,此程序简单起见取1
for k=2:N
x_true(k)=A*x_true(k-1)+w(k-1); %系统状态方程,k时刻的状态等于k-1时刻状态乘以状态转移阵加噪声(此处忽略了系统的控制量)
end %% 由真实状态得到测量数据, 测量数据才是能被用来计算的数据, 其他都是不可见的
H=0.2;
z=H*x_true+v;%量测方差,c为量测矩阵,同a简化取为一个数 %% 开始 预测-更新过程 % x_predict: 预测过程得到的x
% x_update:更新过程得到的x
% P_predict:预测过程得到的P
% P_update:更新过程得到的P %初始化误差 和 初始位置
x_update(1)=x_true(1);%s(1)表示为初始最优化估计
P_update(1)=0;%初始最优化估计协方差 for t=2:N
%-----1. 预测-----
%-----1.1 预测状态-----
x_predict(t) = A*x_update(t-1); %没有控制变量
%-----1.2 预测误差协方差-----
P_predict(t)=A*P_update(t-1)*A'+Q;%p1为一步估计的协方差,此式从t-1时刻最优化估计s的协方差得到t-1时刻到t时刻一步估计的协方差 %-----2. 更新-----
%-----2.1 计算卡尔曼增益-----
K(t)=H*P_predict(t) / (H*P_predict(t)*H'+R);%b为卡尔曼增益,其意义表示为状态误差的协方差与量测误差的协方差之比(个人见解)
%-----2.2 更新状态-----
x_update(t)=x_predict(t) + K(t) * (z(t)-H*x_predict(t));%Y(t)-a*c*s(t-1)称之为新息,是观测值与一步估计得到的观测值之差,此式由上一时刻状态的最优化估计s(t-1)得到当前时刻的最优化估计s(t)
%-----2.3 更新误差协方差-----
P_update(t)=P_predict(t) - H*K(t)*P_predict(t);%此式由一步估计的协方差得到此时刻最优化估计的协方差
end %% plot
%作图,红色为卡尔曼滤波,绿色为量测,蓝色为状态
%kalman滤波的作用就是 由绿色的波形得到红色的波形, 使之尽量接近蓝色的真实状态。
t=1:N;
plot(t,x_update,'r',t,z,'g',t,x_true,'b');

6. Reference

Wiki-卡尔曼滤波器

Understanding the Basis of the Kalman Filter Via a Simple and Intuitive Derivation

Wiki-协方差矩阵

[Math]理解卡尔曼滤波器 (Understanding Kalman Filter) zz的更多相关文章

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

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

  2. 卡尔曼滤波器【Kalman Filter For Dummies】

    搬砖到此: A Quick Insight     As I mentioned earlier, it's nearly impossible to grasp the full meaning o ...

  3. 卡尔曼滤波(Kalman Filter)在目标边框预测中的应用

    1.卡尔曼滤波的导论 卡尔曼滤波器(Kalman Filter),是由匈牙利数学家Rudolf Emil Kalman发明,并以其名字命名.卡尔曼出生于1930年匈牙利首都布达佩斯.1953,1954 ...

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

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

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

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

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

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

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

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

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

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

  9. 卡尔曼滤波(Kalman Filter) ZZ

    一.引言 以下我们引用文献[1]中的一段话作为本文的開始: 想象你在黄昏时分看着一仅仅小鸟飞行穿过浓密的丛林.你仅仅能隐隐约约.断断续续地瞥见小鸟运动的闪现.你试图努力地猜測小鸟在哪里以及下一时刻它会 ...

随机推荐

  1. JAVA poi 帮助类

    pom.xml 添加引用: <!--poi--> <dependency> <groupId>org.apache.poi</groupId> < ...

  2. xenserver系列之安装与配置

    文章内容 1 ,安装 一.选择键盘类型:US. 二.这个是欢迎界面,选择“OK”即可. 三.这个是使用协议,我们必须得接受,否则就不能继续安装了! 四.这个是警告,告诉你XenServer所需要的硬件 ...

  3. HDU 5909 Tree Cutting 动态规划 快速沃尔什变换

    Tree Cutting 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5909 Description Byteasar has a tree T ...

  4. .NET开源了,Visual Studio开始支持 Android 和 iOS 编程并自带Android模拟器

    北京时间今天凌晨的大会上,多少程序员的假想成为现实..NET 开源,集成 Clang 和 LLVM 并且自带 Android 模拟器,这意味着 Visual Studio 这个当下最好没有之一的 ID ...

  5. xamarin 断点 不命中

    Async Debugging Breakpoints not being hit breakpoint in Android library project not hit when disable ...

  6. Delphi XE 6,Rad Studio XE 6 官方下载(附破解)

      官方光盘镜像下载: http://altd.embarcadero.com/download/radstudio/xe6/delphicbuilder_xe6_win.iso RAD Studio ...

  7. 【python】python安装步骤

    1.官网下载python 官网地址:https://www.python.org/getit/ 2.下载完成后点击安装 勾选Add python to PATH 是可以自己去配置环境变量的 注意:这里 ...

  8. ifeq endif

    ifeq ($(PLATFORM_VERSION),4.4)$(info "________________________4.4"); LOCAL_CFLAGS += -DPLU ...

  9. ibatis.net:第二天,Hello,World ?

    背景 本文的内容全部来自于官方的文档,此处仅仅为了强化记忆. 项目结构 Properties.config <?xml version="1.0" encoding=&quo ...

  10. 大并发下TCP内存消耗优化小记(86万并发业务正常服务)

    转自:http://blog.csdn.net/u010954257/article/details/54178160 最近在做一个大并发服务的测试(目前测到86万,当然有大量长连接,每天打的日志高到 ...