Orbit determination from a TDM file and a TLE reference

Hello everyone !

I’m currently using the Orekit Python wrapper. I want to perform orbit determination from a TDM file, with a reference TLE.

I read the content of my TDM file, which contains AZEL angles (the ANGLE_1 and ANGLE_2 field, in the ObservationType Orekit Enum), a DOPPLER_INSTANTANEOUS field and RANGE field. To be more precise, it’s like :

ANGLE_1 = 2021-05-08T02:43:51.3006590 106.100186
ANGLE_2 = 2021-05-08T02:43:51.3006590 20.694046
DOPPLER_INSTANTANEOUS = 2021-05-08T02:43:51.3006590 6.702923828
RANGE = 2021-05-08T02:43:51.3006590 540.789500

and I’ve got something like 1000 measurements in my TDM file.

So I build a Tdm object from these measurements. I take a TLE file, of course from the same satellite, and I build a TLEPropagator. I propagate the TLE, and finally I can get a KeplerianOrbit. This KeplerianOrbit is my reference orbit.

After that, I create an estimator, with a DormandPrince integrator, a NumericalPropagatorBuilder from my reference orbit, a matrix decomposer and an optimizer to use a BatchLSEstimator to perform orbit determination.

I add all of my measurements contained in my TDM file in the estimator, and I run estimator.estimate().

Finally, I get an error :
the Jacobian matrix associated to the KEPLERIAN type is singular for the current orbit.

I’m new on Orekit, so I’m not sure to understand everything of what I’m doing ahah but I don’t think that I’m doing something wrong, because finally the reference orbit obtained from the TLE is more precise than an IOD, and the measurements from the TDM file can improve the precision of the final orbit determination.

Here is my code, joined in the topic.

Thank you very much for reading my post !

Détermination d’orbite avec TDM et TLE de référence.py (15.7 KB)

Hi @paulolvsq

Could you try to convert your initial KeplerianOrbit (i.e., keplerianOrbit parameter in your code) to CartesianOrbit ? And use this CartesianOrbit to initialize the NumericalPropagatorBuilder.

keplerianOrbit = KeplerianOrbit(propagator.propagate(newDate, finalDateTle).getOrbit())
cartesianOrbit = OrbitType.CARTESIAN.convertType(keplerianOrbit)

This will allow estimating cartesian elements during the OD and avoiding singularity issues.

Best regards,

Hi !

Thanks for your answer.

I tried your solution, and now I get : impossible to calculate the hyperbolic eccentric anomaly from the average anomaly after 50 iterations

I don’t really understand why. Any ideas ?

Thank you very much again for your time and your answer.


Hi Paul,

A few thoughts about your OD:

  • The estimator and propagator parameters look correct, the OD should converge without too much difficulty (convergence threshold 1e-2)
  • Is the epoch of the TLE (used as a first guess) close to the timestamp of the measurements?
  • Are the AzEl measurements in radians? The best would be to provide us with the TDM file
  • The sigma of the AzEl measurements is 1 radian here, it’s definitely too much
  • Your OD script only makes use of AzEl measurements, the doppler or range data are not added to the estimator. If only a few ground station passes are available, with only AzEl measurements, that might explain why the estimator is not able to converge


Hi Clément !

I tried to follow your tips :

  • When I propagate the TLE, I choose to propagate in order to get the TDM epoch “just between” the propagation. For example, if the epoch of my TDM is April 25, I propagate the TLE from April 24 to 26. And the TLE epoch is the same as the TDM one, same day but not especially same hour. When I propagate the TLE, I perform something like “retro propagation”.
  • The AzEl measurements are in degrees, so as you told me it’s an error, I didn’t do the conversion. Now it’s done, I juste use math.radians(value) to perform the conversion.
  • I choose 0.02 for the sigma now. You were right, 1 is too much.
  • I create a range_measurement value : range_measurement = Range(station, True, epoch[i], rng[i], sigma[0], weight[0], satellite) and I add this measurement to my estimator.

It’s still the same error.

Here is my code.
Détermination d’orbite avec TDM et TLE de référence.py (15.9 KB)

And here is my TDM file.
TDM-file.tdm (263.4 KB)

Thank you very much for your help and your answer !

Best regards,

I quickly ran your script. A few more thoughts:

  • The range is in kilometers and must therefore be multiplied by 1000 before being passed to Orekit. And I recommend you define a separate sigma value for the range
    • But even after this fix, the estimator still does not converge
  • When mixing different sort of measurements, it is very important to properly tune the weight and sigma of the different types of measurements
  • You could also feed the Doppler data as an Orekit RangeRate measurement: RangeRate (ORbit Extrapolation KIT 11.1 API)
  • Your tracking data is a single pass whose duration is slightly more than 2 minutes. I am not an expert in orbit determination but this could prove challenging.

Thank you for your answer and your time !

Here is my code, I followed your advices, but I still get the same error. I don’t really understand the importance of the sigma and weight choice.

And I don’t know if the fact that the TDM measurement lasts only two minutes has an influence on the orbit restitution. As I said, I’m new on Orekit ahah and I’m not sure to understand everything I’m doing…

Détermination d’orbite avec TDM et TLE de référence(1).py (16.3 KB)

Some more thoughts:

  • You might want to add perturbation forces to the model, at least atmospheric drag, gravity harmonics, and third-body attraction from the Sun and the Moon, and maybe solar radiation. You can find an example here, although this notebook is slightly outdated and would need a good rework: laser-orbit-determination/02-orbit-determination-example.ipynb at master · GorgiAstro/laser-orbit-determination · GitHub
  • If you want to learn more about the issues involved by short measurement arcs, you can read section 4.12 “Observability” of this book: Schutz, B., Tapley, B., & Born, G. H. (2004). Statistical orbit determination