The difference in sub-satellite position in two propagations

Hi everyone!
I am a very beginner in Orekit.
I’m comparing the sub-satellite location using TLE and two propagation methods. I understand that two different propagation will produce some difference, but the difference I have is too big in my opinion. Especially when comparing two locations at the start date. I think I made mistake somewhere in the Frame selections (TEME, GCRF) but cannot find what exactly I did the wrong way.

The code is here My_TLE_propagation_14July2022_ForDiscussion.py — Яндекс.Диск
The resulted image with the difference in the satellite track is here Figure_1.png — Яндекс.Диск

Thank you very much for your time! Will deeply appreciate any help.

Hi @AlexS

Welcome to the Orekit forum! :slight_smile:

For the computation of the lat/lon, you use two different frames:

subpoint_KAZSAT = [EarthModel.transform(tp, GCRF, tt)  for tt, tp in zip(t,p)]

lat_KAZSAT = np.degrees([gp.getLatitude()  for gp in subpoint_KAZSAT])
lon_KAZSAT = np.degrees([gp.getLongitude() for gp in subpoint_KAZSAT])
subpoint_KAZSAT2 = [EarthModel.transform(tp, TEMEFrame, tt)  for tt, tp in zip(t,p_KAZSAT)]
lat_KAZSAT2 = np.degrees([gp.getLatitude().value  for gp in subpoint_KAZSAT2])
lon_KAZSAT2 = np.degrees([gp.getLongitude().value for gp in subpoint_KAZSAT2])

For the first one, did you try to not convert the orbit in GCRF but using TEME frame instead? Something like:


pv = [TLEpropagator_KAZSAT.getPVCoordinates(tt) for tt in t]
p = [tpv.getPosition() for tpv in pv]

##### 
subpoint_KAZSAT = [EarthModel.transform(tp, TEMEFrame, tt)  for tt, tp in zip(t,p)]

lat_KAZSAT = np.degrees([gp.getLatitude()  for gp in subpoint_KAZSAT])
lon_KAZSAT = np.degrees([gp.getLongitude() for gp in subpoint_KAZSAT])

It should not change your results, but it will reduce the number of frame transformations and then the possibilities of doing something wrong.

Otherwise, I don’t see mistake in you code.
But, it is important to know that TLE accuracy is really poor. The error can reach 1 km at the TLE epoch and the more the propagation duration is, the more the error is. Here I see a difference of two days between the TLE epoch and the start date of you simulation. In addition, I see your propagation model for the numerical simulation is accurate (12x12 geopotential, SRP, drag, Sun, Moon, Relativity). Therefore, I expect important differences between the two simulations.

SGP4 model, the one used for LEO satellites, is limited to J2, J3, J4, and J5 zonal harmonics (I think there is also the related tesseral ones), SRP, and Drag. The SDP4 model adds the luni-solar attraction.

Did you try to use the TLE epoch as start date ?
Also, did you try to use close propagation model between SGP4 and the numerical one?

These two questions are asked in order to mitigate the accuracy issu and see if there is a mistake somewhere in the code.

Best regards,
Bryan

1 Like

Hi @AlexS and @bcazabonne,

I read the code deeply.

The main mistake is the initial state set for the numerical propagator.

propagator_KAZSAT.setInitialState(tleInitialState_KAZSAT)

where tleInitialState_KAZSAT is get from the TLEPropagator.

tleInitialState_KAZSAT = TLEpropagator_KAZSAT.getInitialState()

The everything related to TLE must be just in TLEPropagator.

The initial state can be set like this (ref to NumericalPropagatorBuilder.buildPropagator):

from org.orekit.propagation import SpacecraftState
orbit = tleOrbit_ECI_KAZSAT
attitude = nadirPointing.getAttitude(orbit, orbit.getDate(), GCRF)
state    = SpacecraftState(orbit, attitude, float(sat_list['KAZSAT 2']['mass']))
propagator_KAZSAT.setInitialState(state)

And then use the correct frame (that is GCRF) to calculate subpoint.

subpoint_KAZSAT2 = [EarthModel.transform(tp, GCRF, tt)  for tt, tp in zip(t,p_KAZSAT)]
1 Like

Hi bcazabonne!

Thanks a lot for your prompt reply. It really helps to clarify the situation.
I have tried all steps you suggested except this one “Also, did you try to use close propagation model between SGP4 and the numerical one?” which I did not get. Did you mean to use another propagator or make the numerical one close to SGP4 choosing appropriate parameters?

  1. Without converting to GCRF the code is a bit faster. Thanks!
  2. When I set Start Date to TLE epoch the two tracks are the same at the beginning as I expected Figure_2.png — Яндекс.Диск

I know that TLE is not very precise but at the beginning of propagation, these two methods should have similar results. Do you agree?

I meant make the numerical close to SGP4. The purpose was to have close configurations in order to highlight potential mistakes in the code. I know that the Deep version of SGP4 doesn’t take into account for the relativity, and models zonal Earth harmonics up to degree 4 (not 5 as I previously said) and some sectoral and tesseral Earth harmonics (22, 32, 44, 52, 54). Therefore, using a 4x4 normalized provider for numerical propagation could help to have close configurations between the two models.

Great! It confirms that the accuracy of the TLE is one of the major issue.

Bryan

1 Like