找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5754|回复: 2
打印 上一主题 下一主题
收起左侧

GPS和INS联合导航matlab程序(带数据有用的)

[复制链接]
跳转到指定楼层
楼主
本压缩文件是组合导航常用的算法
组合导航,带有数据,可以直接用

全部资料51hei下载地址:
GPS和INS联合导航matlab程序(带数据有用的).zip (620.09 KB, 下载次数: 98)


  1. %GPS/INS无反馈位置组合 卡尔曼滤波器

  2. %%%%%%%%%%%%%%%%%%
  3. %edit by horsejun
  4. %%%%%%%%%%%%%%%%%%

  5. %每秒更新一次速度位置误差
  6. %连续状态系统方程
  7. %dx = F*x + G*w
  8. %z = H*x + v
  9. %离散状态系统方程
  10. %x(k+1) = A*x(k) + B*w(k)
  11. %z(k+1) = C*x(k+1) + v(k+1)

  12. function [E_attitude, E_velocity, E_position, PP] = kalman_GPS_INS_position_sp_NFb(Dp, v, p, quat, Fn, Q, R, Tg, Ta, tao)

  13. %输入
  14. %Dp     量测位置误差, 作为滤波器输入,
  15. %Dv     量测速度误差, 作为滤波器输入,
  16. %p      ins输出位置,作为滤波器系统参数
  17. %v      ins输出速度,作为滤波器系统参数
  18. %fn     ins输出导航系下比力,作为滤波器参数
  19. %quat   ins输出四元数,作为滤波器参数
  20. %Q      系统噪声方差
  21. %R      测量噪声方差
  22. %Ta     加表误差漂移相关时间
  23. %Tg     陀螺仪误差漂移相关时间
  24. %tao    迭代步长
  25. %%%%%%%输入向量均为行向量%%%%%%%%%%%%%

  26. %输出
  27. %E_position     位置预测值
  28. %E-velocity     速度预测值

  29. %各参数初始化
  30. Re                 = 6378245;   %地球长半径
  31. e                 = 1/298.257;  %地球扁率
  32. wie         = 7.292e-5;  %地球自转角速度

  33. %   东北天速度
  34. Ve0   = v(:,1);
  35. Vn0   = v(:,2);
  36. Vu0   = v(:,3);
  37. %   导航位置
  38. L0    = p(:,1);
  39. h0    = p(:,3);

  40. %卡尔曼滤波参数初始化
  41. PP(1:18,1:18) = diag([1/(36*57) 1/(36*57) 1/57, 0.0001 0.0001 0.0001, 0 0 1, 0.1/(57*3600) 0.1/(57*3600) 0.1/(57*3600), 0.04/(57*3600) 0.04/(57*3600) 0.04/(57*3600), 1e-4 1e-4 1e-4].^2);   %初始误差协方差阵
  42. PP0                                         = PP;
  43. X                                                 = zeros(18,1);  %初始状态
  44. E_attitude                 = zeros(1,3);
  45. E_position                 = zeros(1,3);
  46. E_velocity                 = zeros(1,3);

  47. n = size(Dp,1);
  48. for i=1:n-1
  49.     %参数赋值
  50.     Ve                 = Ve0(i);
  51.     Vn                 = Vn0(i);
  52.     Vu                 = Vu0(i);
  53.     L                 = L0(i);
  54.     h                 = h0(i);
  55.     fe                 = Fn(i,1);
  56.     fn                 = Fn(i,2);
  57.     fu                 = Fn(i,3);
  58.     Rm                 = Re*(1-2*e+3*e*sin(L)^2);
  59.     Rn                 = Re*(1-e*sin(L)^2);
  60.     %由四元数计算姿态阵
  61.     q                 = quat(i,:);
  62.     Cnb         = [1-2*(q(3)^2+q(4)^2),     2*(q(2)*q(3)-q(1)*q(4)), 2*(q(2)*q(4)+q(1)*q(3));
  63.                     2*(q(2)*q(3)+q(1)*q(4)), 1-2*(q(2)^2+q(4)^2),     2*(q(3)*q(4)-q(1)*q(2));
  64.              2*(q(2)*q(4)-q(1)*q(3)), 2*(q(3)*q(4)+q(1)*q(2)), 1-2*(q(2)^2+q(3)^2)];

  65.     %连续系统状态转换阵 F 的时间更新
  66.     F            = zeros(18,18);
  67.     F(1,2)       = wie*sin(L)+Ve*tan(L)/(Rn+h);
  68.     F(1,3)       = -(wie*cos(L)+Ve/(Rn+h));
  69.     F(1,5)       = -1/(Rm+h);
  70.     F(1,9)       = Vn/(Rm+h)^2;
  71.     F(2,1)       = -(wie*sin(L)+Ve*tan(L)/(Rn+h));
  72.     F(2,3)       = -Vn/(Rm+h);
  73.     F(2,4)       = 1/(Rn+h);
  74.     F(2,7)       = -wie*sin(L);
  75.     F(2,9)       = -Ve/(Rn+h)^2;
  76.     F(3,1)       = wie*cos(L)+Ve/(Rn+h);
  77.     F(3,2)       = Vn/(Rm+h);
  78.     F(3,4)       = tan(L)/(Rn+h);
  79.     F(3,7)       = wie*cos(L)+Ve*(sec(L)^2)/(Rn+h);
  80.     F(3,9)       = -Ve*tan(L)/(Rn+h)^2;
  81.     F(4,2)       = -fu;
  82.     F(4,3)       = fn;
  83.     F(4,4)       = Vn*tan(L)/(Rm+h)-Vu/(Rm+h);
  84.     F(4,5)       = 2*wie*sin(L)+Ve*tan(L)/(Rn+h);
  85.     F(4,6)       = -(2*wie*cos(L)+Ve/(Rn+h));
  86.     F(4,7)       = 2*wie*cos(L)*Vn+Ve*Vn*sec(L)^2/(Rn+h)+2*wie*sin(L)*Vu;
  87.     F(4,9)       = (Ve*Vu-Ve*Vn*tan(L))/(Rn+h)^2;
  88.     F(5,1)       = fu;
  89.     F(5,3)       = -fe;
  90.     F(5,4)       = -2*(wie*sin(L)+Ve*tan(L)/(Rn+h));
  91.     F(5,5)       = -Vu/(Rm+h);
  92.     F(5,6)       = -Vn/(Rm+h);
  93.     F(5,7)       = -(2*wie*cos(L)+Ve*(sec(L)^2)/(Rn+h))*Ve;
  94.     F(5,9)       = (Ve^2*tan(L)+Vn*Vu)/(Rn+h)^2;
  95.     F(6,1)       = -fn;
  96.     F(6,2)       = fe;
  97.     F(6,4)       = 2*(wie*cos(L)+Ve/(Rn+h));
  98.     F(6,5)       = 2*Vn/(Rm+h);
  99.     F(6,7)       = -2*Ve*wie*sin(L);
  100.     F(6,9)       = -(Vn^2+Ve^2)/(Rn+h)^2;
  101.     F(7,5)       = 1/(Rm+h);
  102.     F(7,9)       = -Vn/(Rm+h)^2;
  103.     F(8,4)       = 1/((Rn+h)*cos(L));
  104.     F(8,7)       = Ve*tan(L)/((Rn+h)*cos(L));
  105.     F(8,9)       = -Ve/(cos(L)*(Rn+h)^2);
  106.     F(9,6)       = 1;
  107.     F(1:3,10:12) = Cnb;
  108.     F(1:3,13:15) = Cnb;
  109.     F(4:6,16:18) = Cnb;
  110.     F(13,13)     = -1/Tg(1);
  111.     F(14,14)     = -1/Tg(2);
  112.     F(15,15)     = -1/Tg(3);
  113.     F(16,16)     = -1/Ta(1);
  114.     F(17,17)     = -1/Ta(2);
  115.     F(18,18)     = -1/Ta(3);
  116.     %连续系统输入矩阵更新
  117.     G                                    = zeros(18,9);
  118.     G(1:3,1:3)   = Cnb;
  119.     G(13:15,4:6) = eye(3,3);
  120.     G(16:18,7:9) = eye(3,3);
  121.     %连续系统量测阵更新
  122.     H                                         = zeros(3,18);
  123.     H(1,7)                         = 1;
  124.     H(2,8)                         = 1;
  125.     H(3,9)                         = 1;
  126.     %连续系统离散化
  127.     A                                   = eye(18,18)+F*tao;
  128.     B                             = (eye(18,18)+tao*F/2)*G*tao;
  129.    
  130.     %卡尔曼滤波
  131.     P                                         = A*(PP0)*A'+B*Q*B';
  132.     K                                         = P*H'*inv(H*P*H'+R);
  133.     PP0                                 = (eye(18,18)-K*H)*P;
  134.     PP0                                 = (PP0+PP0')/2;
  135.     PP(i,:)                 = diag(PP0);
  136.    
  137.     z = Dp(i+1,:)';
  138.     XX = A*X+K*(z-H*A*X);
  139.     X = XX;

  140.     E_attitude(i+1,:) = XX(1:3)';
  141.     E_velocity(i+1,:) = XX(4:6)';
  142.     E_position(i+1,:) = XX(7:9)';
  143. end

复制代码
  1. %GPS/INS组合导航

  2. %%%%%%%%%%%%%%%%%%
  3. %edit by horsejun
  4. %%%%%%%%%%%%%%%%%%

  5. %量测信号:   位置
  6. %INS输出数据由simulink计算得出


  7. clear
  8. clc

  9. %得到轨迹信号

  10. load ode500

  11. Re                 = 6378245;                                                                                                                                                                                     %地球长半径

  12. %真实轨迹
  13. a_R         = yout(:,1:3);
  14. v_R          = yout(:,4:6);
  15. p_R         = yout(:,7:9);

  16. %加噪声后的INS计算结果
  17. a_ins = yout(:,10:12);
  18. v_ins = yout(:,13:15);
  19. p_ins = yout(:,16:18);
  20. quat  = yout(:,19:22);    %姿态四元数
  21. Fn    = yout(:,23:25);         %地理系下的比力

  22. %惯导相关的噪声统计数据
  23. Q_wg  = (0.04/(57*3600))^2;         %陀螺马氏过程
  24. Q_wr  = (0.01/(57*3600))^2;              %陀螺白噪声
  25. Q_wa  = (1e-3)^2;   %加计马氏过程
  26. Q                 = diag([Q_wg Q_wg Q_wg,  Q_wr Q_wr Q_wr,  Q_wa Q_wa Q_wa]);
  27. Tg                 = 300*ones(3,1);
  28. Ta                 = 1000*ones(3,1);

  29. %得到带误差的GPS输出信号
  30. p_gps_sample = p_R(1:10:end,:);
  31. n = size(p_gps_sample,1);
  32. p_error(:,1:2)  = 30*randn(n,2)/Re;   
  33. p_error(:,3) = 30*randn(n,1);                                %位置误差
  34. p_gps = p_gps_sample+p_error;                                %加入位置误差
  35. R = diag(std(p_error).^2);                                   %计算测量噪声方差R

  36. %卡尔曼滤波
  37. tao= 1;                                            %滤波步长
  38. a_ins_sample                 = a_ins(1:10:end,:);
  39. v_ins_sample                 = v_ins(1:10:end,:);
  40. p_ins_sample                 = p_ins(1:10:end,:);
  41. a_R_sample                         = a_R(1:10:end,:);
  42. v_R_sample                         = v_R(1:10:end,:);
  43. p_R_sample                         = p_R(1:10:end,:);
  44. Dp= p_ins_sample-p_gps;                           %INS与GPS输出的位置差值
  45. a = a_ins_sample;
  46. v = v_ins_sample;
  47. p = p_ins_sample;
  48. quat0 = quat(1:10:end,:);
  49. Fn0 = Fn(1:10:end,:);

  50. [Error_a, Error_v, Error_p, PP] = kalman_GPS_INS_position_sp_NFb(Dp, v, p, quat0, Fn0, Q, R, Tg, Ta, tao);   %得到位置,速度误差误差估计值

  51. a_estimate                         = a(1:size(Error_a,1),:)-Error_a;
  52. v_estimate                         = v(1:size(Error_v,1),:)-Error_v;
  53. p_estimate                         = p(1:size(Error_p,1),:)-Error_p;

  54. n = size(p_estimate,1);   %行数

  55. %位置误差比较
  56. figure  
  57. subplot(3,1,1)
  58. plot((1:n),(p_R_sample(1:n,1)-p(1:n,1))*6e6,'k',(1:n),(p_R_sample(1:n,1)-p_estimate(:,1))*6e6,'r')  %黑线-滤波前的误差   红线-滤波后的误差
  59. xlabel('时间,单位s')
  60. subplot(3,1,2)
  61. plot((1:n),(p_R_sample(1:n,2)-p(1:n,2))*6e6,'k',(1:n),(p_R_sample(1:n,2)-p_estimate(:,2))*6e6,'r')  %黑线-滤波前的误差   红线-滤波后的误差
  62. ylabel('位置误差,单位m')
  63. subplot(3,1,3)
  64. plot((1:n),p_R_sample(1:n,3)-p(1:n,3),'k',(1:n),p_R_sample(1:n,3)-p_estimate(:,3),'r')                                                  %黑线-滤波前的误差   红线-滤波后的误差
  65. xlabel('黑线-滤波前的INS误差   红线-滤波后的误差')

  66. %速度误差比较
  67. figure  
  68. subplot(3,1,1)
  69. plot((1:n),v_R_sample(1:n,1)-v(1:n,1),'k',(1:n),v_R_sample(1:n,1)-v_estimate(:,1),'r')                                                   %黑线-滤波前的误差   红线-滤波后的误差
  70. xlabel('时间,单位s')
  71. subplot(3,1,2)
  72. plot((1:n),v_R_sample(1:n,2)-v(1:n,2),'k',(1:n),v_R_sample(1:n,2)-v_estimate(:,2),'r')                                                  %黑线-滤波前的误差   红线-滤波后的误差
  73. ylabel('速度误差,单位m/s')
  74. subplot(3,1,3)
  75. plot((1:n),v_R_sample(1:n,3)-v(1:n,3),'k',(1:n),v_R_sample(1:n,3)-v_estimate(:,3),'r')                                                  %黑线-滤波前的误差   红线-滤波后的误差
  76. xlabel('黑线-滤波前的INS误差   红线-滤波后的误差')

  77. %位置误差
  78. figure  
  79. subplot(3,1,1)
  80. xlabel('时间,单位s')
  81. plot((1:n),(p_R_sample(1:n,1)-p_estimate(:,1))*6370000,'r')                                                                                                                                                                  %红线-滤波后的误差
  82. subplot(3,1,2)
  83. plot((1:n),(p_R_sample(1:n,2)-p_estimate(:,2))*6370000,'r')                                                                                                                                                                  %红线-滤波后的误差
  84. ylabel('位置误差,单位m')
  85. subplot(3,1,3)
  86. plot((1:n),p_R_sample(1:n,3)-p_estimate(:,3),'r')                                                                                                                                                                                                    %红线-滤波后的误差
  87. xlabel('滤波后的位置误差')

  88. %速度误差
  89. figure  
  90. subplot(3,1,1)
  91. plot((1:n),v_R_sample(1:n,1)-v_estimate(:,1),'r')                                                                                                                                                                                                          % 红线-滤波后的误差
  92. xlabel('时间,单位s')
  93. subplot(3,1,2)
  94. plot((1:n),v_R_sample(1:n,2)-v_estimate(:,2),'r')                                                                                                                                                                                                          %红线-滤波后的误差
  95. ylabel('速度误差,单位m/s')
  96. subplot(3,1,3)
  97. plot((1:n),v_R_sample(1:n,3)-v_estimate(:,3),'r')                                                                                                                                                                                                          % 红线-滤波后的误差
  98. xlabel('滤波后的速度误差')

复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:508323 发表于 2019-4-9 22:00 | 只看该作者
顶帖,很赞
回复

使用道具 举报

板凳
ID:809854 发表于 2020-7-30 21:32 | 只看该作者
又看到您了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表