Fitting DSST to GPS data

Hello everyone !

I have “clean” GPS data as a List of SpacecraftStates and I’m trying to fit a DSST propagator by converting that list with the propagator converter method. However, this procedure only works when I use the initial state (i.e reducing my list of GPS data to 1 SpacecraftState) and it doesn’t work using the whole List. (It’s already really long and gives bad results to use 2 states).

Am I doing this wrong or am I missing something ? Please tell me. Also if there is a better way to do what I’m trying to do, feel free to tell me.

Thank you !

Hello @avades,

What is the frame of the GPS data measurements and the frame of your DSST propagator ?
How did you configure the DSST propagator and are you running it in OSCULATING mode ?

I’ve never tried using the converter with a DSST propagator.

I suggest you use a DSST orbit determination instead, you can have more control on what you do.
The idea is to convert your GPS position/velocity in an inertial frame (GCRF is the simplest), convert them to PV measurements and add these measurements to a BatchLSEstimator.
Beware that the PV measurements must be created in the same frame as the propagator, otherwise it won’t work at all.

Some examples to help you:

  • The tutorial DSSTOrbitDetermination. It’s a bit complex, it’s (almost) a full-fledge standalone orbit determination application.
    You don’t need everything from it (no YAML inputs, no station data to parse etc.).
    Try to reproduce the “run” method from AbstractOrbitDetermination class specializing it for a DSST propagator and simply using your PV measurements as inputs…
    Also you can re-use the OrbitDeterminationObserver. It’s nice because it will let you see what happens at each iteration of the OD process.
  • In the test suite of Orekit: Basics - DSSTBatchLSModelTest / Advanced - DSSTOrbitDeterminationTest (here one of the tests

Hope this helps,

Hello @MaximeJ and thanks for the detailed answer !

I’ve managed to use GPS data as PV measurements and estimate the orbit with a BatchLSEstimator. However, my primary goal was to obtain the mean elements through the DSST propagation. It doesn’t seem that the same process is working when changing the propagation type of the builder to MEAN: I get the error “sample for interpolation is empty”. I was thinking of simply fitting a mean propagator on the osculating one but is there a better way ?

Hi @AVades,

The batch LS DSST estimator currently only estimates osculating states indeed. I think @bcazabonne wants to extend it to directly estimate the mean state but it won’t be available right away since there is quite some work involved.

What you could do is estimate using an osculating propagator. Then once you get the fully configured estimated propagator, relaunch the propagation in mean elements and retrieve the mean orbital states at the dates you need.
It’s a two step process but DSST propagation is usually very fast so it shouldn’t be a problem.

Another option would be to use a semi-analytical Kalman filter (see SemiAnalyticalKalmanEstimator or SemiAnalyticalUnscentedKalmanEstimator), this one can directly estimate the mean state. However working with Kalman is a bit trickier because you need to handle the covariance wisely.

Hope this helps,

Work in progress :sweat_smile: But it is not a straightforward task …

Thanks again @MaximeJ, I understand. I think relaunching the propagation in mean elements does the job for me already so I won’t adventure myself using the Kalman filter :smile: Anyways, thanks for the advice !

Hello again,

You mention that once I get the estimated propagator, I could relaunch the propagation in mean elements. As far as I know, it isn’t possible to change the propagation type of a DSST propagator and run it again. What I did was to run the osculating and extracting the mean SMA by using the DSSTPropagator.computeMeanState() and use the osculating states.

What would also be possible is to use a propagator converter again and fit a mean DSST propagator on the estimated osculating one. What would be the best way ?

Thanks for your help !

Hello again @AVades,

You’re right, I wasn’t aware of that. @bcazabonne is there a physical reason why the propagation type cannot be changed ?
Is it a protection for avoiding a user to set a mean propagation for a NumericalPropagator ?

I may be wrong because I’m not an expert in DSST.
But what if you simply rebuild a new DSSTPropagator (with MEAN propagation type) using the estimated one and set the initial state with setInitialState(estimatedState, PropagationType.OSCULATING) ?

The estimated DSST propagator keep the propagation type of the initial propagator configuration. Because the DSST Batch LS OD is not able to estimate directly mean elements, the propagation type of the initial orbit propagator must be OSCULATING to have a consistent estimated state.
Updating this behavior is part of my current works to improve DSST batch LS OD. The objective is to have something close to the behavior of the Extended Semi-analytical Kalman Filter.

To my mind, it is currently the best thing to do.

DSSTPropagator propagator = new DSSTPropagator(integrator, PropagationType.MEAN); 
for (DSSTForceModel model : estimatedPropagator.getAllForceModels()) {
propagator.setInitialState(estimatedState, PropagationType.OSCULATING);

Thanks for your replies. I’ll do that way then !

DSSTPropagator propagator = new DSSTPropagator(integrator, PropagationType.MEAN); 
for (DSSTForceModel model : estimatedPropagator.getAllForceModels()) {
propagator.setInitialState(estimatedState, PropagationType.OSCULATING);