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

📄 fusion.m

📁 基于kalman滤波的信息融合程序
💻 M
字号:
%(导入GPS526)
% get longitude input(提取经度)
for i=1:558
 lon(i)=GPS526(i,3);
end	

%get latitude input(提取纬度)
for i=1:558
 lat(i)=GPS526(i,2);
end

%get speed input(提取速度)
for i=1:558
 speed(i)=GPS526(i,5);
end

%get angular velocity input(提取角度)
for i=1:558
 wgps(i)=mod(90-GPS526(i,6),360);
end

%for i=1:558
% sat(i)=GPS526(i,7);
%end

%(导入INS526)
%get accelerated speed ax (提取加速度ax)
for i=1:47992
 a(i)=INS526 (i,2);
end	

%get angular velocity input wz(提取角速度wz)
for i=1:47992
 w(i)=INS526 (i,1);
end

%get time interval Δt((提取时间间隔Δt)
for i=1:47992
 t(i)=INS526 (i,3);
end

%get time tip((提取时间标号)
for i=1:47992
 sag(i)=INS526 (i,4);
end

%coordinate conversion for gps data (gps坐标转换 BL to XY)
c0=111134.0047;
c1=32009.8185306;
c2=133.9598897;
c3=0.6975483;
c4=0.0039431;
a1=6378137;
b=6356752.3141586055;
e=sqrt(a1*a1-b*b)/a1;
ee2=(a1*a1-b*b)/(b*b);
for i=1:558
 tlat=lat(i)*pi/180;
 tlon=(lon(i)- 115.756)*pi/180;    %中央子午线经度115.756
 s=sin(tlat);
 c=cos(tlat);
x0=c0*tlat*180/pi -c*(c1*s+c2*(s^3)+c3*(s^5)+ c4*(s^7));
t0=tan(tlat);
N=a1/(sqrt(1-(e^2)*( s^2)));
ita2=(c^2)*ee2;

xgps(i)=x0+0.5*N*t0*(c^2)*(tlon^2)+(5-t0*t0+9*ita2+4*ita2*ita2)*N*t0*(c^4)*(tlon^4)/24+(61-58*t0*t0+t0^4+270*ita2-330*ita2*t0*t0)*N*t0*(c^6)*(tlon^6)/720;
ygps(i)=N*c*tlon+(1-t0^2+ita2)*N*(c^3)*(tlon^3)/6+(5-18*t0*t0+t0^4+14*ita2*t0*t0)*N*(c^5)*(tlon^5)/120;
end

%设置gps-ins滤波器参数%
T=1;      %设置gps采样周期
c1=1;
a1=3;
a2=3;
a3=200;
a4=100;

b1=100;
b2=100;
b3=2;
b4=2;

Rx=b1^2;
Ry=b2^2;
Rv=b3^2;
Rj=b4^2;

R=[Rx 0 0 0
   0 Ry 0 0
   0 0 Rv 0
   0 0 0 Rj];
Qx=[T^5/20 T^4/8 T^3/6
   T^4/8 T^3/3 T^2/2
   T^3/6 T^2/2 T]*2*a1^2/c1;
Qy=[T^5/20 T^4/8 T^3/6
   T^4/8 T^3/3 T^2/2
   T^3/6 T^2/2 T]*2*a2^2/c1;
Qv=[T^5/20 T^4/8 T^3/6
   T^4/8 T^3/3 T^2/2
   T^3/6 T^2/2 T]*2*a3^2/c1;
Qj=[T^5/20 T^4/8 T^3/6
   T^4/8 T^3/3 T^2/2
   T^3/6 T^2/2 T]*2*a4^2/c1;
tA1=[1 T T^2/2
     0 1 T
     0 0 1];
tA=[1 T c1^2*(T/c1-1+exp(-T/c1))
    0 1 c1*(1-exp(-T/c1))
    0 0 exp(-T/c1)];
Q=[Qx zeros(3,3) zeros(3,3) zeros(3,3)
    zeros(3,3) Qy zeros(3,3)  zeros(3,3)
    zeros(3,3) zeros(3,3) Qv  zeros(3,3)
    zeros(3,3) zeros(3,3) zeros(3,3) Qj];
A=[tA zeros(3,3) zeros(3,3) zeros(3,3) 
    zeros(3,3) tA zeros(3,3) zeros(3,3) 
    zeros(3,3) zeros(3,3) tA zeros(3,3)
    zeros(3,3) zeros(3,3) zeros(3,3) tA];
A1=[tA1 zeros(3,3) zeros(3,3) zeros(3,3)
    zeros(3,3) tA1 zeros(3,3) zeros(3,3)
    zeros(3,3) zeros(3,3) tA1 zeros(3,3)
    zeros(3,3) zeros(3,3) zeros(3,3) tA1];
H=[1 0 0 0 0 0 0 0 0 0 0 0
   0 0 0 1 0 0 0 0 0 0 0 0
   0 0 0 0 0 0 1 0 0 0 0 0
   0 0 0 0 0 0 0 0 0 1 0 0]; 

%initialization(初始化)
v=zeros(47992,1);
ang=zeros(47992,1);
d=zeros(47992,1);  
xins=zeros(47992,1);
yins=zeros(47992,1);


v(1)=speed(1);                  %ins初始速度校准
yins(1)= ygps(1);               %ins初始位置校准
xins(1)= xgps(1);
ang(1)=mod(90-wgps(1),360);     %ins初始角度对准    

z=1;                            %gps初始点
cor=5;                          %ins对准标志位
P0=Q;
X0=[0 0 0 0 0 0 0 0 0 0 0 0]';
mil(1)=0;

%fusion and navigation(融合与导航)
for i=2:47992
 %speed
 v(i)=v(i-1)+a(i-1)*t(i)+0.5*(a(i)-a(i-1))*t(i);
 %angle
 ang(i)=mod(ang(i-1)-w(i-1)*t(i),360);
 
 D=(v(i)-a(i-1)*t(i))*t(i)+0.5*a(i-1)*t(i)*t(i);
 XX= xins(i-1)+D*cos(ang(i)*pi/180);
 YY= yins(i-1)+D*sin(ang(i)*pi/180);  
 
 
 if sag(i)==cor               %ins与gps的对准提取,以标志位为准,保证两种数据的一致
    %if lat(z)~=0 & lon(z)~=0    %当gps失效时不进行融合
     ex=xgps(z)-XX;      %东向位置,北向位置,速度,角度量测误差值
     ey=ygps(z)-YY; 
     ev=speed(z)-v(i);
     ej=mod(90-wgps(z),360)-ang(i);
     Z=[ex;ey;ev;ej];         %量测矢量
     %angerror(z)=ej;
     %angerror(z)=ev;
    
    %计算滤波
     K=P0*H'*(inv(H*P0*H'+R));
     
     X=X0+K*(Z-H*X0);
     P=(eye(12)-K*H)*P0;

    errorx(z)=X(1);
    errory(z)=X(4);

     
    %状态量修正
    % if sat(z)>3
       v(i)=v(i)+X(7);          %速度状态量修正,考虑卫星数改变权值
       %else
       %v(i)=(v(i)+X(7))*0.8+v(i)*0.2;
    % end
     ang(i)=ang(i)+X(10);

    
    %一步预测值
     X0=A1*X;
     P0=A*P*A'+Q;
        
 %distance interval(此处的d(i)是距离的间隔,不是距离)
 d(i)=(v(i)-a(i-1)*t(i))*t(i)+0.5*a(i-1)*t(i)*t(i);
 
 %mileage acc(里程)
 mil(i)=d(i)+mil(i-1);
 
 %position calculation
 xins(i)= xins(i-1)+d(i)*cos(ang(i)*pi/180);
 yins(i)= yins(i-1)+d(i)*sin(ang(i)*pi/180);  
 
     xins(i)=xins(i)+X(1);
     yins(i)=yins(i)+X(4);
   
  %对准标志位修正
  z=z+1;
  cor=cor+1;
  
else
   
 %distance interval(此处的d(i)是距离的间隔,不是距离)
 d(i)=(v(i)-a(i-1)*t(i))*t(i)+0.5*a(i-1)*t(i)*t(i);
 
 %mileage acc(里程)
 mil(i)=d(i)+mil(i-1);
 
 %position calculation
 xins(i)= xins(i-1)+d(i)*cos(ang(i)*pi/180);
 yins(i)= yins(i-1)+d(i)*sin(ang(i)*pi/180);  
end
end

%drawing(作图)
plot(yins-4.93e4,xins-4.4239e6,'r.');
grid;
title('普通卡尔曼信息融合结果');
xlabel('高斯投影坐标X(单位:米)');
ylabel('高斯投影坐标Y(单位:米)');

hold on;

for i=1:558
 if lat(i)~=0
  if lon(i)~=0
   plot( ygps(i)-4.93e4, xgps(i)-4.4239e6,'bo');
   hold on;
  end
 end
end

legend( '信息融合结果','GPS单独导航结果',1);

⌨️ 快捷键说明

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