Best Practices for Propagating LEO Satellite for long durations

Hello,

Currently I have the Keplerian Elements for a LEO satellite and would like to compute the position a year or so later under the influence of drag and gravitational perturbations.

I am brand new to this library and field so I would appreciate some pointers about which atmospheric model, integrator, and propagator would be best suited to a problem like this.

Thanks!

Hi @ReeceHumphreys

Welcome to the Orekit forum!

For orbit propagation with a long duration, I recommend you to use the DSST (Draper Semi-analytical Satellite Theory) orbit propagator. DSST is an orbit propagator based on a semi-analytical theory. It combines the accuracy of a numerical method with the characteristic speed of an analytical method.

DSST orbit propagator is represented by the object DSSTPropagator in Orekit.
You can easily initialize it with a numerical integrator and an enumerate telling if your initial orbit is defined with mean or osculating elements. With DSST propagator, you can use a variable step numerical integrator with big minimum and maximum integration steps (i.e. several orbits). It is a big advantage compare to the numerical orbit propagator. Indeed, with a numerical method your integration steps need to be small (i.e. between 1 millisecond and tens of seconds). To initialize the DSST propagator, please find a example below (I assume you already defined your initial SpacecraftState using your Keplerian elements).

    final SpacecraftState initialState = // Please define the initial state using the Keplerian elements

    // Initialize the DSST propagator
    final double minStep = initialState.getKeplerianPeriod();
    final double maxStep = 100. * minStep;
    final double[][] tol = DSSTPropagator.tolerances(1.0, initialState.getOrbit());
    final AdaptiveStepsizeIntegrator integrator = new DormandPrince853Integrator(minStep, maxStep, tol[0], tol[1]);
    final DSSTPropagator dsstProp = new DSSTPropagator(integrator, PropagationType.MEAN);
    dsstProp.setInitialState(initialState, PropagationType.MEAN);

Now, you have to add the force models to the DSST orbit propagator. Orekit’s DSST orbit propagator can consider zonal (represented by DSSTZonal class) and tesseral (represented by DSSTTesseral class) harmonics of the Earth’s potential, third body attraction (represented by DSSTThirdBody class), atmospheric drag (represented by DSSTAtmosphericDrag class), and solar radiation pressure (represented by DSSTSolarRadiationPressure class). Please find an example on how to add J2 and atmospheric drag to previously initialized DSST propagator.

    // Central Body geopotential 2x0 (J2 only)
    final UnnormalizedSphericalHarmonicsProvider provider = GravityFieldFactory.getUnnormalizedProvider(2, 0);
    // Atmosphere model
    final OneAxisEllipsoid earth = new OneAxisEllipsoid(provider.getAe(),
                                                        Constants.WGS84_EARTH_FLATTENING,
                                                        FramesFactory.getITRF(IERSConventions.IERS_2010, true));
    final Atmosphere atm = new HarrisPriester(CelestialBodyFactory.getSun(), earth, 6);
    // Spacecraft characteristics for atmospheric drag
    final double cd = 2.0;
    final double area = 1.0; // TODO To be updated with your spacecraft area
    // Add the force models to the propagator
    dsstProp.addForceModel(new DSSTZonal(provider));
    dsstProp.addForceModel(new DSSTTesseral(earth.getBodyFrame(), Constants.WGS84_EARTH_ANGULAR_VELOCITY, provider));
    dsstProp.addForceModel(new DSSTAtmosphericDrag(atm, cd, area, provider.getMu()));

And now, it’s time to do the propagation!

    // 3 years propagation
    final SpacecraftState finalState = dsstProp.propagate(initDate.shiftedBy(3. * Constants.JULIAN_YEAR));

Please note that I wrote the different codes directly in the forum, so they may contain some errors of “;” or “)” missing.

I hope this will help you.

Best regards,
Bryan

1 Like

You should also notice that propagating for one year with drag is doomed to failure.
Drag cannot be predicted much, even just one week in the future can be very wrong as atmospheric density changes fast due to space weather. It is custom to say that when a solar storm occurs, atmospheric density can double in just 3 hours in high atmosphere.
This is the reason why reentry predictions for decaying satellites are ridiculous months in advance (fallout area covering the whole Earth), very bad weeks in advance, bad days in advance and ground impact still corresponds to an elongated zone along the track hundreds of kilometers long hours in advance.

So what you can expect from a one year in advance simulation is only that your satellite is still in orbit or not, have a very rough range of altitude, but certainly not where it is in orbit.

1 Like

Thank you so much that definitely helps!

If have definitely noticed that while doing research. My goal is to propagate a bunch of small orbital debris fragments after fragmentation event. As such, the precision in the exact locations isn’t too import. The more important property is the overall debris cloud shape.

Would you recommend for this case using the SimpleExponentialModel rather than one of the more advanced models and reducing the the density so that drag occurs over a longer duration to avoid the spacecraft de-orbiting too soon?

SimpleExponentialModel would be sufficient for this kind of study.