mainkalman.asv
上传用户:shigeng
上传日期:2017-01-30
资源大小:122k
文件大小:3k
开发平台:

Matlab

  1. function main()
  2. %%@project:飞行器跟踪模拟
  3. %@author:fantasy
  4. %@date:2006.5.10
  5. %@descripition:主函数
  6. %产生观测数据
  7. total=3*60;%总的时间长度
  8. global T;%采样周期
  9. T=1;
  10. N=total/T;%数据长度
  11. a=20;
  12. var_rx=100;
  13. var_ry=100;
  14. X=[];%观测数据
  15. X_ideal=[];%理想数据
  16. for i=1:N
  17.     [rx,ry]=track(i*T,20);
  18.     X_ideal=[X_ideal,[rx;ry]];
  19.     rx=rx+var_rx*randn(1,1);
  20.     ry=ry+var_ry*rand(1,1);
  21.     X=[X,[rx;ry]];
  22. end
  23. X_filter=zeros(size(X));%滤波后数据
  24. X_mean=X_filter;%蒙特卡洛平均数据
  25. Error_var=zeros(size(X));
  26. M=1;%蒙特卡洛仿真次数
  27. for iCount=1:M
  28.     X_filter=Trace(X);
  29.     X_mean=X_mean+X_filter;
  30.     Error_var=Error_var+(X_ideal-X_filter).^2;
  31. end
  32. X_mean=X_mean/M;
  33. Error_var=Error_var/M;
  34. Error_mean=X_ideal-X_mean;%误差均值
  35. Error_var=sqrt(Error_var-Error_mean.^2);
  36. set(gca,'FontSize',12); set(gcf,'Color','White');
  37. plot(X_ideal(1,:),X_ideal(2,:),X(1,:),X(2,:),X_mean(1,:),X_mean(2,:));
  38. axis equal;
  39. legend('理想轨迹','观测轨迹','滤波轨迹');
  40. %@subfunction    
  41. %理想航迹方程
  42. function [x,y]=track(t,a)
  43. %parameter:
  44. %   t:时间
  45. %   x:横轴位移
  46. %   y:纵轴位移
  47. %   a:转弯处加速度 
  48. %   r:初始位置
  49. %   v:初始速度
  50. r=[-20000,0]';
  51. v=300;
  52. w=a/v;%角速度
  53. t1=-r(1)/v;
  54. t2=t1+pi/w;
  55. D=v^2/a*2;%圆周运动直径
  56. if t<=0
  57.    [x,y]=r;
  58. elseif t>0&&t<=t1
  59.     x=r(1)+v*t;
  60.     y=r(2);
  61. elseif t>t1&&t<=t2
  62.     angel=(t-t1)*w;
  63.     x=D/2*sin(angel);
  64.     y=-D*(sin(angel/2))^2;
  65. else
  66.     x=-v*(t-t2);
  67.     y=-D;
  68. end
  69. function R=Trace(X)
  70. %@project:飞行器跟踪模拟
  71. %@author:fantasy
  72. %@date:2006.5.10
  73. %@parameter:
  74. %    X:观测数据
  75. %    R:输出坐标
  76. %观测时间间隔
  77. global T;
  78. %观测矩阵
  79. H=[1,0,0,0,0;...
  80.    0,1,0,0,0];
  81. %位移测量误差
  82. var_rx=100;
  83. var_ry=100;
  84. var_rx2=var_rx^2;
  85. var_ry2=var_ry^2;
  86. %观测噪声协方差矩阵
  87. C=[var_rx2,0;...
  88.    0,var_ry2];
  89. %驱动噪声协方差矩阵
  90. var_v=30;
  91. var_a=5;
  92. var_v2=var_v^2;
  93. var_a2=var_a^2;
  94. Q=zeros(5,5);
  95. Q(4,4)=var_v2;
  96. Q(5,5)=var_a2;
  97. %初始状态
  98. s0=[-10000,2000,0,300,0]';
  99. %Kalman滤波跟踪
  100. N=size(X,2);%观测数据长度
  101. s=s0;
  102. a=@traverse;
  103. M=Q;
  104. Xplus=[];%修正后的航迹
  105. for icurrent=1:N
  106.     [s,M]=Karlman(s,M,X(:,icurrent),a,Q,C,H);
  107.     Xplus=[Xplus;(s(1:2))'];
  108. end
  109. %可视化数据
  110. % plot(X(1,:),X(2,:),'r.');
  111. % axis('equal');
  112. % hold on;
  113. % plot(Xplus(:,1),Xplus(:,2));
  114. R=Xplus';
  115. function s_estimate=traverse(s)
  116. %状态方程
  117. %s=[rx,ry,theta,v,a]
  118. global T;
  119. s_estimate=zeros(5,1);
  120. s_estimate(1)=s(1)+s(4)*cos(s(3))*T;
  121. s_estimate(2)=s(2)-s(4)*sin(s(3))*T;
  122. s_estimate(3)=s(3)+(s(5)/s(4))*T;
  123. s_estimate(4)=s(4);
  124. s_estimate(5)=s(5);
  125. function [s,M]=Karlman(s_forward,M_forward,X,a,Q,C,H)
  126. %卡尔曼滤波
  127. %@author:fantasy
  128. %@date:2006.5.15
  129. %参数说明
  130. %       X--观测数据矢量
  131. %       A--状态矩阵
  132. %       Q--驱动噪声协方差
  133. %       C--观测噪声协方差
  134. %       h--观测方程句柄
  135. %       s--输出数据矢量
  136. %       s_foward--前次输出矢量
  137. %       M--前次预测矩阵
  138. global T;
  139. %预测
  140. s=feval(a,s_forward);
  141.   
  142. %状态转换矩阵
  143. % A=[1,0,-s(4)/2*sin(s(3)/2)*T,cos(s(3)/2)*T,0;...
  144. %    0,1,-s(4)/2*cos(s(3)/2)*T,-sin(s(3)/2)*T,0;...
  145. %    0,0,1,-s(5)*T/(s(4))^2,T/s(4);...
  146. %    0,0,0,1,0;...
  147. %    0,0,0,0,1];
  148. A=[1,0,s(4)*sin(s(3))*T,cos(s(3))*T,0;...
  149.    0,1,-s(4)*cos(s(3))*T,-sin(s(3))*T,0;...
  150.    0,0,1,-s(5)*T/(s(4))^2,T/s(4);...
  151.    0,0,0,1,0;...
  152.    0,0,0,0,1];
  153. %最小预测MSE矩阵
  154. M=M_forward;
  155. M=A*M*A'+Q;
  156. %卡尔曼增益矩阵
  157. K=M*H'*inv(C+H*M*H');
  158. %修正
  159. s=s+K*(X-H*s);
  160. %最小MSE矩阵
  161. I=eye(5);
  162. M=[I-K*H]*M*[I+K*H]'-K*C*K';