49 const PZ90Ellipsoid GLOFNavAlm::ell;
51 const double GLOFNavAlm::ae = ell.a_km();
52 const double GLOFNavAlm::icp = 63.0 *
gnsstk::PI / 180.0;
53 const double GLOFNavAlm::Tcp = 43200.0;
54 const double GLOFNavAlm::C20 = -1082.62575e-6;
55 const double GLOFNavAlm::J = (-3.0/2.0) * C20;
56 const double GLOFNavAlm::C20Term = (3.0/2.0) * C20;
62 taunA(
std::numeric_limits<double>::quiet_NaN()),
63 lambdanA(
std::numeric_limits<double>::quiet_NaN()),
64 deltainA(
std::numeric_limits<double>::quiet_NaN()),
65 eccnA(
std::numeric_limits<double>::quiet_NaN()),
66 omeganA(
std::numeric_limits<double>::quiet_NaN()),
67 tLambdanA(
std::numeric_limits<double>::quiet_NaN()),
68 deltaTnA(
std::numeric_limits<double>::quiet_NaN()),
69 deltaTdotnA(
std::numeric_limits<double>::quiet_NaN()),
126 ios::fmtflags oldFlags = s.flags();
128 s.setf(ios::fixed, ios::floatfield);
129 s.setf(ios::right, ios::adjustfield);
130 s.setf(ios::uppercase);
134 s <<
"**************************************************************"
136 <<
" GLONASS ORB/CLK (NON-IMMEDIATE) PARAMETERS"
145 s.setf(ios::fixed, ios::floatfield);
146 s.setf(ios::right, ios::adjustfield);
147 s.setf(ios::uppercase);
157 string tform(
"%02m/%02d/%Y %03j %02H:%02M:%02S %7.0s %P");
159 <<
" MM/DD/YYYY DOY HH:MM:SS SOD\n"
165 <<
"Parameter Value" << endl;
167 s.setf(ios::scientific, ios::floatfield);
168 s.setf(ios::right, ios::adjustfield);
169 s.setf(ios::uppercase);
173 s <<
"tau " << setw(16) <<
taunA <<
" sec" << endl
174 <<
"lambda " << setw(16) <<
lambdanA <<
" rad" << endl
175 <<
"di " << setw(16) <<
deltainA <<
" rad" << endl
176 <<
"e " << setw(16) <<
eccnA <<
" dimensionless" << endl
177 <<
"omega " << setw(16) <<
omeganA <<
" rad" << endl
178 <<
"tLambda " << setw(16) <<
tLambdanA <<
" seconds" << endl
179 <<
"dT " << setw(16) <<
deltaTnA <<
" sec/orbit" << endl
180 <<
"dTd " << setw(16) <<
deltaTdotnA <<
" sec/orbit**2" << endl;
182 s.setf(ios::fixed, ios::floatfield);
184 s <<
"C " << setw(16) <<
healthBits <<
" encoded:";
187 s <<
" NON-operational";
194 <<
"M " << setw(16) <<
static_cast<int>(
satType)
196 <<
"H " << setw(16) <<
freqnA <<
" freq. offset" << endl
199 <<
" Health of transmitting SV" << endl;
208 string tform2(
"%02m/%02d/%4Y %03j %02H:%02M:%02S");
222 ss <<
" " << setw(2) <<
freqnA;
238 : lambdaBar(
std::numeric_limits<double>::quiet_NaN()),
239 tau(
std::numeric_limits<double>::quiet_NaN()),
240 nu(
std::numeric_limits<double>::quiet_NaN()),
241 Tdeltap(
std::numeric_limits<double>::quiet_NaN()),
242 n(
std::numeric_limits<double>::quiet_NaN()),
243 a(
std::numeric_limits<double>::quiet_NaN()),
244 i(
std::numeric_limits<double>::quiet_NaN()),
245 coslambdaBar(
std::numeric_limits<double>::quiet_NaN()),
246 sinlambdaBar(
std::numeric_limits<double>::quiet_NaN()),
247 cos2lambdaBar(
std::numeric_limits<double>::quiet_NaN()),
248 sin2lambdaBar(
std::numeric_limits<double>::quiet_NaN()),
249 cos3lambdaBar(
std::numeric_limits<double>::quiet_NaN()),
250 sin3lambdaBar(
std::numeric_limits<double>::quiet_NaN()),
251 cos4lambdaBar(
std::numeric_limits<double>::quiet_NaN()),
252 sin4lambdaBar(
std::numeric_limits<double>::quiet_NaN()),
253 earthvs(
std::numeric_limits<double>::quiet_NaN()),
254 sini(
std::numeric_limits<double>::quiet_NaN()),
255 sini2(
std::numeric_limits<double>::quiet_NaN()),
256 cosi(
std::numeric_limits<double>::quiet_NaN()),
257 cosi2(
std::numeric_limits<double>::quiet_NaN()),
258 JTerm(
std::numeric_limits<double>::quiet_NaN()),
259 JsinTerm(
std::numeric_limits<double>::quiet_NaN()),
260 Jsini2Term(
std::numeric_limits<double>::quiet_NaN()),
261 Jcosi2Term(
std::numeric_limits<double>::quiet_NaN()),
262 h(
std::numeric_limits<double>::quiet_NaN()),
263 l(
std::numeric_limits<double>::quiet_NaN()),
264 ecc2(
std::numeric_limits<double>::quiet_NaN()),
265 ecc2obv(
std::numeric_limits<double>::quiet_NaN())
277 ecc2obv = 1.0 - ecc2;
296 double aCurr = -9999999999999, aPrev = -9999999999999;
297 setEccArgOfPerigee(ecc, omega);
298 Tdeltap =
Tcp + deltaT;
314 double nuTerm = std::pow(1.0 + ecc *
cos(nu), 3.0);
315 double omegaTerm = std::pow(1.0 + ecc *
cos(omega), 2.0);
316 double eTerm = std::pow(ecc2obv, 3.0/2.0);
317 double siniTerm = (2.0 - (5.0/2.0)*sini2);
319 (siniTerm * (eTerm / omegaTerm) + (nuTerm / ecc2obv));
320 DEBUGTRACE(
"bigTerm = " << siniTerm <<
" * (" << eTerm <<
" / "
321 << omegaTerm <<
") + (" << nuTerm <<
" / " << ecc2obv <<
")");
323 aPrev = std::pow(ninv * ninv *
mu, 1.0/3.0);
326 DEBUGTRACE(
"Tock_c = " << (nuTerm / ecc2obv));
330 DEBUGTRACE(
"Tock_g = " << (eTerm / omegaTerm));
333 unsigned iteration = 0;
334 while (fabs(aCurr-aPrev) >= 1e-3)
336 double pn = aPrev * ecc2obv;
338 double tock_k = (1.0 +
C20Term * (
ae/pn) * (
ae/pn) * bigTerm);
339 double Tock = Tdeltap / tock_k;
341 DEBUGTRACE(
"p(" << iteration <<
") = " << pn);
342 DEBUGTRACE(
"Tock(" << (iteration+1) <<
") = " << Tock);
345 aCurr = std::pow(std::pow(Tock/(2.0*
gnsstk::PI),2.0) *
mu, 1.0/3.0);
346 DEBUGTRACE(
"a^(" << iteration <<
") = " << aCurr);
352 earthvs = std::pow(
ae/a, 2.0);
354 JsinTerm = JTerm * (1.0-(3.0/2.0)*sini2);
355 Jsini2Term = JTerm * sini2;
356 Jcosi2Term = JTerm * cosi2;
364 lambdaBar = M + omega + n * tau;
373 cos2lambdaBar =
std::cos(2.0*lambdaBar);
374 sin2lambdaBar =
std::sin(2.0*lambdaBar);
375 cos3lambdaBar =
std::cos(3.0*lambdaBar);
376 sin3lambdaBar =
std::sin(3.0*lambdaBar);
377 cos4lambdaBar =
std::cos(4.0*lambdaBar);
378 sin4lambdaBar =
std::sin(4.0*lambdaBar);
394 setLambdaBar(M, omega, 0, n);
396 setLambdaBar(M, omega, dt, n);
403 DEBUGTRACE(
"delta OMEGA = " << deltas.deltaOMEGA);
405 DEBUGTRACE(
"delta lambda* = " << deltas.deltalambdaBar);
419 return std::atan(hi/li);
425 else if (hi == -epsi)
433 AssertionFailure exc(
"omega_i conditions not met");
442 double Ein = Mi, lastEin = -99999;
443 while (fabs(Ein-lastEin) >= 1e-8)
446 Ein = Mi + epsi *
std::sin(lastEin);
464 double tstar = when - alm.
Toa;
465 double Wk = tstar / Tdeltap;
470 double tLambdakBar = alm.
tLambdanA + tscale;
471 double tLambdak = std::fmod(tLambdakBar, 86400.0);
472 double OMEGAdot =
C20Term * n * earthvs * cosi * std::sqrt(ecc2obv);
484 double S0 = gst*
PI/12.0;
486 double S = S0 +
omega3 * (tLambdak - 10800);
487 double OMEGA = lambdak + S;
495 double tanEdiv2 = std::sqrt((1.0-alm.
eccnA)/(1.0+alm.
eccnA)) *
497 double E = 2.0 * std::atan(tanEdiv2);
502 setDeltas(M, alm.
omeganA, a, tstar);
504 double ai = a + deltas.deltaa;
505 double hi = h + deltas.deltah;
506 double li = l + deltas.deltal;
507 double ii = i + deltas.deltai;
509 DEBUGTRACE(
"deltaOMEGA = " << deltas.deltaOMEGA);
510 double OMEGAi = OMEGA + deltas.deltaOMEGA;
511 double sinOMEGAi =
std::sin(OMEGAi);
512 double cosOMEGAi =
std::cos(OMEGAi);
513 double epsi = std::sqrt(hi*hi+li*li);
514 double omegai = getomegai(hi, li, epsi);
515 double lambdaStar = M + alm.
omeganA + n*tstar + deltas.deltalambdaBar;
516 double Mi = lambdaStar - omegai;
517 double Ein = integrateEin(Mi, epsi);
518 double tannuidiv2 = std::sqrt((1.0+epsi)/(1.0-epsi)) *
std::tan(Ein/2.0);
519 double nui = 2.0 * std::atan(tannuidiv2);
524 double muTerm = std::sqrt(
mu/ai);
525 double epsiTerm = std::sqrt(1-(epsi*epsi));
526 double ui = nui + omegai;
529 double ri = ai * (1-(epsi *
cos(Ein)));
530 double Vri = muTerm * ((epsi * sinnui) / epsiTerm);
531 double Vui = muTerm * ((1 + epsi * cosnui) / epsiTerm);
547 xvt.
x[0] = ri * ((cosui*cosOMEGAi) - (sinui*sinOMEGAi*cosii));
548 xvt.
x[1] = ri * ((cosui*sinOMEGAi) + (sinui*cosOMEGAi*cosii));
549 xvt.
x[2] = ri * sinui * sinii;
558 DEBUGTRACE(
"OMEGAi " << sinOMEGAi <<
" " << cosOMEGAi);
559 xvt.
v[0] = Vri * (cosui*cosOMEGAi - sinui*sinOMEGAi*cosii) -
560 Vui * (sinui*cosOMEGAi + cosui*sinOMEGAi*cosii);
561 xvt.
v[1] = Vri * (cosui*sinOMEGAi + sinui*cosOMEGAi*cosii) -
562 Vui * (sinui*sinOMEGAi - cosui*cosOMEGAi*cosii);
577 xvt.
v[2] = Vri * sinui * sinii + Vui * cosui * sinii;
591 : deltaa(
std::numeric_limits<double>::quiet_NaN()),
592 deltah(
std::numeric_limits<double>::quiet_NaN()),
593 deltal(
std::numeric_limits<double>::quiet_NaN()),
594 deltaOMEGA(
std::numeric_limits<double>::quiet_NaN()),
595 deltai(
std::numeric_limits<double>::quiet_NaN()),
596 deltalambdaBar(
std::numeric_limits<double>::quiet_NaN())
624 static constexpr
double OH = 0.5;
625 static constexpr
double TH = 3.0/2.0;
626 static constexpr
double FH = 5.0/2.0;
627 static constexpr
double SH = 7.0/2.0;
628 static constexpr
double STH = 17.0/2.0;
629 static constexpr
double ST = 7.0/3.0;
630 static constexpr
double OQ = 1.0/4.0;
631 static constexpr
double SQ = 7.0/4.0;
632 static constexpr
double SS = 7.0/6.0;
633 static constexpr
double STF = 7.0/24.0;
634 static constexpr
double FNSS = 49.0/72.0;
714 int m = (
tau == 0) ? 1 : 2;
715 DEBUGTRACE(
"deltaa(m=" << m <<
")/a = " << a_a);
716 DEBUGTRACE(
"deltah(m=" << m <<
") = " << deltah);
717 DEBUGTRACE(
"deltal(m=" << m <<
") = " << deltal);
718 DEBUGTRACE(
"deltaOMEGA(m=" << m <<
") = " << deltaOMEGA);
719 DEBUGTRACE(
"deltai(m=" << m <<
") = " << deltai);
720 DEBUGTRACE(
"deltalambdaBar(m=" << m <<
") = " << deltalambdaBar);