Kalman滤波器原理和实现

kalman filter

Kalman滤波器的直观理解[1]

假设我们要测量一个房间下一刻钟的温度。据经验判断,房间内的温度不可能短时大幅度变化,也就是说可以依经验认为下一刻钟的温度等于现在的温度。但是经验是存在误差的,下一刻的真实温度可能比我们预测温度上下偏差几度,这个偏差可以认为服从高斯分布。另外我们也可以使用温度计测量温度,但温度计测量的是局部空间的温度,没办法准确的度量整间房子的平均温度。测量值和真实值得偏差也认为服从高斯分布。

现在希望由经验的预测温度和温度计的测量值估算房间的真实平均温度。

首先我们由时刻的温度可以推测下一刻钟温度,例如k时刻的温度是23°C,那么预测k+1刻钟的温度也为23°C,同时假设估计偏差是5°C,然后到了k+1时刻使用温度计测量得到的温度是25°C,温度计的偏差是4°C。真实的温度以较大概率位于23℃ 和25℃ 之间 ,所以可以通过这两个值的方差来判定谁更可靠,方差越小说明可信度越高,那么真实温度接近该值的可能性越大。所以这里可以认为真实温度为 ℃。可以看出最终选择的温度值更偏向于偏差较小的量。

现在k+1时刻的温度可以认为是24.11摄氏度,那么预测k+2时刻的温度时就可以依据经验认为温度是24.11,那么偏差是多少呢? ,其中被称为卡尔曼增益,可以发现现在估算的偏差小了好多。于是可以类似估算k+1时刻温度那样较准确的估算第k+2时刻的温度,这是一个迭代的过程。

Kalman理论推导[2]

现在有一个运动系统

该式称为系统的预测方程,其中

  1. 是t-1时刻下目标的状态,而是估算的t时刻的状态,比如位移,速度

  2. 矩阵是状态转移矩阵

  3. 是第t时刻系统新加入的变量,是输入控制矩阵,是对当前输入的处理矩阵

  4. 是噪声矩阵,可以认为是高斯噪声。

在上例中, A=1,·,B=0,没有输入,偏差.

系统的测量方程为

其中表示t时刻的真实状态,是观测矩阵,因为的变量空间不一定相同,所以有一个观测矩阵,使真实状态映射到观测空间中。是高斯噪声。如果能直接测量,那么.

现在来推导Kalman过程:

设预测过程中噪声,测量过程中噪声, 分别是协方差矩阵。

  1. 预测

    预测值

    最小均方误差矩阵

    这里,

    是期望符号。

    为了理解这个式子啊,要明白真实值是没法获得的,我们得到的都是估计值,因为错误可以避免,误差一定存在。预测使用的是初步估计值,然后使用测量值对估计值修正之后还是估计值,只不过是更准确的估计值~ 当然系统状态方程是不变的,真实的状态运动到真实的状态,而估计的状态值运动到估计的状态.

  2. 修正

    误差增益

    修正估计

    这两个式子可以通过上面的那个例子理解,这里的矩阵主要是用来将观测空间映射到状态空间。

    最小均方误差矩阵修正

这里推出来的结果和网上的都不一样,暂时还没发现是哪里出现问题了,再慢慢看,可是想一想协方差矩阵应该是对称矩阵,而网上给出的怎么保证是对称矩阵呢?


均方误差中的道道

  • 估计值和测量值的偏差都服从高斯分布

  • Kalman滤波器结合了估计值和观测值得到更精确的估计值~即使偏差更小

  • Kalman滤波器需要初始化第一帧的状态。


matlab代码


  1. function [ curSample,P] = kalmanfilter(initSample,observeSample,initP,A,H,Q,R,boundary) 

  2. % 基于kalman滤波的目标追踪方法实现 

  3. % structure of sample: (x,y,vx,vy,hx,hy,sc) 

  4. % x -x方向坐标 

  5. % y -y方向坐标 

  6. % vx -x方向的速度 

  7. % vy -y方向的速度 

  8. % hx -区域宽度的一半 

  9. % hy -区域高度的一半 

  10. % sc -尺度变换scale 


  11. % 系统状态方程:x(n)=A*x(n-1)+w(n) 

  12. % 系统测量方程:z(n)=H*x(n)+v(n) 

  13. % 其中 w(n)和v(n)均服从独立正态分布 


  14. % 鉴于连续帧之间时间间隔很短,假设两帧之间目标匀速运动 


  15. % inputs: 

  16. % initSample -前一帧检测到的区域,作为当前帧的输入 

  17. % observeSample -当前帧观测到的区域 

  18. % initP -前一帧的均方误差矩阵 

  19. % A -状态转移矩阵 

  20. % H -系统观测矩阵 

  21. % Q -过程噪声的协方差矩阵 

  22. % R -测量噪声的协方差矩阵 

  23. % boundary -图像的大小[width,height] 

  24. % outputs: 

  25. % curSample -修正后的观测值,作为输出的检测区域 

  26. % P -当前帧的均方误差矩阵,作为下一帧的输入 


  27. %[A,Q,H,R]=initialize(); 

  28. [curSample,P]=predict(initSample,A,Q,initP); 

  29. [curSample,P]=update (curSample,P,observeSample,H,R); 

  30. if isValidate(curSample,boundary)==0 

  31. curSample=initSample; 

  32. end 

  33. end 


  34. function flag=isValidate(sample,boundary) 

  35. % 判定选择的区域是否越界 

  36. % inputs: 

  37. % sample -待判定的样本 

  38. % boundary -图像的边界[width,height] 

  39. % outputs: 

  40. % flag -1有效,0无效 

  41. width =boundary(1); 

  42. height =boundary(2); 

  43. x0=sample(1)-sample(5);% 窗口左上角的x坐标 

  44. y0=sample(2)-sample(6);% 窗口左上角的y坐标 

  45. flag=1; 

  46. if x0<1||y0<1||x0>width-2*sample(5)-1||y0>height-2*sample(6)-1 

  47. flag=0; 

  48. end 

  49. end 


  50. function [curSample,P]=predict(preSample,A,Q,preP) 

  51. % kalman滤波的预测阶段 

  52. % inputs: 

  53. % preSample -前一时刻的状态,即x(t-1) 

  54. % A -状态转移矩阵 

  55. % Q -过程噪声的协方差矩阵 

  56. % preP -前一时刻的误差协方差矩阵P(n-1) 

  57. % outputs; 

  58. % curSample -预测的状态值,即x(n|n-1) 

  59. % P -预测状态的协方差矩阵P(n|n-1) 

  60. curSample=A*preSample; 

  61. P=A*preP*A'+Q; 

  62. end 


  63. function [curSample,P]=update(curSample,P,observeSample,H,R) 

  64. % kalman滤波的修正阶段 

  65. % inputs: 

  66. % curSample -预测阶段的状态 

  67. % P -预测阶段的协方差矩阵 

  68. % observeSample -当前时刻运动目标的观测值 

  69. % H -观测状态使用的观测矩阵 

  70. % R -测量噪声的协方差矩阵 

  71. % outputs: 

  72. % curSample -修正之后的目标状态 

  73. % P -修正之后的误差协方差矩阵 


  74. temp=H*P*H'+R; 

  75. K=P*H'/temp; % kalman增益 

  76. curSample=curSample+K*(observeSample-H*curSample); 

  77. temp=K*H; 

  78. I=eye(size(temp)); 

  79. P=(I-temp)*P; 

  80. end 



Kalman滤波器原理和实现的更多相关文章

  1. 【计算机视觉】基于Kalman滤波器的进行物体的跟踪

    预估器 我们希望能够最大限度地使用測量结果来预计移动物体的运动. 所以,多个測量的累积能够让我们检測出不受噪声影响的部分观測轨迹. 一个关键的附加要素即此移动物体运动的模型. 有了这个模型,我们不仅能 ...

  2. Kalman滤波器从原理到实现

    Kalman滤波器的历史渊源 We are like dwarfs on the shoulders of giants, by whose grace we see farther than the ...

  3. 终于成功仿了一次Kalman滤波器

    终于成功仿了一次Kalman滤波器 首先是测试了从网上down的一段代码 % KALMANF - updates a system state vector estimate based upon a ...

  4. 运动目标跟踪中kalman滤波器的使用

    目标跟踪的kalman滤波器介绍 Kalman滤波器是通过前一状态预测当前状态,并使用当前观测状态进行校正,从而保证输出状态平稳变化,可有效抵抗观测误差.因此在运动目标跟踪中也被广泛使用.在视频处理的 ...

  5. 无人驾驶技术之Kalman Filter原理介绍

    基本思想 以K-1时刻的最优估计Xk-1为准,预测K时刻的状态变量Xk/k-1,同时又对该状态进行观测,得到观测变量Zk,再在预测与观之间进行分析,或者说是以观测量对预测量进行修正,从而得到K时刻的最 ...

  6. kalman滤波原理

    2017拜拜啦,怎么过元旦呢?当然是果断呆实验室过... 应该是大二的时候首次听说kalman,一直到今天早上,我一看到其5条“黄金公式”,就会找各种理由放弃,看不懂呀...但是研究lidar定位需要 ...

  7. 通俗理解kalman filter原理

    [哲学思想]即使我们对真相(真值)一无所知,我们任然可以通过研究事物规律,历史信息,当前观测而能尽可能靠近真相(真值). [线性预测模型]温度的变化是线性规律的,已知房间温度真值每小时上升1度左右(用 ...

  8. kalman滤波器公式的推导

    卡尔曼滤波的使用范围: 该系统要有如下关系: 计算步骤: PART0:INI PART1:Time update 迭代的目标:从X(K-1)+ 求得X(K) + 因此,先有X(K-1)+,已知F,G. ...

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

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

随机推荐

  1. 赛车比赛(洛谷U4566)

    题目背景 kkk在赛车~ 题目描述 现在有N辆赛车行驶在一条直线跑道(你可以认为跑道无限长)上.它们各自以某种速度匀速前进,如果有两辆车A车和B车,A车在B车的后面,且A车的速度大于B车的速度,那么经 ...

  2. php导出excel封装类

    因为实际情况的需要,导出excel表格在后台开发的过程中会经常用到.下面是我在实际应用中自己整理的一个导出excel类,需要PHPExcel支持,本类很好的完成导出表格的基本样式,保存路径,切换工作薄 ...

  3. CSS学习笔记----CSS3自定义字体图标

    响应式网页字体图标 作者:大漠 日期:2014-01-28 点击:3220 @font-face Responsive 本文由大漠根据Jason的<Responsive Webfont Icon ...

  4. .net学习之Session、Cookie、手写Ajax代码以及请求流程

    1.IIS 7 以上版本集成了两种模式,一种是经典模式,一种是集成模式(直接将asp.net框架集成到IIS中) 2.浏览器和服务器端通过什么技术来实现的?Socket(套接字),通信的语法是HTTP ...

  5. maven 依赖查询

    该文章源地址:http://xiejianglei163.blog.163.com/blog/static/1247276201362733217604/ 为方便个人使用,转载于此处. http:// ...

  6. Parallel.js初探

    今天闲着看了一下Parallel.js.这个库暂时貌似还没有什么中文的介绍(可能暂时用的人都不多吧).所以就只能上github找它得源码和介绍看看了.貌似它的代码也不多,以后可以深入研究一下. 先简单 ...

  7. ApexSQL Log-SQL误操作恢复工具

    今天不小心对数据库执行了一次误操作,心想有没有什么工具能恢复这次误操作呢?于是找到了Log Explorer 4.2,可惜它最多只支持SQL 2005,在SQL 2008上无法使用,然后又找到了Ape ...

  8. 1:A+B Problem

    总时间限制:  1000ms  内存限制:  65536kB 描述 Calculate a + b 输入 Two integer a,,b (0 ≤ a,b ≤ 10) 输出 Output a + b ...

  9. Intent传递对象的两种方法(Serializable,Parcelable) (转)

    今天讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcela ...

  10. hdu 1370 Biorthythms 中国剩余定理

    Biorhythms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...