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

📄 kalman机动.m

📁 卡尔曼机动
💻 M
字号:
%**************主程序*********************%
clear;
T=2;
num=50;
%真实轨迹
N1=400/T; N2=600/T; N3=610/T;N4=660/T;N5=900/T;
x=zeros(N5,1);
y=zeros(N5,1);
vx=zeros(N5,1);
vy=zeros(N5,1);
x(1)=2000;
y(1)=10000;
vx(1)=0;
vy(1)=-15;
ax=0;
ay=0;
var=100;
for i=1:N5-1
    if(i>N1-1&i<=N2-1)
        ax=0.075;
        ay=0.075;
        vx(i+1)=vx(i)+0.075*T;
        vy(i+1)=vy(i)+0.075*T;
    elseif(i>N2-1&i<=N3-1)
        ax=0;
        ay=0;
        vx(i+1)=vx(i);
        vy(i+1)=vy(i);
    elseif(i>N3-1&i<=N4-1)
        ax=-0.3;
        ay=-0.3;
        vx(i+1)=vx(i)-0.3*T;
        vy(i+1)=vy(i)-0.3*T;
    else
        ax=0;
        ay=0;
        vx(i+1)=vx(i);
        vy(i+1)=vy(i);
    end
    x(i+1)=x(i)+vx(i)*T+0.5*ax*T^2;%真实轨迹
    y(i+1)=y(i)+vy(i)*T+0.5*ay*T^2;
end
rex=num:N5;
rey=num:N5;
for m=1:num
    %噪声
    nx=randn(N5,1)*100;
    ny=randn(N5,1)*100;
    zx=x+nx;
    zy=y+ny;
 %kalman滤波初始化
 rex(m,1)=2000;
 rey(m,1)=10000;
 ki=0;
 low=1;high=0;
 u=0;ua=0;
 e=0.8;
 z=2:1;
 xks(1)=zx(1);
 yks(1)=zy(1);
 xks(2)=zx(2);
 yks(2)=zy(2);
 o=4:4;g=4:2;c=2:4;q=2:2;xk=4:1;perr=4:4;
 o=[1,T,0,0;0,1,0,0;0,0,1,T;0,0,0,1];
 g=[(T^2)/2,0;T,0;0,(T^2)/2;0,T];
 h=[1,0,0,0;0,0,1,0];
 q=[10000 0;0 10000];
 perr=[var^2,var^2/T,0,0;
       var^2/T,2*var^2/(T^2),0,0;
       0,0,var^2,var^2/T;
       0,0,var^2/T,2*var^2/(T^2)];
   vx=(zx(2)-zx(1))/2;
   vy=(zy(2)-zy(1))/2;
   xk=[zx(1);vx;zy(1);vy];
   %kalman滤波开始
 for n=3:N5;
   if(u<=40)  %非机动模型、赋初值
     if(low==0)
          [o,h,g,q,perr,xk]=lmode_initial(T,n,zx,zy,vkxs,vkys,perr2);
          z=2:2;
          high=0;
          low=1;
          ua=0;
     end
     z=[zx(n);zy(n)];
     xkl=o*xk;
     perr1=o*perr*o';
     k=perr1*h'*inv(h*perr1*h'+q);
     xk=xkl+k*(z-h*xkl);
     perr=(eye(4)-k*h)*perr1;
     xks(n)=xk(1,1);
     yks(n)=xk(3,1);
     vkxs(n)=xk(2,1);
     vkys(n)=xk(4,1);
     xkls(n)=xkl(1,1);
     ykls(n)=xkl(3,1);
     perr11(n)=perr(1,1);
     perr12(n)=perr(1,2);
     perr22(n)=perr(2,2);
    if(n>=20)
        v=z-h*xkl;
        w=h*perr*h'+q;
        p=v'*inv(w)*v;
        u=e*u+p;
        s(n-19)=u;
    end
elseif(u>40)  %启动机动检测
    if(high==0)
        [o,g,h,q,perr,xk]=hmode_initial(T,n,e,zx,zy,xkls,ykls,vkxs,vkys,perr11,perr12,perr22);
        high=1;
        low=0;
        for i=n-5:n-1
            z=[zx(i);zy(i)];
            xkl=o*xk;
            perr1=o*perr*o';
            k=perr1*h'*inv(h*perr1*h'+q);
            xk=xkl+k*(z-h*xkl);
            perr=(eye(6)-k*h)*perr1;
            xks(n)=xk(1,1);
            yks(n)=xk(3,1);
            vkxs(n)=xk(2,1);
            vkys(n)=xk(4,1);
            xkls(n)=xkl(1,1);
            ykls(n)=xkl(3,1);
        end
    end
    z=[zx(n);zy(n)];
    xkl=o*xk;
    perr1=o*perr*o';
    k=perr1*h'*inv(h*perr1*h'+q);
    xk=xkl+k*(z-h*xkl);
    perr=(eye(6)-k*h)*perr1;
    xks(n)=xk(1,1);
    yks(n)=xk(3,1);
    vkxs(n)=xk(2,1);
    vkys(n)=xk(4,1);
    xkls(n)=xkl(1,1);
    ykls(n)=xkl(3,1);
    ag=[xk(5,1);xk(6,1)];
    perr2=perr;
    ki=ki+1;
    pm=[perr(5,5) perr(5,6);perr(6,5) perr(6,6)];
    pa=ag'*inv(pm)*ag;
    sa(n)=pa;
    if(ki>5) %退出机动判断
        ul=sa(n-4)+sa(n-3)+sa(n-2)+sa(n-1)+sa(n);
        sb(n)=ul;
        if(ul<20)
            u=0;
        end
    end
end
     rex(m,n)=xks(n); %将滤波值存入数组
     rey(m,n)=yks(n);
 end
end
%计算滤波误差的均值以及标准差
ex=0;ey=0;
eqx=0;eqy=0;
ey1=0;
ex1=N5:1;ey1=N5:1;
qx=N5:1;qy=N5:1;
for i=1:N5
    for j=1:num
        ex=ex+x(i)-rex(j,i);
        ey=ey+y(i)-rey(j,i);
        eqx=eqx+(x(i)-rex(j,i))^2;
        eqy=eqy+(y(i)-rey(j,i))^2;
    end
    ex1(i)=ex/num;
    ey1(i)=ey/num;
    qx(i)=(eqx/num-(ex1(i)^2))^0.5;
    qy(i)=(eqy/num-(ey1(i)^2))^0.5;
    ex=0;ey=0;eqx=0;eqy=0;
end
%绘图
figure(1);
plot(x,y,'k-',zx,zy,'b:',xks,yks,'r-.');
legend('真实轨迹','观测样本','滤波数据');
figure(2);
plot(zx,zy,'b:');
legend('观测样本');
figure(3);
plot(xks,yks);
legend('滤波数据');
figure(4);
%subplot(2,1,1);
plot(ex1);
legend('x方向滤波误差均值');
%subplot(2,1,2);
figure(5);
plot(qx);
legend('x方向滤波误差标准差');

%********非机动模型初始化*******%
function[o,h,g,q,perr,xk]=lmode_initial(T,n,zx,zy,vkxs,vkys,perr2)  
o=4:4;
g=4:2;
h=2:4;
q=2:2;
xk=4:1;
perr=4:4;
o=[1,T,0,0;0,1,0,0;0,0,1,T;0,0,0,1];
h=[1 0 0 0;0 0 1 0];
g=[(T^2)/2,0;T,0;0,(T^2)/2;0,T];
xk=[zx(n-1);vkxs(n-1);zy(n-1);vkys(n-1)];
perr=perr2(1:4,1:4);

%*********机动模型初始化***********%
function[o,g,h,q,perr,xk]=hmode_initial(T,n,e,zx,zy,xkls,ykls,vkxs,vkys,perr11,perr12,perr22)
o=6:6;
g=6:2;
h=2:6;
q=2:2;
xk=6:1;
perr=6:6;
o=[1 T 0 0 0.5*T^2 0;0 1 0 0 T 0;0 0 1 T 0 0.5*T^2;0 0 0 1 0 T;0 0 0 0 1 0;0 0 0 0 0 1];
h=[1 0 0 0 0 0;0 0 1 0 0 0];
g=[T^2/4,0;T/2,0;0,T^2/4;0,T/2;1,0;0,1];
q=[10000 0;0 10000];
jsx=0.5*(zx(n-1/(1-e))-xkls(n-1/(1-e)));
jsy=0.5*(zy(n-1/(1-e))-ykls(n-1/(1-e)));
vx=vkxs(n-1/(1-e)-1)+2*jsx;
vy=vkys(n-1/(1-e)-1)+2*jsy;
xk=[zx(n-5);vx;zy(n-5);vy;jsx;jsy];
p111=10000;p112=10000;p115=5000;
p155=0.25*(10000+perr11(n-6)+4*perr12(n-6)+4*perr22(n-6));
p122=10000+perr11(n-6)+perr22(n-6)+2*perr12(n-6);
p125=5000+0.5*perr11(n-6)+perr22(n-6)+1.5*perr12(n-6);
perr=[p111 p112 0 0 p115 0;0 p122 0 0 p125 0;0 0 100 0 0 0;0 0 0 100 0 0;0 0 0 0 p155 0;0 0 0 0 0 100];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -