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

📄 kalmanfilter.m

📁 kalman滤波
💻 M
字号:
%VD arithmetic
clear;close all;clc;
T=2;       %雷达扫描周期   
number=1;     %滤波次数,可调
N1=400/T;N2=600/T;N3=610/T;N4=660/T;N5=900/T;    %扫描次数
N=900/T;
x=zeros(N5,1);    
y=zeros(N5,1);
vx=zeros(N5,1);       %x,y方向的速度
vy=zeros(N5,1); 
x(1)=2000;y(1)=10000;
vx(1)=0;vy(1)=-15;
ax=0;ay=0;      %x,y方向的加速度
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)+ax*T;
        vy(i+1)=vy(i)+ax*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)+ax*T;
        vy(i+1)=vy(i)+ay*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;     %x,y为真值
    y(i+1)=y(i)+vy(i)*T+0.5*ay*T^2;
end
a_x=0;a_y=0;     %x,y方向的加速度置0
n_x=100*randn(N,1);      %误差
n_y=100*randn(N,1); 
z_x=x+n_x;                %(z_x,z_y)为观测样本值=真值+噪声
z_y=y+n_y;       
%%%%%%%%%%%%%%%%%%%%%%%%滤波100次,滤波循环,实际为number=1 %%%%%%%%%%%%
for m=1:number
    xk_s(1)=z_x(1);    %赋初值
    yk_s(1)=z_y(1);
    xk_s(2)=z_x(2);
    yk_s(2)=z_y(2);
    xk1_s(1:2)=xk_s(1:2);      %(xk1_s,yk1_s)为预测值
    yk1_s(1:2)=yk_s(1:2); 
    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];   %标准矩阵I
    Ak=[1,T,0.5*T*T,0,0,0;0,1,T,0,0,0;0,0,1,0,0,0;0,0,0,1,T,0.5*T*T;0,0,0,0,1,T;0,0,0,0,0,1]; %状态转移矩阵       %状态变量之间的增益矩阵Ak
    Ck=[1 0 0 0 0 0;0 0 0 1 0 0];       %测量转移矩阵
    Rk=[10000 0;0 10000];       %测量噪声协方差矩阵
    Pk=[var^2  var^2/T 2*var^2/(T^2) 0  0  0      %初始误差矩阵设置
       var^2/T  2*var^2/(T^2) 0 0 0 var^2
       2*var^2/(T^2) 0  0  0  var^2  var^2/T
       0  0  0 var^2 var^2/T  2*var^2/(T^2)
       0  0  var^2 var^2/T  2*var^2/(T^2) 0
       0  var^2 var^2/T  2*var^2/(T^2) 0 0];   %噪声均方误差的协方差阵
%     v_x=(z_x(2)-z_x(1))/T;       %x,y方向初始速度   
%     v_y=(z_y(2)-z_y(1))/T;
%     xk=[z_x(1);v_x;a_x;z_y(1);v_y;a_y];     %将距离和速度做为估计量,可加加速度形成6矢量(状态方程)
%%%%%%%%%%%%%%%%%%%%%%%%Kalman滤波开始,估计循环 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    a_x=0;a_y=0;     %x,y方向的加速度置0
    v_x=(z_x(2)-z_x(1))/T;       %x,y方向初始速度   
    v_y=(z_y(2)-z_y(1))/T;
    xk=[z_x(1);v_x;a_x;z_y(1);v_y;a_y];     %将距离和速度做为估计量,可加加速度形成6矢量(状态方程)
    for r=3:N1-1
        xk1=Ak*xk;          %预测值
        yk=[z_x(r);z_y(r)];     %(z_x,z_y)为测量值(测量方程)
        Pk1=Ak*Pk*Ak';    %(未考虑状态噪声)k时刻滤波的均方误差矩阵
        Hk=Pk1*Ck'*inv(Ck*Pk1*Ck'+Rk);   %增益方程,Hk为增益矩阵,inv矩阵求反函数
        xk=xk1+Hk*(yk-Ck*xk1);       %递推公式
        Pk=(I-Hk*Ck)*Pk1;   %滤波后的均方误差矩阵
        xk_s(r)=xk(1,1);      %(xk_s,yk_s)为估计值
        yk_s(r)=xk(4,1);  
        xk1_s(r)=xk1(1,1);      %(xk1_s,yk1_s)为预测值
        yk1_s(r)=xk1(4,1); 
        temp_x(m,r)=xk_s(r);      % m为循环次数,估计值
        temp_y(m,r)=yk_s(r);  
        temp1_x(m,r)=xk1_s(r);      % m为循环次数,预测值
        temp1_y(m,r)=yk1_s(r);      
    end
    a_x=0.075;a_y=0.075;     %x,y方向的加速度置0
    v_x=(xk_s(N1-1)-xk_s(N1-2))/T;       %x,y方向初始速度   
    v_y=(yk_s(N1-1)-yk_s(N1-2))/T;
    xk=[z_x(N1-1);v_x;a_x;z_y(N1-1);v_y;a_y];     %将距离和速度做为估计量,可加加速度形成6矢量(状态方程)
    for r=N1:N2-1
        xk1=Ak*xk;          %预测值
        yk=[z_x(r);z_y(r)];     %(z_x,z_y)为测量值(测量方程)
        Pk1=Ak*Pk*Ak';    %(未考虑状态噪声)k时刻滤波的均方误差矩阵
        Hk=Pk1*Ck'*inv(Ck*Pk1*Ck'+Rk);   %增益方程,Hk为增益矩阵,inv矩阵求反函数
        xk=xk1+Hk*(yk-Ck*xk1);       %递推公式
        Pk=(I-Hk*Ck)*Pk1;   %滤波后的均方误差矩阵
        xk_s(r)=xk(1,1);      %(xk_s,yk_s)为估计值
        yk_s(r)=xk(4,1);  
        xk1_s(r)=xk1(1,1);      %(xk1_s,yk1_s)为预测值
        yk1_s(r)=xk1(4,1); 
        temp_x(m,r)=xk_s(r);      % m为循环次数,估计值
        temp_y(m,r)=yk_s(r);  
        temp1_x(m,r)=xk1_s(r);      % m为循环次数,预测值
        temp1_y(m,r)=yk1_s(r);      
    end
    a_x=0;a_y=0;     %x,y方向的加速度置0
    v_x=(xk_s(N2-1)-xk_s(N2-2))/T;       %x,y方向初始速度   
    v_y=(yk_s(N2-1)-yk_s(N2-2))/T;
    xk=[z_x(N2-1);v_x;a_x;z_y(N2-1);v_y;a_y];     %将距离和速度做为估计量,可加加速度形成6矢量(状态方程)
    for r=N2:N3-1
        xk1=Ak*xk;          %预测值
        yk=[z_x(r);z_y(r)];     %(z_x,z_y)为测量值(测量方程)
        Pk1=Ak*Pk*Ak';    %(未考虑状态噪声)k时刻滤波的均方误差矩阵
        Hk=Pk1*Ck'*inv(Ck*Pk1*Ck'+Rk);   %增益方程,Hk为增益矩阵,inv矩阵求反函数
        xk=xk1+Hk*(yk-Ck*xk1);       %递推公式
        Pk=(I-Hk*Ck)*Pk1;   %滤波后的均方误差矩阵
        xk_s(r)=xk(1,1);      %(xk_s,yk_s)为估计值
        yk_s(r)=xk(4,1);  
        xk1_s(r)=xk1(1,1);      %(xk1_s,yk1_s)为预测值
        yk1_s(r)=xk1(4,1); 
        temp_x(m,r)=xk_s(r);      % m为循环次数,估计值
        temp_y(m,r)=yk_s(r);  
        temp1_x(m,r)=xk1_s(r);      % m为循环次数,预测值
        temp1_y(m,r)=yk1_s(r);      
    end
    a_x=-0.3;a_y=-0.3;     %x,y方向的加速度置0
    v_x=(xk_s(N3-1)-xk_s(N3-2))/T;       %x,y方向初始速度   
    v_y=(yk_s(N3-1)-yk_s(N3-2))/T;
    xk=[z_x(N3-1);v_x;a_x;z_y(N3-1);v_y;a_y];     %将距离和速度做为估计量,可加加速度形成6矢量(状态方程)
    for r=N3:N4-1
        xk1=Ak*xk;          %预测值
        yk=[z_x(r);z_y(r)];     %(z_x,z_y)为测量值(测量方程)
        Pk1=Ak*Pk*Ak';    %(未考虑状态噪声)k时刻滤波的均方误差矩阵
        Hk=Pk1*Ck'*inv(Ck*Pk1*Ck'+Rk);   %增益方程,Hk为增益矩阵,inv矩阵求反函数
        xk=xk1+Hk*(yk-Ck*xk1);       %递推公式
        Pk=(I-Hk*Ck)*Pk1;   %滤波后的均方误差矩阵
        xk_s(r)=xk(1,1);      %(xk_s,yk_s)为估计值
        yk_s(r)=xk(4,1);  
        xk1_s(r)=xk1(1,1);      %(xk1_s,yk1_s)为预测值
        yk1_s(r)=xk1(4,1); 
        temp_x(m,r)=xk_s(r);      % m为循环次数,估计值
        temp_y(m,r)=yk_s(r);  
        temp1_x(m,r)=xk1_s(r);      % m为循环次数,预测值
        temp1_y(m,r)=yk1_s(r);      
    end
    a_x=0;a_y=0;     %x,y方向的加速度置0
    v_x=(xk_s(N4-1)-xk_s(N4-2))/T;       %x,y方向初始速度   
    v_y=(yk_s(N4-1)-yk_s(N4-2))/T;
    xk=[z_x(N4-1);v_x;a_x;z_y(N4-1);v_y;a_y];     %将距离和速度做为估计量,可加加速度形成6矢量(状态方程)
    for r=N4:N5
        xk1=Ak*xk;          %预测值
        yk=[z_x(r);z_y(r)];     %(z_x,z_y)为测量值(测量方程)
        Pk1=Ak*Pk*Ak';    %(未考虑状态噪声)k时刻滤波的均方误差矩阵
        Hk=Pk1*Ck'*inv(Ck*Pk1*Ck'+Rk);   %增益方程,Hk为增益矩阵,inv矩阵求反函数
        xk=xk1+Hk*(yk-Ck*xk1);       %递推公式
        Pk=(I-Hk*Ck)*Pk1;   %滤波后的均方误差矩阵
        xk_s(r)=xk(1,1);      %(xk_s,yk_s)为估计值
        yk_s(r)=xk(4,1);  
        xk1_s(r)=xk1(1,1);      %(xk1_s,yk1_s)为预测值
        yk1_s(r)=xk1(4,1); 
        temp_x(m,r)=xk_s(r);      % m为循环次数,估计值
        temp_y(m,r)=yk_s(r);  
        temp1_x(m,r)=xk1_s(r);      % m为循环次数,预测值
        temp1_y(m,r)=yk1_s(r);      
    end
end
e_x=0;      %x方向的误差
e_y=0;      %y方向的误差
e1_x=0;  e1_y=0;
e2_x=0;  e2_y=0;
%计算滤波的均值,计算滤波误差的均值
for i=1:N
    for j=1:number
        e_x=e_x+x(i)-temp_x(j,i);    %每次循环的误差相加
        e_y=e_y+y(i)-temp_y(j,i);  %误差=真实值-滤波估计值
        e1_x=e_x+x(i)-temp1_x(j,i);    %每次循环的误差相加
        e1_y=e_y+y(i)-temp1_y(j,i);  %误差=真实值-滤波估计值
        e2_x=e2_x+x(i)-z_x(i);      %x方向测量值误差
        e2_y=e2_y+y(i)-z_y(i);      %y方向测量值误差
    end
    e_x1(i)=e_x/number;     %平均误差
    e_y1(i)=e_y/number;     %位置估计误差均值
    e1_x1(i)=e1_x/number;     %平均误差
    e1_y1(i)=e1_y/number;     %位置估计误差均值
    e2_x1(i)=e2_x/number;     %x方向测量值平均误差
    e2_y1(i)=e2_y/number;     %y方向测量值误差均值
    e_x=0; e_y=0;
    e1_x=0; e1_y=0;
    e2_x=0;  e2_y=0;
end
%%%%%%%%%%%%%%%%%%%%%%%作图
figure(1);
plot(x,y,'k-',z_x,z_y,'g:',xk_s,yk_s,'b-',xk1_s,yk1_s,'r--');
legend('真实轨迹','观测样本','估计轨迹','预测轨迹',1);
xlabel('x');ylabel('y');
figure(2);
plot(1:N,e2_x1,'g:',1:N,e_x1,'r-',1:N,e1_x1,'b--');          
legend('x方向测量平均误差','x方向估计值平均误差','x方向预测值平均误差',1);
xlabel('N');ylabel('x');
figure(3);
plot(1:N,e2_y1,'g:',1:N,e_y1,'r-',1:N,e1_y1,'b--');   
legend('y方向测量平均误差','y方向估计值平均误差','y方向预测值平均误差');
xlabel('N');ylabel('y');
figure(4);
plot(1:N,x,'k-',1:N,z_x,'g:',1:N,xk_s,'b-',1:N,xk1_s,'r--');
legend('真实轨迹','观测样本','估计轨迹','预测轨迹',2);
xlabel('t');ylabel('x');
figure(5);
plot(1:N,y,'k-',1:N,z_y,'g:',1:N,yk_s,'b-',1:N,yk1_s,'r--');
legend('真实轨迹','观测样本','估计轨迹','预测轨迹',1);
xlabel('t');ylabel('y');

⌨️ 快捷键说明

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