GLONASS Propagation Error

Hello all,

I’ve encountered what I believe is an error in the output of GLONASS’ AnalyticalPropagator. The ingestion of the ephemeris appears to be correct after manual direct comparison, but after propagation using a built GLONASSAnalyticalPropagatorBuilder for any amount of time, the position drastically changes. In the case shown below, a series of navigation messages over the course of 11/29 for satellite R07 is plotted alongside their correlated positions (in kilometers) after 15 seconds of propagation. The navigation message data was converted to EME-J2K before plotting for comparison.

As a case study, I focused on the data from the attached RNX file, which is one of the files used to generate the above graph. Extracting the R07 data yields a navigation message dated at 2022-11-28T23:44:42.000Z, with position vectors (in meters) as follows:

SUTH00ZAF_R_20223330000_01D_RN.rnx (136.5 KB)

ECEF: [7583600.585938, -7981940.9179690005, -22974412.59766]
EME-J2K: [10463119.2283619; 3268061.006078313; -22997585.224239085]

To determine the ECEF and EME-J2K coordinates as well as test two different propagation methods, I propagated using .propagate() as well as .propagateInEcef() in a format akin to this:

temp_prop = gnss.GLONASSAnalyticalPropagatorBuilder(navMessage)
propagator =
temp_new_date = navMessage.getDate().shiftedBy(15.0) # set desired date to current + 15 seconds
new_eci_state = propagator.propagate(temp_new_date)
new_ecef_PV = propagator.propagateInEcef(temp_new_date)
print('Orekit propagate Results: {0}'.format(new_eci_state.getPVCoordinates().getPosition())) # view new EME-J2K position
print('Orekit propinECEF Results: {0}'.format(new_ecef_PV.getPosition())) # view new ECEF position

and produced

ECEF: [16130241.053239357; -4296065.7151775155; 19288621.366695557]
EME-J2K: [11018990.22372796; 12576503.05069625; 19264090.862475004]

for a difference in position after 15 seconds by

ECEF: [-8,546.64 km; -3,685.88 km; -42,263.03 km]
EME-J2K: [-555.87 km; -9,308.44 km; -42,261.68 km]

This is a rather dramatic difference after 15 seconds, enough to appear to be in a different orbital plane, leading to the plot from above. I welcome any input you all may be able to offer as to where this issue might be originating from.

Thank you for your help!

Hi @Jon_Hood

Looks like your navigation messages contain GLONASS ephemeris (i.e. X, Vx, Ax, Y, etc.) and not GLONASS almanacs.
So, you shall use the GLONASSNumericalPropagator instead of GLONASSAnalyticalPropagator

The GLONASSNumericalPropagator shall be used for ephmeris whereas GLONASSAnalyticalPropagator is adapted to almanacs.

Best regards,

If it solve your issue, we have to improve the documentation.

1 Like

I also think we shall add a method getPropagator() in the XxxNavigationMessage classes of Orekit. It could be useful to avoid the problem you encountered.

Like that, a user parsing a Rinex navigation file with NavigationFileLoader class could directly initialize the propagator using this method

1 Like

That would be very useful, thank you. Looking forward to the update!

It did solve my issue, thank you for the fast response. I was definitely somewhat confused by the documentation; the other GNSS propagators that take in ephemeris were within the org.orekit.propagation.analytical.gnss module, so I assumed the GLONASS propagator within there was the one to use. I think just a mention in the class description that it is meant for almanacs while the one in numerical is meant for ephemeris would avoid this confusion.

Thanks again!


That’s great it solves your problem. Can I ask you to open 2 issues in our Gitlab issue tracker?

  1. To improve the documentation in the two propagator classes.
  2. To add a method getPropagator() in the XxxNavigationMessage classes

The link is here: Issues · Orekit / Orekit · GitLab

Thank you,

Just created the issues; thanks again!