参考内容:书籍《卡尔曼滤波原理及应用------matlab仿真》这本书对kalman算法的解析很清晰,MATLAB程序很全,适合初学者(如有侵权,请联系删除(qq:1491967912))
本文内容从两个方面来学习EKF在目标跟踪中的应用。
1、数学建模
2、基于观测距离的EKF目标跟踪算法
1、数学建模。
以匀速直线运动系统为例,介绍目标跟踪的状态方程和观测方程的建立过程,也即数学建模过程。
假定目标做的是匀速直线运动,速度为v,目标在k时刻的位置设为state(k),经过采样时间T,目标的位置信息为
state(k+1)=state(k)+v*T.显然在直角坐标系中目标有x和y两个方向的分量,运动系统的状态量有x方向上的位置、y方向上的位置、x方向上的速度和y方向上的速度四个量。运动过程中还存在随机扰动u(k)的干扰(其实是加速度带来的影响,由于前提是匀速直线运动,所以把加速度当成了随机扰动)因此系统可以表示为:
令
系统的状态方程可以化简为:
式中的
接下来是观测方程:以雷达为例,假定雷达的位置为(x0,y0),目标k时刻的位置为(x(k),y(k)),测得的目标和雷达之间的距离为Z,则观测方程可写为。
其中,V(k)称为测量噪声,是雷达自身测量的误差,其方差为R。从上述模型来看,状态方程是线性的,但观测方程是非线性的。
2、基于观测距离的EKF目标跟踪算法
假定目标做匀速直线运动,初始状态X(0)已经通过航迹起始算法获得。过程噪声u(k)可以写为:
记过程噪声u(k)的均方差为:
式中的w1和w2为一个可调节的参数,二者远远小于1.
过程噪声u(k)的协方差为:
因此协方差与均方值之间的关系可以写为
从模型来看状态方程是线性的,无需线性化求的状态转移矩阵F;但观测矩阵是一个非线性的,因此基于距离信息进行目标跟踪是一个非线性估计问题,因此要采用EKF对目标进行跟踪。
运用线性化方法将非线性方程线性化。具体线性化可参考上一篇扩展KALMAN滤波(EKF)基本知识和相应的MATLAB仿真中的公式6和7.得到相应的雅可比矩阵。
上述所有方程基本上包含了EKF递推公式的所有结果。通过以上方程可以方便编写MATALB程序。
1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 2 %功能说明:扩展kalman滤波在目标跟踪中的应用 3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4 clc 5 clear all 6 close all 7 T=1; %雷达扫描周期 8 N=100/T; %采样次数 9 X=zeros(4,N); %目标真实位置、速度 10 X(:,1)=[-100 2 200 20]; %目标的起始位置和速度 11 Z=zeros(1,N); %传感器测量的距离 12 delta_w=1e-3; %若增大会变成曲线 13 W=delta_w*diag([0.5 1]); %过程噪声方差 14 G=[T^2/2 0;T 0;0 T^2/2;0 T]; 15 R=4; %观测噪声方差 16 F=[1 T 0 0;0 1 0 0;0 0 1 T;0 0 0 1]; %状态转移矩阵 17 x0=200;y0=100; 18 Xstation=[200 100]; %雷达的位置 19 for i=2:N 20 X(:,i)=F*X(:,i-1)+G*sqrt(W)*randn(2,1); %目标的真实轨迹 21 end 22 for i=1:N 23 Z(i)=Dist(X(:,i),Xstation)+sqrt(R)*randn(1,1); %目标的观测轨迹 24 end 25 %EKF滤波 26 X_ekf=zeros(4,N); %EKF滤波 27 X_ekf(:,1)=X(:,1); %EKF初始化 28 P=eye(4); %协方差矩阵初始化。 29 I=eye(4); 30 for i=2:N 31 Xn=F*X_ekf(:,i-1); 32 Z1=Dist(Xn,Xstation); 33 %求解观测矩阵 34 H=[(Xn(1)-x0)/sqrtm((Xn(1)-x0)^2+(Xn(3)-y0)^2) 0 (Xn(3)-y0)/sqrtm((Xn(1)-x0)^2+(Xn(3)-y0)^2) 0]; 35 P1=F*P*F'+G*W*G'; 36 K=P1*H'/(H*P1*H'+R); 37 X_ekf(:,i)=Xn+K*(Z(i)-Z1); 38 P=(I-K*H)*P1; 39 end 40 %误差分析 41 for i=1:N 42 Err_Kalman(i)=Dist(X(:,i),X_ekf(:,i)); 43 end 44 45 %%%%%%画图 46 figure 47 plot(X(1,:),X(3,:),'k.');hold on; 48 plot(X_ekf(1,:),X_ekf(3,:),'r*'); 49 legend('真实轨迹','EKF轨迹'); 50 grid on; 51 xlabel('横坐标\m'); 52 ylabel('纵坐标\m'); 53 54 figure 55 plot(Err_Kalman,'-ks'); 56 xlabel('时间\s'); 57 ylabel('位置估计偏差\m');
仿真结果如下图所示