⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kalman.m

📁 产生真实运动轨迹的程序-系统在建模的时候
💻 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 + -