diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.cc b/src/algorithms/libs/rtklib/rtklib_pntpos.cc index c5eea1526..e07489a09 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.cc +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.cc @@ -58,8 +58,13 @@ double varerr(const prcopt_t *opt, double el, int sys) /* get tgd parameter (m) -----------------------------------------------------*/ -double gettgd(int sat, const nav_t *nav) +double gettgd(int sat, const nav_t *nav, int tgd_index) { + if (tgd_index < 0 || tgd_index >= 4) + { + return 0.0; + } + int i; for (i = 0; i < nav->n; i++) { @@ -67,11 +72,17 @@ double gettgd(int sat, const nav_t *nav) { continue; } - return SPEED_OF_LIGHT_M_S * nav->eph[i].tgd[0]; + return SPEED_OF_LIGHT_M_S * nav->eph[i].tgd[tgd_index]; } return 0.0; } + +double gettgd(int sat, const nav_t *nav) +{ + return gettgd(sat, nav, 0); +} + /* get isc parameter (m) -----------------------------------------------------*/ double getiscl1(int sat, const nav_t *nav) { @@ -209,7 +220,10 @@ double prange(const obsd_t *obs, const nav_t *nav, const double *azel, /* if no P1-P2 DCB, use TGD instead */ if (P1_P2 == 0.0) { - P1_P2 = gettgd(obs->sat, nav); + // Galileo I/NAV clocks are referenced to E1/E5b. For an E1 + // pseudorange, use BGD(E1,E5b), stored in tgd[1]. + const int tgd_index = (sys == SYS_GAL && obs->code[i] != CODE_NONE) ? 1 : 0; + P1_P2 = gettgd(obs->sat, nav, tgd_index); } if (sys == SYS_GPS || sys == SYS_QZS) diff --git a/src/algorithms/libs/rtklib/rtklib_pntpos.h b/src/algorithms/libs/rtklib/rtklib_pntpos.h index 735df2905..55c2a881a 100644 --- a/src/algorithms/libs/rtklib/rtklib_pntpos.h +++ b/src/algorithms/libs/rtklib/rtklib_pntpos.h @@ -48,6 +48,7 @@ double varerr(const prcopt_t *opt, double el, int sys); /* get tgd parameter (m) -----------------------------------------------------*/ double gettgd(int sat, const nav_t *nav); +double gettgd(int sat, const nav_t *nav, int tgd_index); /* get isc parameter (m) -----------------------------------------------------*/ double getiscl1(int sat, const nav_t *nav); diff --git a/src/algorithms/libs/rtklib/rtklib_ppp.cc b/src/algorithms/libs/rtklib/rtklib_ppp.cc index 21b501623..5e0c3f11f 100644 --- a/src/algorithms/libs/rtklib/rtklib_ppp.cc +++ b/src/algorithms/libs/rtklib/rtklib_ppp.cc @@ -1040,8 +1040,13 @@ int ifmeas(const obsd_t *obs, const nav_t *nav, const double *azel, /* get tgd parameter (m) -----------------------------------------------------*/ -double gettgd_ppp(int sat, const nav_t *nav) +double gettgd_ppp(int sat, const nav_t *nav, int tgd_index) { + if (tgd_index < 0 || tgd_index >= 4) + { + return 0.0; + } + int i; for (i = 0; i < nav->n; i++) { @@ -1049,12 +1054,18 @@ double gettgd_ppp(int sat, const nav_t *nav) { continue; } - return SPEED_OF_LIGHT_M_S * nav->eph[i].tgd[0]; + return SPEED_OF_LIGHT_M_S * nav->eph[i].tgd[tgd_index]; } return 0.0; } +double gettgd_ppp(int sat, const nav_t *nav) +{ + return gettgd_ppp(sat, nav, 0); +} + + /* slant ionospheric delay ---------------------------------------------------*/ int corr_ion(gtime_t time, const nav_t *nav, int sat __attribute__((unused)), const double *pos, const double *azel, int ionoopt, double *ion, double *var, @@ -1137,9 +1148,13 @@ int corrmeas(const obsd_t *obs, const nav_t *nav, const double *pos, gamma = std::pow(lam[1] / lam[0], 2.0); /* f1^2/f2^2 */ P1_P2 = nav->cbias[obs->sat - 1][0]; P1_C1 = nav->cbias[obs->sat - 1][1]; - if (P1_P2 == 0.0 && (satsys(obs->sat, nullptr) & (SYS_GPS | SYS_GAL | SYS_QZS))) + const int sys = satsys(obs->sat, nullptr); + if (P1_P2 == 0.0 && (sys & (SYS_GPS | SYS_GAL | SYS_QZS))) { - P1_P2 = (1.0 - gamma) * gettgd_ppp(obs->sat, nav); + // Galileo I/NAV clocks are referenced to E1/E5b. PPP reaches + // this path for E1, whose BGD is stored in tgd[1]. + const int tgd_index = sys == SYS_GAL ? 1 : 0; + P1_P2 = (1.0 - gamma) * gettgd_ppp(obs->sat, nav, tgd_index); } if (obs->code[0] == CODE_L1C) { diff --git a/src/algorithms/libs/rtklib/rtklib_ppp.h b/src/algorithms/libs/rtklib/rtklib_ppp.h index cdaedfea9..3d7d9e4a8 100644 --- a/src/algorithms/libs/rtklib/rtklib_ppp.h +++ b/src/algorithms/libs/rtklib/rtklib_ppp.h @@ -120,6 +120,7 @@ int ifmeas(const obsd_t *obs, const nav_t *nav, const double *azel, double phw, double *meas, double *var); double gettgd_ppp(int sat, const nav_t *nav); +double gettgd_ppp(int sat, const nav_t *nav, int tgd_index); int corr_ion(gtime_t time, const nav_t *nav, int sat, const double *pos, const double *azel, int ionoopt, double *ion, double *var,