Improving time consumption when generating measurements

Hello,

I am using Orekit to simulate a great amount of satellite orbits (with certain force models) for a fictional constellation. This comes with no problem, and after executing my code I end up with a Python list of SpacecraftState and the propagator I have used in each particular satellite. My idea is to simulate a set of Range measurements for each satellite with respect to a GroundStation (previously defined), and I would like to do it for several stations.

The problem rises with the time it takes to simulate those measurements, as it needs around half an hour to generate the range values for 20 satellites, and my constellation extends to almost 300. I am using the following code (sorry if it is unclear) to generate the measurements:

for sat in satList:

  •        generator = Generator()*
    
  •        generator.addPropagator(satDict[sat]["Prop"])*
    
  •        *
    
  •        measBuilder = RangeBuilder(None , gss, False, 0.00000001, 1.0, ObservableSatellite(0))*
    
  •        datesSel = FixedStepSelector(sampling, gpst)*
    
  •        scheduler = ContinuousScheduler(measBuilder, datesSel)*
    
  •        generator.addScheduler(scheduler)*
    
  •        *
    
  •        measJavaSet = generator.generate(startDate, endDate)*
    

where gss is the GroundStation object previously set and satDict[sat][“Prop”] is the propagator used in the orbit propagation step of my program (not shown here).

Do you have any suggestions on how can I make the generation run faster?

Please do not hesitate to ask me for more context on the code or about anything unclear about my problem.

Thank you and best regards,
GG

Hi @GuilleGarlo welcome,

The first thing I would suggest is to use an event based scheduler instead of a continuous scheduler, it will take care of station/satellite visibility when configured with an elevation detector.

The second thing would be to try using the Orekit version from the development branch because a fix as been introduced in the last few days exactly for this puprpose: simulating lots of measurements for constellations (this is issue 1157. This however would require you to build the Python wrapper by yourself as it is a development branch.

Also beware that you should really use the ObservableSatellite that was returned by each call to addPropagator when creating the various RangeBuilders. In the code above, you create a new ObservableSatellite and it refers only to the first propagator (at index 0), this is probably not what you want.

For what its worth, I am currently doing this kind of measurements generation and I am able to generate about 1.3 millions measurements (code, phase and Doppler) for a 24 satellites constellation and 2 grounds stations in 112 seconds, including Rinex files writing.

1 Like

Hello Luc,

Thank you very much for your suggestions. It is true that the ObservabeSatellite I should be using really needs to be the one it is returned when adding the propagator. Also, changing the scheduler from a ContinuousScheduler to an EventBasedScheduler only generates those measurements whose line of sight is physically available, which makes way more sense than generating all measurements for the whole timespan.

Regarding what you said about changing my Orekit version to the development branch, I am not familiar with Java, that is why I am using the Python wrapped verision. If I understood correctly, for the Python version there is still not a way to use a PropagatorsParallelizer to generate measurements, is it right?

Thanks again,
GGGL

Hi @GuilleGarlo,

Although I haven’t used it myself, I think there are people who are using PropagatorsParallelizer in Python, see for example the thread at:

But I have unfortionately not got any confirmed examples to share.
If you run into issues, please let us know in detail what is not working, and preferably with runnable code that is expected to work?
Regards