-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Description
I've been using an RTKLIB-based receiver (GNSS-SDR) to process both real-world and simulated RF data. When processing data from a simulator (R&SSMW200A), I noticed some jumps in the estimated receiver position that I traced back to a jump in the pseudorange observable caused by a jump in the computed satellite position. So far, I'm not really sure if this behavior is caused by the simulated data (I haven't had the same behavior with real data) or the receiver itself, so I'm looking for help on this.
Below is the debug data and analysis specifically affecting Galileo satellite PRN E04 (SV63), however, the same problem was verified in other Galileo satellite signals. The debug reveals a sudden jump in the computed satellite position, which appears to result from an E5 ephemeris update that is applied inconsistently. More precisely, the mean anomaly (M0) is updated independently of the corresponding reference time (toe) and other orbital parameters. This leads to a temporary mismatch in the satellite's orbital definition, causing the receiver to compute an incorrect satellite position. Once toe is eventually updated to match the new M0, the satellite position returns to its expected trajectory.
I believe this behavior is inconsistent with how real GNSS satellites operate, where ephemeris updates are synchronized across all parameters. The evidence suggests that the GNSS simulator may be broadcasting partial or desynchronized ephemeris data across signals, such as E1 and E5a.
Additionally, the issue does not consistently affect the same satellite. It appears to occur randomly across different runs with the same simulator recording, sometimes impacting one satellite and not another, and other times affecting both or neither.
True Position:
ECEF (X,Y,Z,t[meters]) = (omitted), -705574, 4.207012e+06
Lat = (omitted) [deg], Long = -8.48536946111111 [deg], Height= 185.702 [m]
Log info:
sat = Internal satellite number
time = GPS Time of Week (TOW) [s]
toe = Time of Ephemeris - reference time for orbital parameters [s]
M0 = Mean Anomaly at toe - defines satellite position in orbit at toe [radians]
sqrtA = Square root of the semi-major axis (A), related to orbital radius [m]
e = Orbital eccentricity - shape of the orbit (0 = circular)
i0 = Inclination angle [radians]
iode = Issue of Data (Ephemeris) - data version
X, Y, Z = satellite 3D position [m]
dts = satellite clock correction (time offset from GPS time) [s]
`12:32:13.018971 rtklib_ephemeris.cc:821] Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74777e+07 Y=-1.96348e+06 Z=1.08319e+07 dts=-0.000182327
12:32:13.020283 rtklib_solver.cc:1801] RTKLIB Position at RX TOW = 595220 in ECEF (X,Y,Z,t[meters]) = (omitted), -705577, 4.20699e+06, 0.0105328
12:32:13.020298 rtklib_solver.cc:1813] RTKLIB Position at 2025-Mar-15 21:20:01.880000 is Lat = (omitted) [deg], Long = -8.48544 [deg], Height= 156.414 [m] RX time offset= 0.0105328 [s]
12:32:13.094882 rtklib_ephemeris.cc:821] Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74776e+07 Y=-1.96347e+06 Z=1.0832e+07 dts=-0.000182327
12:32:13.096197 rtklib_solver.cc:1801] RTKLIB Position at RX TOW = 595220 in ECEF (X,Y,Z,t[meters]) = (omitted), -705577, 4.207e+06, 0.0105328
12:32:13.096215 rtklib_solver.cc:1813] RTKLIB Position at 2025-Mar-15 21:20:01.920000 is Lat = (omitted) [deg], Long = -8.48544 [deg], Height= 159.538 [m] RX time offset= 0.0105328 [s]
12:32:13.124214 rtklib_ephemeris.cc:821] Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74776e+07 Y=-1.96346e+06 Z=1.0832e+07 dts=-0.000182327
12:32:13.125531 rtklib_solver.cc:1801] RTKLIB Position at RX TOW = 595220 in ECEF (X,Y,Z,t[meters]) = (omitted), -705575, 4.207e+06, 0.0105328
12:32:13.125547 rtklib_solver.cc:1813] RTKLIB Position at 2025-Mar-15 21:20:01.940000 is Lat = (omitted) [deg], Long = -8.48541 [deg], Height= 160.129 [m] RX time offset= 0.0105328 [s]
12:32:13.319868 rtklib_ephemeris.cc:821] Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74775e+07 Y=-1.96342e+06 Z=1.08324e+07 dts=-0.000182327
12:32:13.360900 rtklib_ephemeris.cc:821] Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74775e+07 Y=-1.96342e+06 Z=1.08324e+07 dts=-0.000182327
12:32:13.417745 rtklib_ephemeris.cc:821] Eph sat=63 time=595220 toe=594000 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.68639e+07 Y=-567561 Z=1.24201e+07 dts=-0.000182327 (jump occurs here, after M0 parameter changes)
12:32:25.234133 rtklib_ephemeris.cc:821] Eph sat=63 time=595227 toe=594000 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.6856e+07 Y=-565100 Z=1.24372e+07 dts=-0.000182327
12:32:25.234609 rtklib_solver.cc:1801] RTKLIB Position at RX TOW = 595227 in ECEF (X,Y,Z,t[meters]) = (omitted), -655382, 4.61957e+06, -0.0681602
12:32:25.234625 rtklib_solver.cc:1813] RTKLIB Position at 2025-Mar-15 21:20:08.620611 is Lat = (omitted) [deg], Long = -7.66159 [deg], Height= 377686 [m] RX time offset= -0.0681602 [s]
12:32:29.711074 rtklib_ephemeris.cc:821] Eph sat=63 time=595229 toe=594000 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.6853e+07 Y=-564158 Z=1.24437e+07 dts=-0.000182327
12:32:29.711581 rtklib_solver.cc:1801] RTKLIB Position at RX TOW = 595229 in ECEF (X,Y,Z,t[meters]) = (omitted), -366810, 4.5422e+06, -0.0876422
12:32:29.711608 rtklib_solver.cc:1813] RTKLIB Position at 2025-Mar-15 21:20:11.120808 is Lat = (omitted) [deg], Long = -4.14172 [deg], Height= 445039 [m] RX time offset= -0.0876422 [s]
12:32:38.170011 rtklib_ephemeris.cc:821] Eph sat=63 time=595234 toe=594600 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74628e+07 Y=-1.95897e+06 Z=1.08703e+07 dts=-0.000182327
12:32:38.170856 rtklib_solver.cc:1801] RTKLIB Position at RX TOW = 595234 in ECEF (X,Y,Z,t[meters]) = (omitted), -705571, 4.207e+06, -0.0694685
12:32:38.170871 rtklib_solver.cc:1813] RTKLIB Position at 2025-Mar-15 21:20:16.040000 is Lat = (omitted) [deg], Long = -8.48531 [deg], Height= 186.401 [m] RX time offset= -0.0694685 [s]
12:32:38.644851 rtklib_ephemeris.cc:821] Eph sat=63 time=595234 toe=594600 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74625e+07 Y=-1.95888e+06 Z=1.0871e+07 dts=-0.000182327
12:32:38.645457 rtklib_solver.cc:1801] RTKLIB Position at RX TOW = 595234 in ECEF (X,Y,Z,t[meters]) = (omitted), -705573, 4.20699e+06, 0.0105314
12:32:38.645471 rtklib_solver.cc:1813] RTKLIB Position at 2025-Mar-15 21:20:16.400000 is Lat = (omitted) [deg], Long = -8.48539 [deg], Height= 156.422 [m] RX time offset= 0.0105314 [s]
12:39:58.552119 rtklib_ephemeris.cc:821] Eph sat=63 time=595493 toe=594600 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.71854e+07 Y=-1.87082e+06 Z=1.15619e+07 dts=-0.000182329`
Scooping into the Ephemeris data:
`12:00:00.946653 Eph sat=63 time=594096 toe=593400 M0=1.40014 sqrtA=5440.6 e=0.000349108 i0=0.963609 iode=0 X=2.84932e+07 Y=-2.21778e+06 Z=7.7036e+06 dts=-0.000182316
12:15:09.543192 Eph sat=63 time=594620 toe=593400 M0=1.40014 sqrtA=5440.6 e=0.000349108 i0=0.963609 iode=0 X=2.80588e+07 Y=-2.12319e+06 Z=9.1848e+06 dts=-0.000182321
12:15:09.593331 Eph sat=63 time=594620 toe=593400 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963609 iode=0 X=2.7537e+07 Y=-759711 Z=1.08324e+07 dts=-0.000182321
12:15:33.823103 Eph sat=63 time=594634 toe=593400 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963609 iode=0 X=2.75226e+07 Y=-755991 Z=1.08694e+07 dts=-0.000182321
12:15:33.859453 Eph sat=63 time=594634 toe=593400 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963609 iode=0 X=2.75226e+07 Y=-755986 Z=1.08695e+07 dts=-0.000182321
12:15:33.898502 Eph sat=63 time=594634 toe=593400 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963609 iode=0 X=2.75225e+07 Y=-755980 Z=1.08695e+07 dts=-0.000182321
12:15:33.932543 Eph sat=63 time=594634 toe=593400 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963609 iode=0 X=2.75225e+07 Y=-755975 Z=1.08696e+07 dts=-0.000182321
12:15:33.979122 Eph sat=63 time=594634 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.80464e+07 Y=-2.12015e+06 Z=9.22336e+06 dts=-0.000182321
12:32:10.670552 Eph sat=63 time=595218 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.7479e+07 Y=-1.96389e+06 Z=1.08284e+07 dts=-0.000182327
12:32:10.697229 Eph sat=63 time=595219 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.7479e+07 Y=-1.96388e+06 Z=1.08284e+07 dts=-0.000182327
12:32:12.503458 Eph sat=63 time=595219 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.7478e+07 Y=-1.96357e+06 Z=1.08311e+07 dts=-0.000182327
12:32:12.544605 Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.7478e+07 Y=-1.96357e+06 Z=1.08311e+07 dts=-0.000182327
12:32:13.018971 Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74777e+07 Y=-1.96348e+06 Z=1.08319e+07 dts=-0.000182327
12:32:13.094882 Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74776e+07 Y=-1.96347e+06 Z=1.0832e+07 dts=-0.000182327
12:32:13.124214 Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74776e+07 Y=-1.96346e+06 Z=1.0832e+07 dts=-0.000182327
12:32:13.319868 Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74775e+07 Y=-1.96342e+06 Z=1.08324e+07 dts=-0.000182327
12:32:13.360900 Eph sat=63 time=595220 toe=594000 M0=1.47452 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74775e+07 Y=-1.96342e+06 Z=1.08324e+07 dts=-0.000182327
12:32:13.417745 Eph sat=63 time=595220 toe=594000 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.68639e+07 Y=-567561 Z=1.24201e+07 dts=-0.000182327
12:32:25.234133 Eph sat=63 time=595227 toe=594000 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.6856e+07 Y=-565100 Z=1.24372e+07 dts=-0.000182327
12:32:29.711074 Eph sat=63 time=595229 toe=594000 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.6853e+07 Y=-564158 Z=1.24437e+07 dts=-0.000182327
12:32:38.170011 Eph sat=63 time=595234 toe=594600 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74628e+07 Y=-1.95897e+06 Z=1.08703e+07 dts=-0.000182327
12:32:38.644851 Eph sat=63 time=595234 toe=594600 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.74625e+07 Y=-1.95888e+06 Z=1.0871e+07 dts=-0.000182327
12:39:58.552119 Eph sat=63 time=595493 toe=594600 M0=1.54891 sqrtA=5440.6 e=0.000349108 i0=0.963608 iode=0 X=2.71854e+07 Y=-1.87082e+06 Z=1.15619e+07 dts=-0.000182329`
M0 changes from M0=1.47452 to M0=1.54891 at 12:32:13.417745, indicating a new ephemeris has been received. But all other parameters remain constant. At this moment, the SV63 3D position suffers a huge jump compared to its position from 568ms before (12:32:13.360900).
11.8 seconds later, at 12:32:25.234133, the satellite position is again computed. Compared to the previous iteration, all parameters remain the same except for the GPS TOW, which changes from 595220s to 595227s. The resulting satellite position changes but maintains the huge offset from the previous iteration.
4.5 seconds later, at 12:32:29.711074, the satellite position is again computed. Compared to the previous iteration, all parameters remain the same except for the GPS TOW, which changes from 595227s to 595229s. The resulting satellite position changes but maintains the huge offset from the previous iteration.
8.5 seconds later, at 12:32:38.170011, the satellite position is again computed. Compared to the previous iteration, GPS TOW changes from 595229s to 595234s, and toe changes from 594000s to 594600s. The computed satellite position gets back to around the values before the jump, and the estimated receiver position approximates the true position.
A possible justification for this problem is that the parameters used for the satellite position computation do not change at the same time as they are supposed to. The satellite position goes back to normal with the new value of M0=1.54891, indicating that the value of that parameter is not wrong, but maybe paired with the wrong values of the other parameters.
The image below shows the satellite Y position evolution when M0 and toe are updated:
This behavior happens with other satellites, too. Sometimes it happens in more than one satellite, and sometimes it does not even happen during the 25-minute recording. With the same recording, there is a certain randomness. With the same run, looking into other satellite logs, M0 and toe are updated at the same time. However, it can happen that those parameters are not updated at the same time at a given moment (=jump in satellite position), but they do not match the PVT timing epoch, so there is no effect on positioning. This behavior happened with other satellites in other runs, and the satellite PRN E04 was ok.
