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. noip2016复习

    明天的复习任务 矩阵乘法 优先队列(老忘记怎么打) 二分图 K短路 单调队列(还是不太明白各种顺序) 扩展欧几里得 费马小定理求素数 哎呀,列了这么多,任重而道远啊-- 今夕是何夕,晚风过花庭-- 故 ...

  2. 【转】VS项目属性的一些配置项的总结

    首先,解决方案和项目文件夹包含关系(c++项目): VS解决方案和各个项目文件夹以及解决方案和各个项目对应的配置文件包含关系,假设新建一个项目ssyy,解决方案起名fangan,注意解决方案包括项目, ...

  3. Java实现颜色渐变效果

    RGB色彩,在自然界中肉眼所能看到的任何色彩都可以由红(R).绿(G).蓝(B)这三种色彩混合叠加而成,因此我们只要递增递减的修改其特定值就能得到相应的渐变效果. 运行效果:(图1) 运行5秒后:(图 ...

  4. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined)(set容器里count函数以及加强for循环)

    题目链接:http://codeforces.com/contest/722/problem/D 1 #include <bits/stdc++.h> #include <iostr ...

  5. [译] 用 Swift 创建自定义的键盘

    本文翻译自 How to make a custom keyboard in iOS 8 using Swift 我将讲解一些关于键盘扩展的基本知识,然后使用iOS 8 提供的新应用扩展API来创建一 ...

  6. 1 mysql的安装

    win10 总之前期的步骤大概有:1下载安装:2 安装好后配置环境变量:3:登陆数据库 1:安装 mysql有安装版和直接解压就可以用的,据说大神都是安装的直接解压的,但鉴于自己是小白,就整了个安装版 ...

  7. Loadrunner之API测试

    //API函数 web_submit_data web_custom_request   //支持https请求 web_set_sockets_option("SSL_VERSION&qu ...

  8. mysql可以用这种方式<<! 输入内容 ! 做成脚本

    以这种文件式做交接NB!!!!! [root@NB test]# mysql -uroot -p$passwd <<! > use mysql > select user,ho ...

  9. Jquery.Datatables td宽度太长的情况下,自动换行

    在 td 里面 加上 style="word-wrap:break-word;" 自动换行就好了,如果不想换行,可以将超出内容设为隐藏, overflow:hidden; whit ...

  10. 设计模式学习之迭代器模式(Iterator,行为型模式)(17)

    参考地址:http://www.cnblogs.com/zhili/p/IteratorPattern.html 一.介绍迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作 ...