📄 movekalman.m
字号:
%%卡尔曼滤波 动目标检测
%采用基于当前统计模型的自适应算法
%信号模型:X(k+1)=H*X(k)+D*a+W(k)
%观测模型:Z(k)=C*X(k)+V(k)
clear
clc
IdealTrack=zeros(2,330); %%位置
Vx=zeros(1,330);
Vy=zeros(1,330); %%速度
Ux=zeros(1,330);
Uy=zeros(1,330); %%加速度
IdealTrack(1,1)=2000;
IdealTrack(2,1)=10000;
Vx(1)=0;
Vy(1)=-15; %%初始点
Ux(1)=0;
Uy(1)=0;
for i=2:330
if i<=200
Ux(i)=0;
Uy(i)=0;
elseif i<=300
Ux(i)=0.075;
Uy(i)=0.075;
elseif i>300&i<=305
Ux(i)=0;
Uy(i)=0;
else
Ux(i)=-0.3;
Uy(i)=0.3;
end
Vx(i)=Vx(i-1)+Ux(i-1)*2;
Vy(i)=Vy(i-1)+Uy(i-1)*2;
IdealTrack(1,i)=IdealTrack(1,i-1)+Vx(i-1)*2+2*Ux(i-1);
IdealTrack(2,i)=IdealTrack(2,i-1)+Vy(i-1)*2+2*Uy(i-1);
end
end
Noise=100*randn(2,330);
MeasureTrack=zeros(2,330);
MeasureTrack=IdealTrack+Noise;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for n=1:100
H=[1 2 1.978 0 0 0
0 1 1.967 0 0 0
0 0 0.9672 0 0 0
0 0 0 1 2 1.978
0 0 0 0 1 1.967
0 0 0 0 0 0.9672];
Q=2*(0.37/22)*[1.6 2 4/3 0 0 0
2 8/3 2 0 0 0
4/3 2 2 0 0 0
0 0 0 1.6 2 4/3
0 0 0 2 8/3 2
0 0 0 4/3 2 2];
H1=[1 2 2 0 0 0
0 1 2 0 0 0
0 0 1 0 0 0
0 0 0 1 2 2
0 0 0 0 1 2
0 0 0 0 0 1];
R=[10000 0
0 10000];
C=[1 0 0 0 0 0
0 0 0 1 0 0];
FilterState=zeros(6,1);
ForcastState=zeros(6,1);
FilterTrack=zeros(2,330);
FilterTrack(:,1)=MeasureTrack(:,1);
FilterTrack(:,2)=MeasureTrack(:,2);
x2=MeasureTrack(1,2);
y2=MeasureTrack(2,2);
Vx2=(MeasureTrack(1,2)-MeasureTrack(1,1))/2;
Vy2=(MeasureTrack(2,2)-MeasureTrack(2,1))/2;
Ux2=Ux(2);
Uy2=Uy(2);
FilterState=[x2 Vx2 Ux2 y2 Vy2 Uy2]';
Pfilter=[10000 5000 0 0 0 0
5000 5000 0 0 0 0
0 0 0 0 0 0
0 0 0 10000 5000 0 %%滤波的初值选定
0 0 0 5000 5000 0
0 0 0 0 0 0];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k=3:330
ForcastState=H1*FilterState; %%预测状态
Pforcast=H*Pfilter*H'+Q; %%预测误差协方差
Kgain=Pforcast*C'*inv(C*Pforcast*C'+R); %%增益
FilterState=ForcastState+Kgain*(MeasureTrack(:,k)-C*ForcastState); %%滤波状态
Pfilter=(eye(6)-Kgain*C)*Pforcast; %%滤波误差协方差
FilterTrack(:,k)=C*FilterState;
FilterError(n,k)=sqrt((FilterTrack(1,k)-IdealTrack(1,k))^2+(FilterTrack(2,k)-IdealTrack(2,k))^2);
end
for k=1:2
FilterError(n,k)=sqrt((FilterTrack(1,k)-IdealTrack(1,k))^2+(FilterTrack(2,k)-IdealTrack(2,k))^2);
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MeanError=sum(FilterError,1)/100;
StandError=zeros(330);
StandardDeviation=zeros(330);
for k=1:330
for n=1:100
FFilterError(n,k)=FilterError(n,k)^2;
end
StandError=sum(FFilterError,1)/100
StandardDeviation(k)=sqrt(abs(StandError(k)-MeanError(k)^2));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
subplot(2,2,1);
plot(IdealTrack(1,:),IdealTrack(2,:),'b');
xlabel('理想航迹和观测模型');
axis([1000,3000,2000,12000]);
hold on;
plot(MeasureTrack(1,:),MeasureTrack(2,:),'r'); %%绘制理想航迹和观测模型
subplot(2,2,2);
plot(IdealTrack(1,:),IdealTrack(2,:),'b');
axis([1000,3000,2000,12000]);
hold on;
plot(FilterTrack(1,:),FilterTrack(2,:),'k');
xlabel('理想航迹和滤波结果');
subplot(2,2,3);
plot(MeanError);
xlabel('误差均方差');
subplot(2,2,4);
plot(StandardDeviation);
xlabel('标准差');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -