📄 kalman.m
字号:
clc
clear
T=1%雷达扫描周期
num=100;%滤波次数
al=1/120;%机动频率常数
amax=100;%m/s^2
amax1=-100;
%********************产生真实轨迹************************
N1=10/T;
N2=20/T;
N3=30/T;
N4=40/T;
sx=zeros(1,N4);%目标实际x位置
sy=zeros(1,N4);
svx=zeros(1,N4);%目标实际x方向速度
svy=zeros(1,N4);
sax=zeros(1,N4);%目标实际x方向加速度
say=zeros(1,N4);
sx(1)=100;%初始x位置
sy(1)=3000;%初始y位置
v0=426;%x方向初始速度m/s
b=pi/4;%目标初始航向角
svx(1)=v0*cos(b);%初始x速度
svy(1)==v0*sin(b);%初始y速度
sax=0;%初始x加速度
say=0;%初始y加速度
a0=20;%x方向的加速度m/s^2
Rr=3000;%%旋转半径m
for i=1:N4-1
if (i>N1&i<N2-1)
s=v0*T+0.5*a0*T*T;
v0=v0+a0*T;
xx=s*cos(b);
yy=s*sin(b);
sx(i+1)=sx(i)+xx;
sy(i+1)=sy(i)+yy;
svx(i+1)=v0*cos(b);
svy(i+1)=v0*sin(b);
sax(i+1)=a0*cos(b);
say(i+1)=a0*sin(b);
elseif (i>N2&i<N3-1)
a1=v0^2/Rr;
bb=a1/v0*T;
xx=Rr*(sin(b+bb)-sin(b));
yy=Rr*(cos(b)-cos(b+bb));
b=b+bb;
sx(i+1)=sx(i)+xx;
sy(i+1)=sy(i)+yy;
svx(i)=v0*cos(b);
svy(i)=v0*sin(b);
sax(i)=-a1*sin(b);
say(i)=a1*cos(b);
elseif (i>N3&i<N4-1)
a1=v0^2/Rr;
bb=a1/v0*T;
xx=Rr*(sin(b-bb)-sin(b));
yy=Rr*(cos(b)-cos(b-bb));
b=b-bb;
sx(i+1)=sx(i)-xx;
sy(i+1)=sy(i)-yy;
svx(i)=v0*cos(b);
svy(i)=v0*sin(b);
sax(i)=a1*sin(b);
say(i)=a1*cos(b);
else
s=v0*T;
xx=s*cos(b);
yy=s*sin(b);
sx(i+1)=sx(i)+xx;
sy(i+1)=sy(i)+yy;
svx(i)=v0*cos(b);
svy(i)=v0*sin(b);
sax(i)=0;
say(i)=0;
end
end
%*****************************************
Qc=[1 T T*T/2 0 0 0;0 1 T 0 0 0;0 0 1 0 0 0;0 0 0 1 T T*T/2;0 0 0 0 1 T;0 0 0 0 0 1];%一步转移输矩阵
Qb=[1 T 1/al^2*(-1+al*T+exp(-al*T)) 0 0 0;0 1 1/al*(1-exp(-al*T)) 0 0 0;0 0 exp(-al*T) 0 0 0;0 0 0 1 T 1/al^2*(-1+al*T+exp(-al*T));0 0 0 0 1 1/al*(1-exp(-al*T));0 0 0 0 0 exp(-al*T)];
H=[1 0 0 0 0 0;0 0 0 1 0 0];%观测矩阵
I=[1 0 0 0 0 0;0 1 0 0 0 0;0 0 1 0 0 0;0 0 0 1 0 0;0 0 0 0 1 0;0 0 0 0 0 1];%单位矩阵
deta_w=1;
x0=30;
y0=30;%固定测量误差
bl=0.01;%比例系数
e2=normrnd(0,sqrt(deta_w),[1 N4]);%第一个参数是均值,第二个是标准差,后面用于指定生成矩阵的大小
vk=zeros(2,1,N4);%观测噪声V(k)
Z=zeros(2,1,N4);%观测值
xtzt=zeros(6,1,N4);%系统状态
R=zeros(2,2,N4);%测噪声方差
for i=1:N4
xtzt(1,1,i)=sx(i);
xtzt(4,1,i)=sy(i);
end
for i=1:N4
vk(1,1,i)=(bl*sx(i)+x0)*e2(i);%计算观测噪声V(k)
vk(2,1,i)=(bl*sy(i)+y0)*e2(i);
Z(:,:,i)=H*xtzt(:,:,i)+vk(:,:,i);%观测方程
R(:,:,i)=[(bl*sx(i)+x0)^2*mean(e2(i)*e2(i)) 0 ;0 (bl*sy(i)+y0)^2*mean(e2(i)*e2(i))];%计算观测噪声方差
end
for k=1:N4
guance_x(k)=Z(1,1,k);
guance_y(k)=Z(2,1,k);
end
%*****************************************
%计算Q中的常数矩阵
a2x=zeros(1,N4);%ax加速度方差
a2y=zeros(1,N4);%ay加速度方差
Q=zeros(6,6,N4);%常数矩阵
Q11=zeros(3,3,N4);%常数矩阵
Q22=zeros(3,3,N4);%常数矩阵
Q12=zeros(3,3,N4);%常数矩阵
q11=1/(2*al^5)*(1-exp(-2*al*T)+2*al*T+2*al^3*T^3/3-2*al*al*T^2-4*al*T*exp(-al*T));
q12=1/(2*al^4)*(exp(-2*al*T)+1-2*exp(-al*T)+2*al*T*exp(-al*T)-2*al*T+al*al*T^2);
q21=q12;
q13=1/(2*al^3)*(1-exp(-2*al*T)-2*al*T*exp(-al*T));
q31=q13;
q22=1/(2*al^3)*(4*exp(-al*T)-3-exp(-2*al*T)+2*al*T);
%q23=1/(2*al^2)*(exp(-2*al*T)+1-2*al*T);
q23=1/(2*al^2)*(exp(-2*al*T)+1-2*exp(-al*T));
q32=q23;
q33=1/(2*al)*(1-exp(-2*al*T));
q2=[q11 q12 q13;q21 q22 q23;q31 q32 q33];
%********************kalman滤波初始化************************
%3点起始法定初值
XX1=zeros(6,1,N4);%存放一步预测估计值
PP1=zeros(6,6,N4);%存放预测滤波协方差矩阵
K=zeros(6,2,N4);%存放增益矩阵
Qz=zeros(6,6,N4);%
a2x(3)=10;
a2y(3)=10;
%X=zeros(6,1,N4);
XX=zeros(6,1,N4);%存放估计值
PP=zeros(6,6,N4);%存放滤波协方差矩阵
%XX(:,:,3)=[Z(1,1,3) 3*(Z(1,1,3)-Z(1,1,2)-(Z(1,1,3)-Z(1,1,1)))/T (Z(1,1,3)-2*Z(1,1,2)+Z(1,1,1))/T^2 Z(2,1,3) 3*(Z(2,1,3)-Z(2,1,2)-(Z(2,1,3)-Z(2,1,1)))/T (Z(2,1,3)-2*Z(2,1,2)+Z(2,1,1))/T^2]';%初始状态值估计
XX(:,:,3)=[403 295 0 3602 370 0];
%对PP(:,:,3)进行初始化
deta_r=100;%观测距离的标准方差
deta_alpha=0.1*10^(-3);%观测方位角的标准方差
p11=deta_r^2*sx(3)^2/(sx(3)^2+sy(3)^2)+sy(3)^2*deta_alpha^2;
p12=p11/T;
p13=p11/T^2;
p14=deta_r^2*sx(3)*sy(3)/(sx(3)^2+sy(3)^2)-sx(3)*sy(3)*deta_alpha^2;
p15=p14/T;
p16=p14/T^2;
p21=p12;
p22=(deta_r^2*sx(3)^2/(sx(3)^2+sy(3)^2)+sy(3)^2*deta_alpha^2+deta_r^2*sx(2)^2/(sx(2)^2+sy(2)^2)+sy(2)^2*deta_alpha^2)/T^2;
p23=(deta_r^2*sx(3)^2/(sx(3)^2+sy(3)^2)+sy(3)^2*deta_alpha^2+2*(deta_r^2*sx(2)^2/(sx(2)^2+sy(2)^2)+sy(2)^2*deta_alpha^2))/T^3;
p24=p15;
p25=(deta_r^2*sx(3)*sy(3)/(sx(3)^2+sy(3)^2)-sx(3)*sy(3)*deta_alpha^2+deta_r^2*sx(2)*sy(2)/(sx(2)^2+sy(2)^2)-sx(2)*sy(2)*deta_alpha^2)/T^2;
p26=(deta_r^2*sx(3)*sy(3)/(sx(3)^2+sy(3)^2)-sx(3)*sy(3)*deta_alpha^2+2*(deta_r^2*sx(2)*sy(2)/(sx(2)^2+sy(2)^2)-sx(2)*sy(2)*deta_alpha^2))/T^3;
p31=p11/T^3;
p32=p23;
p33=(deta_r^2*sx(3)^2/(sx(3)^2+sy(3)^2)+sy(3)^2*deta_alpha^2+4*(deta_r^2*sx(2)^2/(sx(2)^2+sy(2)^2)+sy(2)^2*deta_alpha^2)+deta_r^2*sx(1)^2/(sx(1)^2+sy(1)^2)+sy(1)^2*deta_alpha^2)/T^4;
p34=p13/T;
p35=p23/T;
p36=p33/T;
p41=p14;
p42=p24;
p43=p34;
p44=deta_r^2*sy(3)^2/(sx(3)^2+sy(3)^2)+sx(3)^2*deta_alpha^2;
p45=p44/T;
p46=p45/T;
p51=p15;
p52=p25;
p53=p35;
p54=p45;
p55=(deta_r^2*sy(3)^2/(sx(3)^2+sy(3)^2)+sx(3)^2*deta_alpha^2+deta_r^2*sy(2)^2/(sx(2)^2+sy(2)^2)+sx(2)^2*deta_alpha^2)/T^2;
p56=(deta_r^2*sy(3)^2/(sx(3)^2+sy(3)^2)+sx(3)^2*deta_alpha^2+2*(deta_r^2*sy(2)^2/(sx(2)^2+sy(2)^2)+sx(2)^2*deta_alpha^2))/T^3;
p61=p16;
p62=p26;
p63=p36;
p64=p46;
p65=p56;
p66=(deta_r^2*sy(3)^2/(sx(3)^2+sy(3)^2)+sx(3)^2*deta_alpha^2+4*(deta_r^2*sy(2)^2/(sx(2)^2+sy(2)^2)+sx(2)^2*deta_alpha^2)+deta_r^2*sy(1)^2/(sx(1)^2+sy(1)^2)+sx(1)^2*deta_alpha^2);
%PP(:,:,3)=[p11 p12 p13 p14 p15 p16;p21 p22 p23 p24 p25 p26;p31 p32 p33 p34 p35 p36;p41 p42 p43 p44 p45 p46;p51 p52 p53 p54 p55 p56;p61 p62 p63 p64 p65 p66];
PP(:,:,3)=[400 0 0 0 0 0;0 250 0 0 0 0;0 0 0 0 0 0;0 0 0 0 0 0;0 0 0 0 150 0;0 0 0 0 0 400];
%***********************************KALMAN 滤波
for i=3:N4-1
Q11(:,:,i)=2*al*a2x(i)*q2;%计算Q矩阵
Q22(:,:,i)=2*al*a2y(i)*q2;%计算Q矩阵
Q(:,:,i)=[Q11(:,:,i) Q12(:,:,i);Q12(:,:,i) Q22(:,:,i)];%计算Q矩阵
XX1(:,:,i)=Qc*XX(:,:,i);%计算一步预测估计值
PP1(:,:,i)=Qb*PP(:,:,i)*Qb'+Q(:,:,i);%计算预测滤波协方差矩阵
K(:,:,i)=PP1(:,:,i)*H'*inv(H*PP1(:,:,i)*H'+R(:,:,i));%计算增益矩阵
XX(:,:,i+1)=XX1(:,:,i)+K(:,:,i)*(Z(:,:,i+1)-H*XX1(:,:,i));%计算估计值
PP(:,:,i+1)=(I-K(:,:,i+1)*H)*PP1(:,:,i);%计算协方差更新方程
if(XX(3,:,i)>=0)
a2x(i+1)=(4-pi)/pi*(amax-XX(3,:,i))*(amax-XX(3,:,i));
elseif(XX(3,:,i)<0)
a2x(i+1)=(4-pi)/pi*(amax1+XX(3,:,i))*(amax1+XX(3,:,i));
end
if(XX(6,:,i)>=0)
a2y(i+1)=(4-pi)/pi*(amax-XX(6,:,i))*(amax-XX(6,:,i));
elseif(XX(6,:,i)<0)
a2y(i+1)=(4-pi)/pi*(amax1+XX(6,:,i))*(amax1+XX(6,:,i));
end
end
x_filter=zeros(1,N4);
y_filter=zeros(1,N4);
ax_filter=zeros(1,N4);
vx_filter=zeros(1,N4);
vy_filter=zeros(1,N4);
ay_filter=zeros(1,N4);
for k=1:N4;
x_filter(k)=XX(1,1,k);
vx_filter(k)=XX(2,1,k);
ax_filter(k)=XX(3,1,k);
y_filter(k)=XX(4,1,k);
vy_filter(k)=XX(5,1,k);
ay_filter(k)=XX(6,1,k);
end
figure(1);
plot(sx,sy,'r-',guance_x,guance_y,'b-x');
hold on
plot(x_filter,y_filter,'g-h');
legend('真实飞行轨迹','观测飞行轨迹','估计飞行轨迹');
title('目标在空间中的真实飞行轨迹与估计轨迹')
figure(2);
plot(svx,'r-');
hold on
plot(vx_filter,'b-x');
xlabel('T(s)'),ylabel('Y(m/s)');
title('x方向上的速度值与估计值')
figure(4);
plot(sax,'b-x');
hold on
plot(ax_filter,'r-x');
xlabel('T(s)'),ylabel('Y(m/s2)');
title('x方向上的加速度值与估计值')
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -