Different SMA from sgp4 and spacetrack OMM


I’m comparing the semi major axis for a satellite directly from Orbit Mean element messages (OMM) from Spacetrack with the semi major axis obtained from SGP4 from TLE’s (at the same epoch as the OMM) also from Spacetrack. The values seem to be different by a few kilometres consistently. Does anyone have any idea why? I’m thinking it might be because sgp4 is giving an oscillating orbit but the semi major axis isn’t oscillating in the plot. I’ve attached an example plot and how I get the sma from sgp4.

// Read text file containing tles for a time period and store in a list
List<String> tles = new ArrayList<>();
BufferedReader reader = new BufferedReader(new FileReader(path));
String line;
while ((line = reader.readLine()) != null){

Object[] tlesArray = tles.toArray();
List<String> output = new ArrayList<>();
// Get semimajor axis for each tle stored
for (int i =0; i < tlesArray.length; i+=2){
    String line1 = (String) tlesArray[I];
    String line2 = (String) tlesArray[i+1];
    TLE inputTLE = new TLE(line1, line2, TimeScalesFactory.getUTC());
    TLEPropagator tlePropagator = TLEPropagator.selectExtrapolator(inputTLE);
    String out = tlePropagator.getInitialState().getDate().toString() + "   " + "%.3f";
    out = String.format(out,tlePropagator.getInitialState().getA());

Hi @dl00718

I don’t have a direct answer, just some questions to open discussions.

  1. I see a time span from 2014 to 2022. How do you extrapolate the OMM? Do you use a TLEPropagator or do you take a lot of OMM files?

  2. The TLEPropagator of Orekit returns a spacecraft state expressed in TEME frame. It is a frame specific to TLE. Are you comparing the two outputs in the same orbital frame?

  3. Could you show us the difference in a shorter time span? Both a one day and one week comparisons would be welcome.

Best regards,

I do not know if that’s the issue here, but maybe one of the values of the semi-major axis is incorrectly retrieved using the mean motion value included in the tle?
The correct procedure to get the semi-major axis consistent with the underlying theory is outlined here History of Analytical Orbit Modeling in the U. S. Space Surveillance System | Journal of Guidance, Control, and Dynamics

Best regards,

1 Like

Hi @andfio,

Could you provide a runnable test case so we can check the differences between the OMM and the TLE and investigate ?


Hello @MaximeJ,

In the end I think that the problem here is that OP is comparing a “mean (SGP4)” semi-major axis (computed from the mean motion value, without applying the procedure described in the paper above), with the correct osculating value.

For example using the TLE below for BEESAT-2 I obtain 6873.571 km for the osculating semi-major axis at epoch and 6867.138 km for a “mean” semi-major axis computed by applying Kepler’s 3rd law using the mean motion value contained in the TLE. The error seems of the order of those encountered by the original poster.

1 35933U 09051C   22299.16103807  .00000528  00000-0  12816-3 0  9994
2 35933  98.5432 160.1866 0006358  28.7021 331.4526 14.57027136695286

Best regards,


Hi @bcazabonne,

  1. For the OMM, i use the spacetrack api to pull omm messages within that time interval and then retrieve the mean semimajor axes from them. Alternatively, to compare one epoch, say today, you could use the query builder on spacetrack to get the elements and tle.
  2. I use TLEPropagator to retrieve the state in the EME2000 frame then retieve the sma from the state. (Perhaps this is where i’m getting it wrong?).
  3. Sure, ill attach both and i’ll also attach a text files with the TLEs i used
    Beesat2_oneweek.txt (2.7 KB)
    Beesat2_oneday.txt (280 Bytes)


Hi @andfio @bcazabonne @MaximeJ,
Yes i believe you’re right. Looking through the sma values from the OMM messages, The orbit i get from sgp4 is an oscullating orbit while the OMM gives the mean orbit. I’ve attached a text file with the tle epoch and sma for a day and one week, and i’ve attached the OMM messages form spacetrack for the same interval.
39136_2022-10-25_2022-10-26.omm (1.4 KB)
39136_2022-10-18_2022-10-26.omm (10.0 KB)
Beesat2_results_oneweek.txt (835 Bytes)
Beesat2_results_oneday.txt (83 Bytes)

Hello @andfio, @dl00718,

I was thinking back about this issue and I wanted to understand further: do you think we should allow the TLEPropagator to let the user choose the state (s)he wants to retrieve, meaning osculating or mean ?
Something along the lines of what is already done in DSST, Brouwer-Lyddane or Eckstein-Hechler propagators ?

@andfio I’ve looked very quickly at the paper you mentioned but there are dozens of equations in the annexes so I didn’t take the time to pinpoint the right ones :exploding_head:

Hello @MaximeJ,

If I am correct, as of now the user cannot retrieve the mean elements associated with the TLE but only access the osculating ones using the TLE propagator.

I think this could be a useful addition! Maybe in the form of a TLE.TLEtoMeanState() method ?

As for the paper, I had mentioned it thinking about part A. in the Appendix B: SGP4 Model (citation corrected thanks @MaximeJ )(sorry for not pointing to this in the original post!). That is where it is explained how to retrieve the mean semi-major axis value from the mean motion value provided in the TLE.


Thank you @andfio.

I think the same!
If we want to have the same semantic as in BL, EK and DSST I think we should add a static method computeMeanOrbit.

No problem.
I thought from reading the paper that PPT3 (for Naval Space Command TLEs) and SGP4/SDP4 (for US Space Command TLEs) were two different implementations (see the “Operational Implementations: 1964-1979” part of the paper). And we’re using SGP4/SDP4 for TLE propagation right ?
So I’m not sure we can apply the PPT3 logic to our TLEPropagator… (I may be wrong, I’m not really proficient with these models)


I cited the wrong partof the paper, what I had in mind was the initialization procedure outlined in part A Appendix B. concerning the SGP4 model.

Have a nice week-end,

Hi @MaximeJ and @andfio ,

I really need this feature too. Many many days ago, I asked this feature.

Could someone open an issue in the Gitlab repository for the addition of this feature?

Hi @lirw1984,

As Bryan said, you should open an issue on the forge when you want a feature implemented, otherwise it won’t be remembered.
Could you do it ?

Hi @MaximeJ and others,

Sorry for late. I did not done the thing.

I see that you have done it. (Add possibility to get mean elements from TLE propagators (#990) · Issues · Orekit / Orekit · GitLab)

Hi all,

Yes I did, sorry @lirw1984 I forgot to mention it on this thread.