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

GPS编程

开发平台:

Matlab

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