test_align_kalman.m
上传用户:skyjin520
上传日期:2016-12-06
资源大小:20k
文件大小:2k
源码类别:

交通/航空行业

开发平台:

Matlab

  1. clear
  2. close
  3. glvs
  4. Ts = 0.1;
  5. att = [0; 0; 30]*glv.deg;   qnb0 = a2qnb(att);   % 姿态真值
  6. phi = [10; 10; 60]*glv.min;  qnb = qaddphi(qnb0, phi); % 加入姿态误差
  7. Lat = 34*glv.deg;
  8. wnie = glv.wie*[0; cos(Lat); sin(Lat)];
  9. wbib = qmulv(qconj(qnb0),wnie);
  10. gn = [0; 0; -glv.g0];
  11. fb = qmulv(qconj(qnb0),-gn);
  12. eb = [0.01; 0.01; 0.01]*glv.dph; web =  [0.001; 0.001; 0.001]*glv.dph; % 陀螺误差
  13. db =  [100; 100; 100]*glv.ug;  wdb =  [10; 10; 10]*glv.ug; % 加速度计误差
  14. % 滤波器参数,参见《捷联惯导系统静基座初始对准精度分析及仿真》
  15. Qt = diag([web; 0;0])^2;
  16. Rk = diag([wdb(1);wdb(2)])^2;
  17. xk = zeros(5,1);
  18. Pk = diag([[1;1;10]*glv.deg; [1;1]*glv.dph])^2;
  19. Phi = [ 0 wnie(3) -wnie(2)   0 0 
  20.       -wnie(3) 0 0    -1 0 
  21.       wnie(2) 0 0     0 -1 
  22.       zeros(2,5) ];
  23. Phikk_1 = eye(5)+Phi*Ts;
  24. Hk = [ 0 -glv.g0  0 0 0
  25.       glv.g0 0   0 0 0 ];
  26.  
  27. t = 300;  % 总时间长度
  28. len = fix(t/Ts); res=zeros(len,3);
  29. feedback=0.05;  % 反馈系数
  30. s = 1.001; % 遗忘因子
  31. for k=1:1:len
  32.     wbe = wbib+eb+web.*randn(3,1);
  33.     fbe = fb+db+wdb.*randn(3,1);
  34.     qnb = qmul(qnb, rv2q( (wbe-qmulv(qconj(qnb),wnie))*Ts ));  % 姿态更新
  35.     fn = qmulv(qnb, fbe);  
  36.     zk = fn(1:2);  % 以水平比力为观测量
  37.     [xk, Pk, Kk] = kalman(Phikk_1, Qt*Ts, xk, Pk, Hk, Rk, zk);
  38. %     if k*Ts>50 
  39. %         feedback=0.01;
  40. %     else
  41. %         feedback=0;
  42. %     end
  43. %     qnb = qdelphi(qnb, feedback*xk(1:3,1));  xk(1:3,1) = (1-feedback)*xk(1:3,1); % 反馈
  44. %     Pk = Pk*s;  % 遗忘滤波
  45.     res(k,:) = [xk(1:3)-qq2phi(qnb,qnb0)]';  % 滤波估计值 - 计算平台误差
  46. end
  47. time = [1:length(res)]*Ts;
  48. figure;
  49. subplot(3,1,1); plot(time,res(:,1)/glv.min); ylabel('itdeltaphi_Erm / arcmin'); grid on
  50. subplot(3,1,2); plot(time,res(:,2)/glv.min); ylabel('itdeltaphi_Nrm / arcmin'); grid on
  51. subplot(3,1,3); plot(time,res(:,3)/glv.min); ylabel('itdeltaphi_Urm / arcmin'); grid on
  52. xlabel('itt rm / s');