Drag Area changing Control during Propagation

I have been propagating two satellites launched simultaneously with the same starting orbital parameters and physical parameters, the only difference between the two being their drag areas, one being High Drag (HD) and the other Low Drag (LD).

I would like to toggle the drag configuration on the fly during each propagation step based on their relative distance (e.g if distance more than 500km, Satellite A toggles drag configuration to attempt and close the distance). However, the closest I have gotten is by the following code:

        propagator.resetInitialState(pv_state)
        propagator.removeForceModels()
        propagator = add_dsst_force_models(propagator, earth, max_drag=False) #add all force models back.

Here I try to set a new initialState to the previous propagator, remove the force models and then add them all back.

The current drag model I am using is a simple Isotropic Drag Model.

        cswl = CssiSpaceWeatherData("SpaceWeather-All-v1.2.txt")

        atmosphere = NRLMSISE00(cswl, CelestialBodyFactory.getSun(), earth)

        cd = 2.2
        isotropic_drag = IsotropicDrag(cross_section, cd)

        drag_force = DragForce(atmosphere, isotropic_drag)

        propagator.addForceModel(drag_force)

Is this the right way to do it? I took a look at EventDetectors but I didn’t see much else that helped, maybe I might have missed it. I know that TimeSpanDragForce does not help me, as the condition is distance-based instead of time-based.

I’m currently trying to emulate a few research papers I’ve found online, namely this one:
Autonomous Control of Small Satellite Formations using Differential Drag which was done in MATLAB. Hoping to find a solution within Orekit.

Hello @hubert and welcome to the Orekit forum !

Based on my understanding, it is possible to do what you want :

Parameter driver

You will need to work with the ParameterDriver class, they allow you to update specific parameters (in this case, the drag coefficient) while propagation is ongoing. You can get them from your isotropic_drag variable like this :

List<ParameterDriver> drag_drivers = isotropic_drag.getDragParametersDrivers()

Then you need to select the one you want i.e, the drag coefficient (they use the public static string shown in the documentation ) and set its new value using “setValue()” (see the ParameterDriver documentation for the complete list of available methods). To do so, see the next section.

Event detector & event handler

Now, to update this driver when your specific condition is reached, you will need to use a combination of EventDetector and EventHandler (respectively this and this)

From your code sample, i guess that you are using the python wrapper or Orekit. You already mentioned event detectors in your question but just in case, here is the link to see how to add an EventDetector when using the python wrapper : examples/4_Event_Detectors.ipynb · master · Orekit Labs / Orekit Python Wrapper · GitLab.

I hope this will help you in your work and please feel free to ask any questions you may have.

Cheers,
Vincent

1 Like