EASY6E.M
上传用户:sfyaiting
上传日期:2009-10-25
资源大小:320k
文件大小:10k
源码类别:

GPS编程

开发平台:

Matlab

  1. %EASY6E We compute a baseline from C/A code and phase observations.
  2. %     The code does not handle
  3. %        1. cycle slips and
  4. %        2. outliers.
  5. %     In contrast to EASY5, we now use an extended Kalman filter for the
  6. %     estimation. The present code is no real RTK code as all computational
  7. %     steps do not happen on an epoch-by-epoch basis
  8. %
  9. %       The filter uses e(ponentially) age-weighting of old data.
  10. %       Reference:
  11. %       Kailath, Thomas & Ali H. Sayed & Babak Hassibi (2000): Linear Estimation. 
  12. %       Prentice Hall. Pages 68--69
  13. %Kai Borre 27-07-2002
  14. %Copyright (c) by Kai Borre
  15. %$Revision: 1.0 $  $Date: 2002/07/27  $
  16. % Initial computations of constants
  17. v_light = 299792458;      % vacuum speed of light m/s
  18. f1 = 154*10.23E6;      % L1 frequency Hz
  19. f2 = 120*10.23E6;  % L2 frequency Hz
  20. lambda1 = v_light/f1;      % wavelength on L1:  .19029367  m
  21. lambda2 = v_light/f2;      % wavelength on L2:  .244210213 m
  22. % Read RINEX ephemerides file and convert to internal Matlab format
  23. rinexe('SITE247J.01N','eph.dat');
  24. Eph = get_eph('eph.dat');
  25. % We identify the master observation file and open it
  26. ofile1 = 'SITE247J.01O';
  27. fid1 = fopen(ofile1,'rt');
  28. [Obs_types1, ant_delta1, ifound_types1, eof11] = anheader(ofile1);
  29. NoObs_types1 = size(Obs_types1,2)/2;
  30. % We start by estimating the master position
  31. [time1, dt1, sats1, eof1] = fepoch_0(fid1);
  32. NoSv1 = size(sats1, 1);
  33. m = NoSv1;
  34. obs1raw = grabdata(fid1, NoSv1, NoObs_types1);
  35. i = fobs_typ(Obs_types1,'C1'); % We use C/A pseudoranges
  36. [X_i, el] = recpo_ls(obs1raw(:,i), sats1, time1, Eph);
  37. [phi_i,lambda_i,h_i] = togeod(6378137,298.257223563,X_i(1),X_i(2),X_i(3));
  38. % We close all files to ensure that the next reading starts
  39. % at the top of the observation files
  40. fclose all;
  41. % Finding columns in Eph for each SV
  42. for t = 1:m
  43.     col_Eph(t) = find_eph(Eph,sats1(t),time1);
  44. end
  45. % Computation of elevation angle to all SVs.
  46. all_sats1 = sats1;
  47. % Delete Sv with elevation smaller than 10 degrees
  48. sats1(el<10) = [];
  49. del_sat = setdiff(all_sats1,sats1);
  50. no_del_sat = [];
  51. for t = 1:length(del_sat)
  52.     no_dels = find(del_sat(t) == all_sats1);
  53.     no_del_sat = [no_del_sat; no_dels];
  54. end
  55. No_del_sat = length(no_del_sat);
  56. % Selecting reference SV. We take the SV with largest elevation
  57. [y,ind] = max(el);
  58. refsv = sats1(ind);
  59. ofile1 = 'SITE247J.01O';
  60. fid1 = fopen(ofile1,'rt');
  61. ofile2 = 'SITE24~1.01O';
  62. fid2 = fopen(ofile2,'rt');
  63. % We start reading both observation files
  64. [Obs_types1, ant_delta1, ifound_types1, eof11] = anheader(ofile1);
  65. NoObs_types1 = size(Obs_types1,2)/2;
  66. obsstr = ['P1';'P2';'L1';'L2'];
  67. Oc = [];
  68. for t = 1:4
  69.     oc = strmatch(obsstr(t,:),strvcat('C1','P1','P2','L1','L2'),'exact');
  70.     Oc = [Oc oc];
  71. end
  72. [Obs_types2, ant_delta2, ifound_types2, eof12] = anheader(ofile2);
  73. NoObs_types2 = size(Obs_types2,2)/2;
  74. % Computation of covariance matrix Sigma for double differenced observations
  75. m1 = m-No_del_sat; % original number of SVs - deleted SVs due to low elevations
  76. D = [ones(m1,1) -eye(m1) -ones(m1,1) eye(m1)];
  77. Sigma = D*D';
  78. X = zeros(3+2*m1,1);       % coord.diff., N1, N2
  79. N = zeros(3+2*m1,3+2*m1);     % initialization of normals
  80. rs = zeros(3+2*m1,1);       % initialization of right side
  81. X_a = [];
  82. X_j = X_i(1:3,1);
  83. refrow = find(refsv == sats1);
  84. % We process three epochs for estimating ambiguities; the present data evidently
  85. % need three or more epochs for getting reliable estimates of the float ambiguities
  86. for q = 1:6
  87.     X_j = X_i(1:3,1)+X(1:3,1);
  88.     [time1, dt1, sats1, eof1] = fepoch_0(fid1);
  89.     [time2, dt2, sats2, eof2] = fepoch_0(fid2);
  90.     if time1 ~= time2
  91. disp('Epochs do not correspond in time')
  92. break
  93.     end;
  94.     time = time1;
  95.     NoSv1 = size(sats1,1);
  96.     NoSv2 = size(sats2,1);
  97.     obsm = grabdata(fid1, NoSv1, NoObs_types1);
  98.     obsr = grabdata(fid2, NoSv2, NoObs_types2);
  99.     obs1 = obsm(:,Oc); % P1 P2 Phi1 Phi2
  100.     % Reordering of rows in obsr to correspond to obsm
  101.     for s = 1:NoSv1
  102. Ind = find(sats1(s) == sats2(:));
  103. obs2(s,:) = obsr(Ind,Oc);
  104.     end
  105.     % Computing rho for refsv
  106.     [tcorr,rhok_j,Xk_ECF] = get_rho(time, obs2(refrow,1), Eph(:,col_Eph(refrow)), X_j);
  107.     [tcorr,rhok_i,Xk_ECF] = get_rho(time, obs1(refrow,1), Eph(:,col_Eph(refrow)), X_i);
  108.     tt = 0;
  109.     A1 = [];
  110.     t0 = 1:NoSv1;
  111.     t1 = setdiff(t0,no_del_sat); % we delete the low satellites
  112.     for t = t1
  113. tt = tt+1;
  114. [tcorr,rhol_j,Xl_ECF] = get_rho(time,obs2(t,1), Eph(:,col_Eph(t)), X_j);
  115. [tcorr,rhol_i,Xl_ECF] = get_rho(time,obs1(t,1), Eph(:,col_Eph(t)), X_i);
  116. A0 = [(Xk_ECF(1)-X_j(1))/rhok_j - (Xl_ECF(1)-X_j(1))/rhol_j  ...
  117. (Xk_ECF(2)-X_j(2))/rhok_j - (Xl_ECF(2)-X_j(2))/rhol_j ...
  118. (Xk_ECF(3)-X_j(3))/rhok_j - (Xl_ECF(3)-X_j(3))/rhol_j];
  119. A1 = [A1; A0];
  120. Phi1 = (obs1(refrow,3)-obs1(t,3)-obs2(refrow,3)+obs2(t,3))*lambda1;
  121. Phi2 = (obs1(refrow,4)-obs1(t,4)-obs2(refrow,4)+obs2(t,4))*lambda2;
  122. b(tt,:) = Phi1-lambda1*X(3+tt,1);
  123. b(m1+tt,:) = Phi2-lambda2*X(3+m1+tt,1);
  124. bk(tt,:) =  rhok_i-rhok_j-rhol_i+rhol_j;
  125. bk(m1+tt,:) =  rhok_i-rhok_j-rhol_i+rhol_j;
  126.     end;
  127.     A_modi = eye(m1);  % modified coefficient matrix
  128.     col = find(refsv == sats1);  % find column for reference PRN
  129.     A_modi(:,col) = -ones(m1,1);
  130.     A_aug = [A1 lambda1*A_modi 0*eye(m1); A1 0*eye(m1) lambda2*A_modi];
  131.     N = N+A_aug'*kron(eye(2),Sigma)*A_aug;
  132.     rs = rs+A_aug'*kron(eye(2),Sigma)*(b-bk);
  133. end %q
  134. PP = pinv(N);
  135. % X contains the three preliminary baseline components and the float ambiguities
  136. X = PP*rs;
  137. % Estimation of ambiguities by means of the Lambda method
  138. [a,sqnorm,Sigma_afixed,Z] = lambda2(X(4:4+2*m1-1,1),PP(4:4+2*m1-1,4:4+2*m1-1));
  139. % Correcting baseline vector as consequence of changing float ambiguities to fixed ones
  140. X(1:3,1) = X(1:3,1)-PP(1:3,4:4+2*m1-1)*inv(PP(4:4+2*m1-1,4:4+2*m1-1))*...
  141.      (X(4:4+2*m1-1,1)-a(:,1)); %select first set of candidates
  142. X(4:4+2*m1-1,1) = a(:,1);
  143. fprintf('n N1 for PRN %3.0f: %3.0f',[sats1(t1)'; a(1:m1,1)'])
  144. fprintf('n')
  145. fprintf('n N2 for PRN %3.0f: %3.0f',[sats1(t1)'; a(m1+1:2*m1,1)'])
  146. % We close and reopen all files in order to start reading at a known position
  147. fclose all;
  148. ofile1 = 'SITE247J.01O';
  149. fid1 = fopen(ofile1,'rt');
  150. ofile2 = 'SITE24~1.01O';
  151. fid2 = fopen(ofile2,'rt');
  152. % Setting covariances for the Kalman filter; the state vector contains (x,y,z)
  153. P = eye(3);                       % covariances of state vector
  154. Q = 0.05^2*eye(3);              % covariances of system
  155. R = 0.005^2*kron(eye(2),inv(Sigma));  % covariances of observations
  156. % In ofile2 we substitute empty observations with NaN's to obtain 22 valid epochs
  157. qend = 22;
  158. % Preliminary estimate of baseline components
  159. x = X(1:3,1);
  160. x_acc = [];
  161. delta_x = zeros(3,1);
  162. for q = 1:qend
  163.     X_j = X_i(1:3,1)+x;
  164.     [phi_j,lambda_j,h_j] = togeod(6378137,298.257223563,X_j(1),X_j(2),X_j(3));
  165.     [time1, dt1, sats1, eof1] = fepoch_0(fid1);
  166.     [time2, dt2, sats2, eof2] = fepoch_0(fid2);
  167.     if time1 ~= time2
  168. disp('Epochs do not correspond in time')
  169. break
  170.     end;
  171.     time = time1;
  172.     NoSv1 = size(sats1,1);
  173.     NoSv2 = size(sats2,1);
  174.     obsm = grabdata(fid1, NoSv1, NoObs_types1);
  175.     obsr = grabdata(fid2, NoSv2, NoObs_types2);
  176.     obs1 = obsm(:,Oc); % P1 P2 Phi1 Phi2
  177.     % Reordering of rows in obsr to correspond to obsm
  178.     for s = 1:m
  179. Ind = find(sats1(s) == sats2(:));
  180. obs2(s,:) = obsr(Ind,Oc);
  181.     end
  182.     % Computing rho for refsv
  183.     [tcorr,rhok_j,Xk_ECF] = get_rho(time, obs2(1,1), Eph(:,col_Eph(1)), X_j);
  184.     [tcorr,rhok_i,Xk_ECF] = get_rho(time, obs1(1,1), Eph(:,col_Eph(1)), X_i);
  185.     tt = 0;
  186.     A = zeros(2*m1,3);
  187.     for t = t1
  188. tt = tt+1;
  189. [tcorr,rhol_j,Xl_ECF] = get_rho(time,obs2(t,1), Eph(:,col_Eph(t)), X_j);
  190. [tcorr,rhol_i,Xl_ECF] = get_rho(time,obs1(t,1), Eph(:,col_Eph(t)), X_i);
  191. A0 = [(Xk_ECF(1)-X_j(1))/rhok_j - (Xl_ECF(1)-X_j(1))/rhol_j  ...
  192. (Xk_ECF(2)-X_j(2))/rhok_j - (Xl_ECF(2)-X_j(2))/rhol_j ...
  193. (Xk_ECF(3)-X_j(3))/rhok_j - (Xl_ECF(3)-X_j(3))/rhol_j];
  194. A(tt,:) =  A0;
  195. A(m1+tt,:) = A0;
  196. % Tropospheric correction using standard meteorological parameters
  197. %[az,el_ki,d] = topocent(X_i(1:3),Xk_ECF-X_i(1:3));
  198. %[az,el_li,d] = topocent(X_i(1:3),Xl_ECF-X_i(1:3));
  199. %[az,el_kj,d] = topocent(X_j(1:3),Xk_ECF-X_j(1:3));
  200. %[az,el_lj,d] = topocent(X_j(1:3),Xl_ECF-X_j(1:3));
  201. %el_ki,    el_li,    el_kj,    el_lj
  202. %t_corr = tropo(sin(el_lj*pi/180),...
  203. %    h_j*1.e-3,1013,293,50,0,0,0)...
  204. %    -tropo(sin(el_li*pi/180),....
  205. %    h_i*1.e-3,1013,293,50,0,0,0)...
  206. %    -tropo(sin(el_kj*pi/180),...
  207. %    h_j*1.e-3,1013,293,50,0,0,0)...
  208. %    +tropo(sin(el_ki*pi/180),...
  209. %    h_i*1.e-3,1013,293,50,0,0,0);
  210. Phi1 = (obs1(refrow,3)-obs1(t,3)-obs2(refrow,3)+obs2(t,3))*lambda1; %-t_corr;
  211. Phi2 = (obs1(refrow,4)-obs1(t,4)-obs2(refrow,4)+obs2(t,4))*lambda2; %-t_corr;
  212. b(tt,:) = Phi1-lambda1*a(tt,1);
  213. b(m1+tt,:) = Phi2-lambda2*a(m1+tt,1);
  214. bk(tt,:) =  rhok_i-rhok_j-rhol_i+rhol_j;
  215. bk(m1+tt,:) =  rhok_i-rhok_j-rhol_i+rhol_j;
  216.     end; % t
  217.     
  218.     % Age weighting of old data, see Fagin.
  219.     tau = .1; % The smaller tau is, the faster old observations are forgotten
  220.     age_weight = exp(1/tau);  
  221.     
  222.     %Extended Kalman filter, see pages 509--510 in Strang & Borre (1997): Linear
  223.     % Algebra, Geodesy, and GPS, Wellesley-Cambridge Press
  224.     P = P+Q;
  225.     K = P*A'*inv(A*P*A'/age_weight+ R)/age_weight;
  226.     x = x+K*(b-bk);
  227.     P = (eye(3)-K*A)*P/age_weight;
  228.     fprintf('nx: %8.3f m,  y: %8.3f m,  z: %8.3f mn',x(1),x(2),x(3))
  229.     x_acc = [x_acc x];
  230. end %q
  231. % Transformation of geocentric baseline coordinates into topocentric coordinates
  232. for i = 1:qend
  233.     [e(i),n(i),u(i)] = xyz2enu(phi_j,lambda_j,x_acc(1,i),x_acc(2,i),x_acc(3,i));
  234. end
  235. fprintf('nnBaseline Componentsn')
  236. fprintf('nX: %8.3f m,  Y: %8.3f m,  Z: %8.3f mn', ...
  237.   x_acc(1,qend),x_acc(2,qend),x_acc(3,qend))
  238. fprintf('nE: %8.3f m,  N: %8.3f m,  U: %8.3f mn',mean(e),mean(n),mean(u))
  239. figure(1);
  240. plot_handles = plot(1:qend,(e-e(1))'*1000,'-',...
  241.                     1:qend,(n-n(1))'*1000,'--',...
  242.                     1:qend,(u-u(1))'*1000,'-.');
  243. set(gca,'fontsize',16)
  244. set(plot_handles,'linewidth',2)
  245. title('Estimates of Baseline Using Age-Weighting')
  246. ylabel('State Vector, Changes Relative to Initial Epoch [mm]')
  247. xlabel('Epochs [1 s interval]')
  248. legend('Easting','Northing','Upping')
  249. print -deps easy6e
  250. %%%%%%%%%%%%%%%%%%%%%% end easy6e.m  %%%%%%%%%%%%%%%%%%%