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

GPS编程

开发平台:

Matlab

  1. function  offset = easy7(ofile, navfile);
  2. % EASY7 Estimation of receiver clock offset and position
  3. %     through batch processing. Data are read from
  4. %     the RINEX ofile.
  5. %     The processing is iterated three times due to
  6. %     non-linearity in the position determination
  7. %    Typical call: recclock('pta.96o', 'pta.nav')
  8. %Kai Borre 27-07-2002
  9. %Copyright (c) by Kai Borre
  10. %$Revision: 1.0 $  $Date: 2002/07/27  $
  11. if nargin == 0
  12.     ofile = 'site247j.01o';
  13.     navfile = 'site247j.nav';
  14. end
  15. v_light = 299792458;    % vacuum speed of light m/s
  16. fid = fopen(ofile,'rt');
  17. [Obs_types, ant_delta, ifound_types, eof1] = anheader(ofile);
  18. if ((ifound_types == 0) | (eof1 == 1))
  19.     error('Basic information is missing in RINEX file'), end;
  20. NoObs_types = size(Obs_types,2)/2;
  21. % Downloading of ephemeris data
  22. Eph = get_eph(navfile);
  23. j = fobs_typ(Obs_types,'P2');
  24. fid = fopen(ofile,'rt');
  25. [tr_RAW, dt, sv, eof2] = fepoch_0(fid);
  26. NoSv = size(sv,1);
  27. obs = grabdata(fid, NoSv, NoObs_types);
  28. pr = obs(:,j);
  29. % CALL OF BAYES FILTER FOR FIRST POSITION
  30. pos = b_point(pr,sv,tr_RAW,Eph); % navfile
  31. fprintf(['nPreliminary position:n X = %10.2f Y = %10.2f', ...
  32.         ' Z = %10.2fnn'], pos(1),pos(2),pos(3))
  33. for iteration = 1:3
  34.     fid = fopen(ofile,'rt');
  35.     reduced_normals = zeros(3,3);
  36.     reduced_absolute = zeros(3,1);
  37.     eTe = [];
  38.     eTb = [];
  39.     eTA = [];
  40.     no_epochs = 0;
  41.     
  42.     for tt = 1:20
  43.         [tr_RAW, dt, sv, eof2] = fepoch_0(fid);
  44.         if (eof2 == 1), break, end
  45.         NoSv = size(sv,1);
  46.         for t = 1:NoSv
  47.             col_Eph(t) = find_eph(Eph,sv(t),tr_RAW);
  48.         end
  49.         obs = grabdata(fid, NoSv, NoObs_types);
  50.         pr = obs(:,j);
  51.         % Formation of Observation Equations
  52.         A = zeros(NoSv,3);
  53.         omc = zeros(NoSv,1);
  54.         for jsat = 1:NoSv
  55.             k = col_Eph(jsat);
  56.             tx_RAW = tr_RAW - pr(jsat)/v_light;
  57.             Toc = Eph(21,k);
  58.             dt = check_t(tx_RAW - Toc);
  59.             a0 = Eph(19,k);
  60.             a1 = Eph(20,k);
  61.             a2 = Eph(2,k);
  62.             tcorr = a0 + (a1 + a2*dt)*dt;
  63.             tx_GPS = tx_RAW - tcorr;
  64.             X = satpos(tx_GPS, Eph(:,k));
  65.             traveltime = 70.e-3;   % 70 ms first guess
  66.             for iter = 1:2
  67.                 Rot_X = e_r_corr(traveltime, X);
  68.                 rho = norm(Rot_X - pos(1:3,1));
  69.                 traveltime = rho/v_light;
  70.             end; % iter-loop
  71.             [phi,lambda,h] = togeod(6378137, 298.257223563, ...
  72.                 pos(1,1), pos(2,1), pos(3,1));
  73.             [az,el,dist] = topocent(Rot_X, Rot_X-pos(1:3,1));
  74.             corrected_pseudorange = pr(jsat) - ...
  75.                 tropo(sin(el),h/1000,1013.0,293.0,50.0,0.0,0.0,0.0);
  76.             dx = Rot_X(1) - pos(1,1);
  77.             dy = Rot_X(2) - pos(2,1);
  78.             dz = Rot_X(3) - pos(3,1);
  79.             distance = norm([dx dy dz]);
  80.             calculated_pseudorange = distance - v_light*tcorr;
  81.             omc(jsat,1) = corrected_pseudorange - calculated_pseudorange;
  82.             A(jsat,1) = -dx/distance;
  83.             A(jsat,2) = -dy/distance;
  84.             A(jsat,3) = -dz/distance;
  85.         end; % jsat-loop
  86.         % fprintf('n omc  %12.3f', omc(:,1))
  87.         
  88.         % Formation of Normal Equations
  89.         % We have     NoSv     number of sv.s
  90.         %     b = omc  right side,    dimension NoSv by 1;
  91.         %     A     dimension NoSv by 3;
  92.         %     sum(A)     dimension 1 by NoSv;
  93.         eTe = [eTe NoSv];
  94.         eTb = [eTb sum(omc)];
  95.         eTA = [eTA sum(A)'];
  96.         reduced_normals = reduced_normals + A'*A-sum(A)'*sum(A)/NoSv;
  97.         reduced_absolute = reduced_absolute + ...
  98.             A'*omc - sum(A)'*sum(omc)/NoSv;
  99.         no_epochs = no_epochs +1;
  100.     end % while loop
  101.     x = inv(reduced_normals)*reduced_absolute
  102.     pos(1:3,1) = pos(1:3,1) + x;
  103. end % iteration
  104. fclose('all');
  105. fprintf(['nFinal position:n X = %10.2f Y = %10.2f', ...
  106.         ' Z = %10.2fnn'], pos(1),pos(2),pos(3))
  107. for epoch = 1:no_epochs
  108.     rec_clk_offset(epoch) =  (eTb(epoch)-eTA(:,epoch)'*x)/ ...
  109.         (eTe(epoch)*v_light);  % offset in seconds
  110. end
  111. offset = rec_clk_offset*1.e9;
  112. %fprintf('nOffsets in nanoseconds:n')
  113. %fprintf('%12.3f %12.3f %12.3f %12.3f %12.3fn',offset)
  114. figure(1);
  115. plot(offset,'linewidth', 2)  % in nanoseconds
  116. set(gca,'Fontsize',16);
  117. title('Receiver Clock Offset')
  118. xlabel('Epochs [1 s interval]')
  119. ylabel('Offset [ns]')
  120. print -deps easy7 
  121. %%%%%%%%% end easy7.m %%%%%%%%%