假定目标做匀速直线运动,在单个观测站对目标进行观测的前提下,再假设目标的初始状态已知。目标的运动方程可以写成如下形式:
其中:
设采样时间间隔T=1s,运行时间为N=60s,W(k)的均方差为,为一个可调节的参数,其远小于1,V(k)均方差为R=5。同时设置UT变换中的相关系数,,维数为9,雷达位置设为(200,300).假设目标运动各时刻的真实状态信息为:,而利用UKF滤波算法得到的目标状态为:
定义均方根误差(RMSE):
仿真结果:
程序:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%无迹卡尔曼滤波在目标追踪中的应用
%%%%%%%%%%%%%%%%%%%%%%%
close all;
clear all;
clc;
T=1; %雷达扫描周期
N=60/T; %总的采样次数
X=zeros(4,N); %目标真实位置、速度
X(:,1)=[-100,2,200,20]; %目标初始位置、速度
Z=zeros(1,N); %传感器对位置的观测
delta_w=1e-3; %如果增大这个参数,目标真实轨迹就是曲线
Q=delta_w*diag([0.5,1]); %过程噪声均值
G=[T^2/2,0;T,0;0,T^2/2;0,T];%过程噪声驱动矩阵
R=5; %观测噪声方差
F=[1,T,0,0;0,1,0,0;0,0,1,T;0,0,0,1]; %状态转移矩阵
x0=200; %雷达站位置
y0=300;
Xstation=[x0,y0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
w=sqrtm(R)*randn(1,N);
for t=2:N
X(:,t)=F*X(:,t-1)+G*sqrtm(Q)*randn(2,1); %目标真实轨迹
end
for t=1:N
Z(t)=Dist(X(:,t),Xstation)+w(t);%对目标观测
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%UKF滤波,UT变换
L=4;
alpha=1;
kalpha=0;
belta=2;
% ramda=alpha^2*(L+kalpha)-L;
ramda=3-L;
for j=1:2*L+1
Wm(j)=1/(2*(L+ramda));
Wc(j)=1/(2*(L+ramda));
end
Wm(1)=ramda/(L+ramda);
Wc(1)=ramda/(L+ramda)+1-alpha^2+belta; %权值计算
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Xukf=zeros(4,N);
Xukf(:,1)=X(:,1);%无迹卡尔曼滤波初始状态
P0=eye(4); %协方差阵初始化
Xg=Xukf;
for t=2:N
xestimate= Xukf(:,t-1);
P=P0;
%第一步:获得一组Sigma点集
cho=(chol(P*(L+ramda)))';
for k=1:L
xgamaP1(:,k)=xestimate+cho(:,k);
xgamaP2(:,k)=xestimate-cho(:,k);
end
Xsigma=[xestimate,xgamaP1,xgamaP2]; %Sigma点集
%第二步:对Sigma点集进行一步预测
Xsigmapre=F*Xsigma;
%第三步:利用第二步的结果计算均值和协方差
Xpred=zeros(4,1); %均值
for k=1:2*L+1
Xpred=Xpred+Wm(k)*Xsigmapre(:,k);
end
Ppred=zeros(4,4); %协方差矩阵预测
for k=1:2*L+1
Ppred=Ppred+Wc(k)*(Xsigmapre(:,k)-Xpred)*(Xsigmapre(:,k)-Xpred)';
end
Ppred=Ppred+G*Q*G';
%第四步:根据预测值,再一次使用UT变换,得到新的sigma点集
chor=(chol((L+ramda)*Ppred))';
for k=1:L
XaugsigmaP1(:,k)=Xpred+chor(:,k);
XaugsigmaP2(:,k)=Xpred-chor(:,k);
end
Xaugsigma=[Xpred XaugsigmaP1 XaugsigmaP2];
%第五步:观测预测
for k=1:2*L+1 %观测预测
Zsigmapre(1,k)=hfun(Xaugsigma(:,k),Xstation);
end
%第六步:计算观测预测均值和协方差
Zpred=0;%观测预测的均值
for k=1:2*L+1
Zpred=Zpred+Wm(k)*Zsigmapre(1,k);
end
Pzz=0;
for k=1:2*L+1
Pzz=Pzz+Wc(k)*(Zsigmapre(1,k)-Zpred)*(Zsigmapre(1,k)-Zpred)';
end
Pzz=Pzz+R;%得到协方差Pzz
Pxz=zeros(4,1);
for k=1:2*L+1
Pxz=Pxz+Wc(k)*(Xaugsigma(:,k)-Xpred)*(Zsigmapre(1,k)-Zpred)';
end
%第七步:计算卡尔曼增益
K=Pxz*inv(Pzz); %卡尔曼增益
Xg(:,t)=Xpred;
xestimate=Xpred+K*(Z(t)-Zpred); %状态更新
P=Ppred-K*Pzz*K'; %方差更新
P0=P;
Xukf(:,t)=xestimate;
end
%误差分析
for i=1:N
Err_kalmanFilter(i)=Dist(X(:,i),Xukf(:,i)); %滤波后的误差
end
%%%%%%%%%画图
figure(1)
hold on;box on;
plot(X(1,:),X(3,:),'-k.'); %真实轨迹
plot(Xukf(1,:),Xukf(3,:),'-r+');%无迹卡尔曼滤波轨迹
xlabel('x坐标/m');
ylabel('y坐标/m');
grid on
% plot(Xg(1,:),Xg(3,:),'-bo');
legend('真实轨迹','UKF轨迹')
figure(2)
hold on;box on;
plot( Err_kalmanFilter,'-ks','MarkerFace','r');
xlabel('时间/s');
ylabel('位置估计误差/RMSE');
grid on
%%%%%%%%%%%%%%%%%%%%%%子函数:求两点间的距离
function d=Dist(X1,X2)
if length(X2)<=2
d=sqrt((X1(1)-X2(1))^2+(X1(3)-X2(2))^2);
else
d=sqrt((X1(1)-X2(1))^2+(X1(3)-X2(3))^2);
end
end
%%%%%%%%%%%%%观测子函数:观测距离
function[y]=hfun(x,xx)
y=sqrt((x(1)-xx(1))^2+(x(3)-xx(2))^2);
end
%%%%%%%%%%%%%%%%%%%%%%%%.
参考资料:
《卡尔曼滤波原理及应用》——黄小平,王岩
如果觉得《无迹卡尔曼滤波(UKF)在单观测站目标跟踪中的应用》对你有帮助,请点赞、收藏,并留下你的观点哦!