[1024] | 1 | #include <iomanip>
|
---|
| 2 | #include <iostream>
|
---|
| 3 | #include <math.h>
|
---|
| 4 | #include <stdio.h>
|
---|
| 5 | #include <RTCM3/rtcm3torinex.h>
|
---|
| 6 | #include <RTCM3/ephemeris.h>
|
---|
| 7 |
|
---|
| 8 | #include "rtcm_utils.h"
|
---|
| 9 |
|
---|
| 10 | using namespace std;
|
---|
| 11 |
|
---|
| 12 | void resolveEpoch (double secsHour,
|
---|
| 13 | int refWeek, double refSecs,
|
---|
| 14 | int& epochWeek, double& epochSecs) {
|
---|
| 15 |
|
---|
| 16 | const double secsPerWeek = 604800.0;
|
---|
| 17 |
|
---|
| 18 | epochWeek = refWeek;
|
---|
| 19 | epochSecs = secsHour + 3600.0*(floor((refSecs-secsHour)/3600.0+0.5));
|
---|
| 20 |
|
---|
| 21 | if (epochSecs<0 ) { epochWeek--; epochSecs+=secsPerWeek; };
|
---|
| 22 | if (epochSecs>secsPerWeek) { epochWeek++; epochSecs-=secsPerWeek; };
|
---|
| 23 | };
|
---|
| 24 |
|
---|
| 25 |
|
---|
| 26 | int cmpRho(const t_eph* eph,
|
---|
| 27 | double stax, double stay, double staz,
|
---|
| 28 | int GPSWeek, double GPSWeeks,
|
---|
| 29 | double& rho, int& GPSWeek_tot, double& GPSWeeks_tot,
|
---|
| 30 | double& xSat, double& ySat, double& zSat, double& clkSat) {
|
---|
| 31 |
|
---|
| 32 | const double omega_earth = 7292115.1467e-11;
|
---|
| 33 | const double secsPerWeek = 604800.0;
|
---|
| 34 |
|
---|
| 35 | // Initial values
|
---|
| 36 | // --------------
|
---|
| 37 | rho = 0.0;
|
---|
| 38 | eph->position(GPSWeek, GPSWeeks, xSat, ySat, zSat, clkSat);
|
---|
| 39 |
|
---|
[1044] | 40 | ////cout << "----- cmpRho -----\n";
|
---|
| 41 | ////eph->print(cout);
|
---|
| 42 | ////cout << " pos " << setw(4) << GPSWeek
|
---|
| 43 | //// << " " << setw(14) << setprecision(6) << GPSWeeks
|
---|
| 44 | //// << " " << setw(13) << setprecision(3) << xSat
|
---|
| 45 | //// << " " << setw(13) << setprecision(3) << ySat
|
---|
| 46 | //// << " " << setw(13) << setprecision(3) << zSat
|
---|
| 47 | //// << endl;
|
---|
[1024] | 48 |
|
---|
| 49 | // Loop until the correct Time Of Transmission is found
|
---|
| 50 | // ----------------------------------------------------
|
---|
| 51 | double rhoLast = 0;
|
---|
| 52 | do {
|
---|
| 53 | rhoLast = rho;
|
---|
| 54 |
|
---|
| 55 | // Correction station position due to Earth Rotation
|
---|
| 56 | // -------------------------------------------------
|
---|
| 57 | double dPhi = omega_earth * rho / c_light;
|
---|
| 58 | double xRec = stax * cos(dPhi) - stay * sin(dPhi);
|
---|
| 59 | double yRec = stay * cos(dPhi) + stax * sin(dPhi);
|
---|
| 60 | double zRec = staz;
|
---|
| 61 |
|
---|
| 62 | double dx = xRec - xSat;
|
---|
| 63 | double dy = yRec - ySat;
|
---|
| 64 | double dz = zRec - zSat;
|
---|
| 65 |
|
---|
| 66 | rho = sqrt(dx*dx + dy*dy + dz*dz);
|
---|
| 67 |
|
---|
| 68 | GPSWeek_tot = GPSWeek;
|
---|
| 69 | GPSWeeks_tot = GPSWeeks - rho/c_light;
|
---|
| 70 | while ( GPSWeeks_tot < 0 ) {
|
---|
| 71 | GPSWeeks_tot += secsPerWeek;
|
---|
| 72 | GPSWeek_tot -= 1;
|
---|
| 73 | }
|
---|
| 74 | while ( GPSWeeks_tot > secsPerWeek ) {
|
---|
| 75 | GPSWeeks_tot -= secsPerWeek;
|
---|
| 76 | GPSWeek_tot += 1;
|
---|
| 77 | }
|
---|
| 78 |
|
---|
| 79 | eph->position(GPSWeek_tot, GPSWeeks_tot, xSat, ySat, zSat, clkSat);
|
---|
| 80 |
|
---|
| 81 | dx = xRec - xSat;
|
---|
| 82 | dy = yRec - ySat;
|
---|
| 83 | dz = zRec - zSat;
|
---|
| 84 |
|
---|
| 85 | rho = sqrt(dx*dx + dy*dy + dz*dz);
|
---|
| 86 |
|
---|
[1044] | 87 | ////cout << " scrd " << setw(4) << GPSWeek_tot
|
---|
| 88 | //// << " " << setw(15) << setprecision(8) << GPSWeeks_tot
|
---|
| 89 | //// << " " << setw(13) << setprecision(3) << xSat
|
---|
| 90 | //// << " " << setw(13) << setprecision(3) << ySat
|
---|
| 91 | //// << " " << setw(13) << setprecision(3) << zSat
|
---|
| 92 | //// << " rcv0 " << setw(12) << setprecision(3) << stax
|
---|
| 93 | //// << " " << setw(12) << setprecision(3) << stay
|
---|
| 94 | //// << " " << setw(12) << setprecision(3) << staz
|
---|
| 95 | //// << " rcv " << setw(12) << setprecision(3) << xRec
|
---|
| 96 | //// << " " << setw(12) << setprecision(3) << yRec
|
---|
| 97 | //// << " " << setw(12) << setprecision(3) << zRec
|
---|
| 98 | //// << " dPhi " << scientific << setw(13) << setprecision(10) << dPhi << fixed
|
---|
| 99 | //// << " rho " << setw(13) << setprecision(3) << rho
|
---|
| 100 | //// << endl;
|
---|
[1024] | 101 |
|
---|
| 102 |
|
---|
| 103 | ////cout.setf(ios::fixed);
|
---|
| 104 | ////
|
---|
| 105 | ////cout << "niter " << setw(3) << ++niter
|
---|
| 106 | //// << " " << setw(14) << setprecision(3) << rhoLast
|
---|
| 107 | //// << " " << setw(14) << setprecision(3) << rho
|
---|
| 108 | //// << endl;
|
---|
| 109 |
|
---|
| 110 | } while ( fabs(rho - rhoLast) > 1e-4);
|
---|
| 111 |
|
---|
| 112 | clkSat *= c_light; // satellite clock correction in meters
|
---|
| 113 |
|
---|
| 114 | return 0;
|
---|
| 115 | }
|
---|