GPSDRzuhe.m
上传用户:wyp_nj
上传日期:2022-05-03
资源大小:484k
文件大小:4k
源码类别:

GPS编程

开发平台:

Visual C++

  1. %GPSDRzuhe.m   <Kalman滤波理论及其在导航系统中的应用>
  2. clear all;
  3. clc;
  4. format long ;
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%555
  6. %采集数据
  7. Re=6367650; 
  8. g=9.81;               %重力加速度
  9. dt=0.02;              %采样时间0.02秒 
  10. lon0=116.06666667/180*pi;
  11. lat0=39.15/180*pi;
  12. %yaw=168.8/180*pi;    %磁罗盘量测得到航向角初始值,有误差
  13. gps=load('E:hejKalmangps.txt');%6000组数据
  14. dr=load('E:hejKalmandr.txt');
  15.     dy=dr(1,1)/180*pi;%将角度转化成弧度
  16.     yaw=dy*dt;   %航向角递增
  17.     ax=dr(1,2)*g;
  18.     ay=dr(1,3)*g;
  19.     aeDR=ax*sin(yaw)+ay*cos(yaw);%东向加速度递增
  20.     anDR=ax*cos(yaw)-ay*sin(yaw);%北向加速度递增
  21.     veDR=aeDR*dt; %东向速度递增
  22.     vnDR=anDR*dt; %北向速度递增
  23.     eDR=veDR*dt;  %东向位置递增
  24.     nDR=vnDR*dt;  %北向位置递增
  25. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  26. %模型 卡尔曼滤波方程
  27. %状态变量为东向位置,北向位置,东向速度,北向速度,东向加速度,北向加速度
  28. time=74;
  29. detT=10;
  30. t_ae=0.1;           
  31. t_an=0.1;
  32. x=[eDR nDR veDR vnDR aeDR anDR]';%给定初始值
  33. P=diag([0.1 0.1 0.1^2 0.1^2 0.01^2 0.01^2]);%给定初始值
  34. Q=diag([10 10 1 1 0.1 0.1]);
  35. R=diag([10 10 1]);
  36. eDR=0;nDR=0;veDR=0;vnDR=0;aeDR=0;anDR=0;yaw=0;
  37. for i=1:6000
  38.     dy=dr(i,1)/180*pi;%将角度转化成弧度
  39.     ax=dr(i,2)*g;
  40.     ay=dr(i,3)*g;
  41.     yaw=yaw+dy*dt;   %航向角递增
  42.     aeDR=ax*sin(yaw)+ay*cos(yaw);%东向加速度递增
  43.     anDR=ax*cos(yaw)-ay*sin(yaw);%北向加速度递增
  44.     veDR=veDR+aeDR*dt; %东向速度递增
  45.     vnDR=vnDR+anDR*dt; %北向速度递增
  46.     eDR=eDR+veDR*dt;   %东向位置递增
  47.     nDR=nDR+vnDR*dt;   %北向位置递增
  48.     
  49.     lon=gps(i,1)/180*pi;
  50.     lat=gps(i,2)/180*pi;
  51.     veGPS=gps(i,3);
  52.     vnGPS=gps(i,4);
  53.     eGPS=(lon-lon0)*Re*cos(lat);
  54.     nGPS=(lat-lat0)*Re;
  55.    
  56. A=[0 0 1 0 0 0; 
  57.     0 0 0 1 0 0;
  58.     0 0 0 0 1 0;
  59.     0 0 0 0 0 1;
  60.     0 0 0 0 -t_ae 0;
  61.     0 0 0 0 0 -t_an];
  62. F=eye(6)+detT*A+detT*detT*A*A/2;
  63.   Z_k(1)=eGPS; %GPS观测量e,n
  64.   Z_k(2)=nGPS;
  65.   Z_k(3)=dy; %DR观测量角度
  66.   %Z_k(4)=s; %里程计在一个采样周期的距离
  67.   %Z_k=[Z_k(1) Z_k(2) Z_k(3) Z_k(4)]'; 
  68.   Z_k=[Z_k(1) Z_k(2) Z_k(3)]';
  69.    x_1=F*x;
  70.    P_1= F*P*F' + Q;
  71.      
  72.    e_ep=x_1(1);
  73.    n_ep=x_1(2);
  74.    v_ep=x_1(3);
  75.    v_np=x_1(4);
  76.    a_ep=x_1(5);
  77.    a_np=x_1(6);
  78.    
  79.    h33=(a_np*v_ep^2-2*v_ep*v_np*a_ep-a_np*v_np^2)/(v_ep^2+v_np^2)^2;
  80.    h34=(a_ep*v_ep^2+2*v_ep*v_np*a_np-a_ep*v_np^2)/(v_ep^2+v_np^2)^2;
  81.    h35=v_np/(v_ep^2+v_np^2);
  82.    h36=-v_ep/(v_ep^2+v_np^2);
  83.    %h43=dt*v_ep/(v_ep^2+v_np^2)^0.5;
  84.    %h44=dt*v_np/(v_ep^2+v_np^2)^0.5;
  85.    
  86.    H=[1 0 0 0 0 0;
  87.        0 1 0 0 0 0;
  88.        0 0 h33 h34 h35 h36];
  89.    %   0 0 h43 h44 0 0];%DR的观测方程
  90.     
  91.    K = P_1*H'*inv(H*P_1*H'+R);
  92. %h2_xPre是观测方程的离散化形式,其中使用的速度、加速度都是一步预测计算值
  93.     %ATAN(X) is the arctangent of the elements of X
  94.    h_xPre=[e_ep;n_ep;
  95.            dt*(v_np*a_ep-v_ep*a_np)/(v_ep^2+v_np^2)];% dt*(v_ep^2+v_np^2)^0.5];
  96.    x = x_1 + K*(Z_k-h_xPre);
  97.    P= (eye(6)-K*H)*P_1;     
  98.    
  99.   edr(i)=eDR;ndr(i)=nDR;vedr(i)=veDR;vndr(i)=vnDR;
  100.   egps(i)=eGPS;ngps(i)=nGPS;vegps(i)=veGPS;vngps(i)=vnGPS;
  101.   eekf(i)=x(1);  nekf(i)=x(2);  veekf(i)=x(3);  vnekf(i)=x(4);
  102.   y(i)=yaw*180/pi;
  103. end
  104. i=i/50;     
  105. j=0.02:0.02:i;      
  106. figure
  107. plot(j,edr,'b',j,egps,'r',j,eekf,'y'),xlabel('/t'),ylabel('东向位置');
  108. legend('edr','egps','eKalman');
  109. figure 
  110. plot(j,ndr,'b',j,ngps,'r',j,nekf,'y');,xlabel('/t'),ylabel('北向位置');
  111. legend('ndr','ngps','nKalman');
  112. figure 
  113. plot(j,vedr,'b',j,vegps,'r',j,veekf,'y');,xlabel('/t'),ylabel('东向速度');
  114. legend('vedr','vegps','veKalman');
  115. figure 
  116. plot(j,vndr,'b',j,vngps,'r',j,vnekf,'y');,xlabel('/t'),ylabel('北向速度');
  117. legend('vndr','vngps','vnKalman');
  118. figure 
  119. plot(j,y,'b'),xlabel('/t'),ylabel('航向角');