Kalman滤波器原理和实现

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 



  1. 卡尔曼滤波的原理说明 ?
  2. Kalman滤波器从原理到实现 ?
时间: 2024-10-23 16:55:43

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

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

预估器 我们希望能够最大限度地使用測量结果来预计移动物体的运动. 所以,多个測量的累积能够让我们检測出不受噪声影响的部分观測轨迹. 一个关键的附加要素即此移动物体运动的模型. 有了这个模型,我们不仅能够知道该移动物体在什么位置,同一时候还能够知道我们观察支持模型的什么參数. 该任务分为两个阶段.在第一阶段,即预測阶段.用从过去得到的信息进一步修正模型以取得人或物体的下一个将对出现的位置.在第二阶段,即校正阶段,我们获得一个測量.然后与基于前一次測量的预測值(即模型)进行调整.完毕两个阶段预计任务

Kalman滤波器从原理到实现

转载请注明出处:http://xiahouzuoxin.github.io/notes Kalman滤波器的历史渊源 We are like dwarfs on the shoulders of giants, by whose grace we see farther than they. Our study of the works of the ancients enables us to give fresh life to their finer ideas, and rescue t

卡尔曼滤波器原理之基本思想

一.卡尔曼滤波器要解决的问题 首先说一下卡尔曼滤波器要解决的是哪一类问题,这类系统应该如何建模.这里说的是线性卡尔曼滤波器,顾名思意,那就是线性动态的离散系统.这类系统可以用如下两个方程来表示: \[\begin{array}{l} x(n + 1) = F(n + 1,n)x(n) + {v_1}(n) \\  y(n) = C(n)x(n) + {v_2}(n) \\  \end{array}\] 其中: x(n)表示系统的状态 F(n+1,n)为状态转移矩阵,表示状态随时间的变化规律.通俗

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

目标跟踪的kalman滤波器介绍 Kalman滤波器是通过前一状态预测当前状态,并使用当前观测状态进行校正,从而保证输出状态平稳变化,可有效抵抗观测误差.因此在运动目标跟踪中也被广泛使用.在视频处理的运动目标跟踪里,每个目标的状态可表示为(x,y,w,h),x和y表示目标位置,w和h表示目标宽高.一般地认为目标的宽高是不变的,而其运动速度是匀速,那么目标的状态向量就应该扩展为(x,y,w,h,dx,dy),其中dx和dy是目标当前时刻的速度.通过kalman滤波器来估计每个时刻目标状态的大致过程

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

终于成功仿了一次Kalman滤波器 首先是测试了从网上down的一段代码 % KALMANF - updates a system state vector estimate based upon an% observation, using a discrete Kalman filter.%% Version 1.0, June 30, 2004%% This tutorial function was written by Michael C. Kleder% (Comments are 

卡尔曼滤波器原理之基本思想续

在上一篇文章卡尔曼滤波器原理之基本思想中,我们分析并推导了基于卡尔曼一步预测的滤波器状态递推公式,接下来,我们将完成上一次的推导过程.首先,我们拿来上次的推导结果: \[\hat x(n + 1|{{\bf{Y}}_n}) = \sum\limits_{k = 1}^{n - 1} {E[x(n + 1){\alpha ^H}(k)]{{\bf{R}}^{ - 1}}(k)\alpha (k)}  + E[x(n + 1){\alpha ^H}(k)]{{\bf{R}}^{ - 1}}(k)\a

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

基本思想 以K-1时刻的最优估计Xk-1为准,预测K时刻的状态变量Xk/k-1,同时又对该状态进行观测,得到观测变量Zk,再在预测与观之间进行分析,或者说是以观测量对预测量进行修正,从而得到K时刻的最优状态估计Xk. 具体实例 设一个机器人有两个状态量,分别为位置P,速度V.在这里记为: 卡尔曼滤波假设两个变量(位置和速度,在这个例子中)都是随机的,并且服从高斯分布.每个变量都有一个均值μ,表示随机分布的中心(最可能的状态),以及方差 ,表示不确定性.其中,位置和速度之间可以是相关的也可以是不相

kalman滤波器公式的推导

卡尔曼滤波的使用范围: 该系统要有如下关系: 计算步骤: PART0:INI PART1:Time update 迭代的目标:从X(K-1)+ 求得X(K) + 因此,先有X(K-1)+,已知F,G.得到X(K) -.再由K(k),y(k) 求得X(K)+. 但是K(k)需要P(K)-,P(K)-需要从(K-1)+得到.所以要算P(k)-. 为了保证迭代的继续还要计算P(K)+. 第一公式是假设:linear discrete-time system 第二公式推导: 此时只有先验概率 Part2

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

1.简介(Brief Introduction) 在学习卡尔曼滤波器之前,首先看看为什么叫"卡尔曼".跟其他著名的理论(例如傅立叶变换,泰勒级数等等)一样,卡尔曼也是一个人的名字,而跟他们不同的是,他是个现代人! 卡尔曼全名Rudolf Emil Kalman,匈牙利数学家,1930年出生于匈牙利首都布达佩斯.1953,1954年于麻省理工学院分别获得电机工程学士及硕士学位.1957年于哥伦比亚大学获得博士学位.我们现在要学习的卡尔曼滤波器,正是源于他的博士论文和1960年发表的论文&