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

Matlab

  1. function main()
  2. %产生观测数据
  3. total=3*60;%总的时间长度
  4. global T;%采样周期
  5. T=1;
  6. N=total/T;%数据长度
  7. a=50;
  8. var_rx=100;
  9. var_ry=100;
  10. X=[];%观测数据
  11. X_ideal=[];%理想数据
  12. for i=1:N
  13.     [rx,ry]=track(i*T,20);
  14.     X_ideal=[X_ideal,[rx;ry]];
  15.     rx=rx+var_rx*randn(1,1);
  16.     ry=ry+var_ry*randn(1,1);
  17.     X=[X,[rx;ry]];
  18. end
  19. X_filter=zeros(size(X));%滤波后数据
  20. X_mean=X_filter;%蒙特卡洛平均数据
  21. Error_var=zeros(size(X));
  22. M=10;%蒙特卡洛仿真次数
  23. for iCount=1:M
  24.     X_filter=Trace(X);
  25.     X_mean=X_mean+X_filter;
  26.     Error_var=Error_var+(X_ideal-X_filter).^2;
  27.     
  28. end
  29. X_mean=X_mean/M;
  30. Error_var=Error_var/M;
  31. Error_mean=X_ideal-X_mean;%误差均值
  32. Error_var=sqrt(Error_var-Error_mean.^2);
  33. plot(X(1,:),X(2,:),X_mean(1,:),X_mean(2,:));
  34. axis equal;
  35. legend('真实轨迹','滤波轨迹');
  36. figure;
  37. k=1:N;
  38. subplot(2,1,1),plot(k,Error_var(1,:)/N);title('x方向误差标准值');xlabel('采样次数'),ylabel('误差标准值(米)');
  39. subplot(2,1,2),plot(k,Error_var(2,:)/N);title('y方向误差标准值');xlabel('采样次数'),ylabel('误差标准值(米)');
  40.     
  41. %理想航迹方程
  42. function [x,y]=track(t,a)
  43. %   t:时间
  44. %   x:横轴位移
  45. %   y:纵轴位移
  46. %   a:转弯处加速度 
  47. %   r:初始位置
  48. %   v:初始速度
  49. r=[-20000,0]';
  50. v=300+randn(1,1);
  51. w=a/v;%角速度
  52. t1=-r(1)/v;
  53. t2=t1+pi/w;
  54. D=v^2/a*2;%圆周运动直径
  55. if t<=0
  56.    x=-20000,y=0;
  57. elseif t>0&&t<=t1
  58.     x=r(1)+v*t;
  59.     y=r(2);
  60. elseif t>t1&&t<=t2
  61.     angel=(t-t1)*w;
  62.     x=D/2*sin(angel);
  63.     y=-D*(sin(angel/2))^2;
  64. else
  65.     x=-v*(t-t2);
  66.     y=-D;
  67. end
  68. function R=Trace(X)
  69. %飞行器跟踪模拟
  70. %    X:观测数据
  71. %    R:输出坐标
  72. %观测时间间隔
  73. global T;
  74. %观测矩阵
  75. H=[1,0,0,0,0;...
  76.    0,1,0,0,0];
  77. %位移测量误差
  78. var_rx=100;
  79. var_ry=100;
  80. var_rx2=var_rx^2;
  81. var_ry2=var_ry^2;
  82. %观测噪声协方差矩阵
  83. C=[var_rx2,0;...
  84.    0,var_ry2];
  85. %状态噪声协方差矩阵
  86. var_v=30;
  87. var_a=5;
  88. var_v2=var_v^2;
  89. var_a2=var_a^2;
  90. Q=zeros(5,5);
  91. Q(4,4)=var_v2;
  92. Q(5,5)=var_a2;
  93. %初始状态
  94. s0=[-20000,0,0,300,0]';
  95. %Kalman滤波跟踪
  96. N=size(X,2);%观测数据长度
  97. s=s0;
  98. a=@traverse;
  99. M=Q;
  100. Xplus=[];%修正后的航迹
  101. for icurrent=1:N
  102.     [s,M]=Karlman(s,M,X(:,icurrent),a,Q,C,H);
  103.     Xplus=[Xplus;(s(1:2))'];
  104. end
  105. R=Xplus';
  106. function s_estimate=traverse(s)
  107. %状态方程
  108. global T;
  109. s_estimate=zeros(5,1);
  110. s_estimate(1)=s(1)+s(4)*cos(s(3))*T;
  111. s_estimate(2)=s(2)-s(4)*sin(s(3))*T;
  112. s_estimate(3)=s(3)+(s(5)/s(4))*T;
  113. s_estimate(4)=s(4);
  114. s_estimate(5)=s(5);
  115. function [s,M]=Karlman(s_forward,M_forward,X,a,Q,C,H)
  116. %卡尔曼滤波
  117. %参数说明
  118. %       X--观测数据矢量
  119. %       A--状态矩阵
  120. %       Q--状态噪声协方差
  121. %       C--观测噪声协方差
  122. %       h--观测方程句柄
  123. %       s--输出数据矢量
  124. %       s_foward--前次输出矢量
  125. %       M--前次预测矩阵
  126. global T;
  127. %预测
  128. s=feval(a,s_forward);  
  129. %状态转换矩阵
  130. A=[1,0,-s(4)*sin(s(3))*T,cos(s(3))*T,0;...
  131.    0,1,-s(4)*cos(s(3))*T,-sin(s(3))*T,0;...
  132.    0,0,1,-s(5)*T/(s(4))^2,T/s(4);...
  133.    0,0,0,1,0;...
  134.    0,0,0,0,1];
  135. %最小预测MSE矩阵
  136. M=M_forward;
  137. M=A*M*A'+Q;   %协方差的进一步预测
  138. %卡尔曼增益矩阵
  139. K=M*H'*inv(C+H*M*H');
  140. %修正(状态更新方程)
  141. s=s+K*(X-H*s);
  142. %最小MSE矩阵(协方差更新方程)
  143. I=eye(5);
  144. M=[I-K*H]*M*[I+K*H]'-K*C*K';
  145. %粒子滤波
  146. N1=100;% 粒子滤波器粒子数
  147. P=2;
  148. r=[-20000,0]';
  149. xhat = r;
  150. xhatPart = r;
  151. % 初始化粒子过滤器
  152. for i = 1 : N1
  153.     rpart(i) = r + sqrt(P) * randn;
  154. end
  155. for k = 1 : N1
  156.     % 系统仿真
  157.     for i=1:N
  158.         t=i*T;
  159.         v=300+randn(1,1);
  160. w=a/v;%角速度
  161.    t1=-r(1)/v;
  162.    t2=t1+pi/w;
  163. if  t>0&&t<=t1
  164.     x=r(1)+v*t;%状态方程
  165. elseif t>t1&&t<=t2
  166.     angel=(t-t1)*w;
  167.     x=D/2*sin(angel);%状态方程
  168. else
  169.     x=-v*(t-t2);%状态方程
  170.     
  171. end
  172.  y = x + sqrt(1) * randn;%观测方程
  173.  for i = 1 : N
  174.      if  t>0&&t<=t1
  175.         xpartminus(i) = r(1)+v*t + sqrt(1) * randn;
  176.         elseif t>t1&&t<=t2
  177.              xpartminus(i)=D/2*sin(angel);
  178.              else
  179.                 xpartminus(i)=-v*(t-t2);
  180.         ypart = xpartminus(i);
  181.         vhat = y - ypart;%观测和预测的差
  182.         q(i) = (1 / sqrt(R) / sqrt(2*pi)) * exp(-vhat^2 / 2 / R);
  183.      end
  184.     end
  185.     %正常化的可能性,每个先验估计
  186.     qsum = sum(q);
  187.     for i = 1 : N
  188.         q(i) = q(i) / qsum;%归一化权重
  189.     end
  190.     % 重采样
  191.     for i = 1 : N1
  192.         u = rand; % 均匀随机数介于0和1
  193.         qtempsum = 0;
  194.         for j = 1 : N1
  195.             qtempsum = qtempsum + q(j);
  196.             if qtempsum >= u
  197.                 xpart(i) = xpartminus(j);
  198.                 break;
  199.             end
  200.         end
  201.     end
  202.     xhatPart = mean(xpart);
  203.     xhatPartArr = [xhatPartArr xhatPart];
  204.    t = 0 : N;
  205. end
  206. figure;
  207. plot(t, xhatPartArr, 'r');