找回密码
 立即注册

QQ登录

只需一步,快速开始

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

卡尔曼滤波器在INS-GPS组合导航中应用仿真 matlab源代码

[复制链接]
跳转到指定楼层
楼主
最近一段时间在尝试用FPGA设计卡尔曼滤波器,设计过程比较复杂,在此过程中卡尔曼滤波器的基本原理,matlab仿真与C语言实现,及其在导航算法中的应用困扰了我很长一段时间。在和师兄交流和参阅些许文献之后,终于小有收获。下面是把卡尔曼滤波器在INS-GPS组合导航中应用仿真的matlab源代码与大家分享,希望对初学者有一定的借鉴价值。

   在下面的仿真的代码中,理想的观测量不是真实数据,而是自生成的正弦波数据,在真实的应用场景中,应该是一系列的参考数据。

运行结果:


  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %     卡尔曼滤波器在INS-GPS组合导航中应用仿真
  3. % Author : lylogn
  4. % Email  : lylogn@gmail.com
  5. % Company: BUAA-Dep3
  6. % Time   : 2013.01.06
  7. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  8. % 参考文献:
  9. % [1]. 邓正隆. 惯导技术, 哈尔滨工业大学出版社.2006.

  10. clear all;

  11. %% 惯性-GPS组合导航模型参数初始化
  12. we  = 360/24/60/60*pi/180; %地球自转角速度,弧度/s
  13. psi = 10*pi/180;          %psi角度 / 弧度
  14. Tge = 0.12;
  15. Tgn = 0.10;
  16. Tgz = 0.10;               %这三个参数的含义详见参考文献
  17. sigma_ge=1;
  18. sigma_gn=1;
  19. sigma_gz=1;
  20. %% 连续空间系统状态方程
  21. % X_dot(t) = A(t)*X(t) + B(t)*W(t)

  22. A=[0 we*sin(psi) -we*cos(psi) 1     0     0      1 0 0;
  23.    -we*sin(psi) 0    0      0     1     0      0 1 0;
  24.    we*cos(psi) 0    0      0     0     1      0 0 1;
  25.   0           0    0      -1/Tge 0     0      0 0 0;
  26.   0           0    0      0     -1/Tgn 0      0 0 0;
  27.   0           0    0      0     0     -1/Tgz  0 0 0;
  28.   0           0    0      0     0     0      0 0 0;
  29.   0           0    0      0     0     0      0 0 0;
  30.   0           0    0      0     0     0      0 0 0;]; %状态转移矩阵
  31. B=[0           0    0   sigma_ge*sqrt(2/Tge) 0 0 0 0 0;
  32.   0           0    0    0 sigma_gn*sqrt(2/Tgn) 0 0 0 0;
  33.   0           0    0    0 0 sigma_gz*sqrt(2/Tgz) 0 0 0;]';%输入控制矩阵
  34. %% 转化为离散时间系统状态方程
  35. % X(k+1) = F*X(k) + G*W(k)
  36. T = 0.1;
  37. [F,G]=c2d(A,B,T);
  38. H=[1   0      0 0 0 0 0 0 0;
  39.    0  -sec(psi) 0 0 0 0 0 0 0;];%观测矩阵
  40. %% 卡尔曼滤波器参数初始化
  41. t=0:T:50-T;
  42. length=size(t,2);
  43. y=zeros(2,length);
  44. Q=0.5^2*eye(3);                %系统噪声协方差
  45. R=0.25^2*eye(2);               %测量噪声协方差
  46. y(1,:)=2*sin(pi*t*0.5);
  47. y(2,:)=2*cos(pi*t*0.5);
  48. Z=y+sqrt(R)*randn(2,length);   %生成的含有噪声的假定观测值,2维
  49. X=zeros(9,length);             %状态估计值,9维
  50. X(:,1)=[0,0,0,0,0,0,0,0,0]';   %状态估计初始值设定
  51. P=eye(9);                      %状态估计协方差
  52. %% 卡尔曼滤波算法迭代过程
  53. for  n=2:length
  54.    X(:,n)=F*X(:,n-1);
  55.    P=F*P*F'+ G*Q*G';
  56.    Kg=P*H'/(H*P*H'+R);
  57.   X(:,n)=X(:,n)+Kg*(Z(:,n)-H*X(:,n));
  58.    P=(eye(9,9)-Kg*H)*P;
  59. end
  60. %% 绘图代码
  61. figure(1)
  62. plot(y(1,:))
  63. hold on;
  64. plot(y(2,:))
  65. hold off;
  66. title('理想的观测量');
  67. figure(2)
  68. plot(Z(1,:))
  69. hold on;
  70. plot(Z(2,:))
  71. hold off;
  72. title('带有噪声的观测量');
  73. figure(3)
  74. plot(X(1,:))
  75. hold on;
  76. plot(X(2,:))
  77. hold off;
  78. title('滤波后的观测量');
复制代码

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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