码迷,mamicode.com
首页 > 其他好文 > 详细

卡尔曼滤波器

时间:2014-12-28 12:54:52      阅读:204      评论:0      收藏:0      [点我收藏+]

标签:


 

目录

1.卡尔曼滤波简介

2.基本模型

  2.1系统模型

  2.2观测模型

3.预测与更新

  3.1预测方程

  3.2更新方程

4.matlab实现


2、基本模型

卡尔曼滤波要做的是:

已知:

  1. 系统的初始状态 x0

  2. 每个时间的测量 Z

  3. 系统模型和测量模型

求解:

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

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} 都认为是互相独立的.

 


 

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 ,比如先验估计误差(预测值与真实值之间误差)的协方差

技术分享

 

3.2、更新方程

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

已知:

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

求解:

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

更新方程如下:

技术分享

技术分享

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


 

4、matlab实现

 1 %本例子从百度文库中得到, 稍加注释
 2 clear
 3 N=200;%取200个数
 4 
 5 %% 生成噪声数据 计算噪声方差
 6 w=randn(1,N); %产生一个1×N的行向量,第一个数为0,w为过程噪声(其和后边的v在卡尔曼理论里均为高斯白噪声)
 7 w(1)=0;
 8 Q=var(w); % R、Q分别为过程噪声和测量噪声的协方差(此方程的状态只有一维,方差与协方差相同) 
 9 
10 v=randn(1,N);%测量噪声
11 R=var(v);
12 
13 %% 计算真实状态
14 x_true(1)=0;%状态x_true初始值
15 A=1;%a为状态转移阵,此程序简单起见取1
16 for k=2:N
17     x_true(k)=A*x_true(k-1)+w(k-1);  %系统状态方程,k时刻的状态等于k-1时刻状态乘以状态转移阵加噪声(此处忽略了系统的控制量)
18 end
19 
20 
21 %% 由真实状态得到测量数据, 测量数据才是能被用来计算的数据, 其他都是不可见的
22 H=0.2;
23 z=H*x_true+v;%量测方差,c为量测矩阵,同a简化取为一个数
24 
25 
26 %% 开始 预测-更新过程
27 
28 % x_predict: 预测过程得到的x
29 % x_update:更新过程得到的x
30 % P_predict:预测过程得到的P
31 % P_update:更新过程得到的P
32 
33 %初始化误差 和 初始位置
34 x_update(1)=x_true(1);%s(1)表示为初始最优化估计
35 P_update(1)=0;%初始最优化估计协方差
36 
37 for t=2:N
38     %-----1. 预测-----
39     %-----1.1 预测状态-----
40     x_predict(t) = A*x_update(t-1); %没有控制变量
41     %-----1.2 预测误差协方差-----
42     P_predict(t)=A*P_update(t-1)*A+Q;%p1为一步估计的协方差,此式从t-1时刻最优化估计s的协方差得到t-1时刻到t时刻一步估计的协方差
43 
44     %-----2. 更新-----
45     %-----2.1 计算卡尔曼增益-----
46     K(t)=H*P_predict(t) / (H*P_predict(t)*H+R);%b为卡尔曼增益,其意义表示为状态误差的协方差与量测误差的协方差之比(个人见解)
47     %-----2.2 更新状态-----
48     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)
49     %-----2.3 更新误差协方差-----
50     P_update(t)=P_predict(t) - H*K(t)*P_predict(t);%此式由一步估计的协方差得到此时刻最优化估计的协方差
51 end
52 
53 %% plot
54 %作图,红色为卡尔曼滤波,绿色为量测,蓝色为状态
55 %kalman滤波的作用就是 由绿色的波形得到红色的波形, 使之尽量接近蓝色的真实状态。
56 t=1:N;
57 plot(t,x_update,r,t,z,g,t,x_true,b);

 

卡尔曼滤波器

标签:

原文地址:http://www.cnblogs.com/void0/p/4189821.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!