Integrator, propagator and perturbers for asteroid ephemeris calculation

Dear all,

I need some hints about the integrator, propagator and perturbers to use in Orekit for asteroid ephemeris calculation (see Generating a JPL SPICE kernel using orekit ephemeris)
I also don’t know if it is possible to add to the list of perturbers a JPL kernel as the small pertuber “sb441-n16s.bsp”

Thanks in advance.

#-----------------------------------------------------------
    private def getPropagator(orb: Orbit) = {

      val tolerances = NumericalPropagator.tolerances(1, orb, OrbitType.CARTESIAN)
      val integrator = new DormandPrince853Integrator(0.0001, 36000, tolerances(0), tolerances(1))
      val propagator = new NumericalPropagator(integrator)
      propagator.setOrbitType(OrbitType.CARTESIAN)

      propagator.addForceModel(new NewtonianAttraction(orb.getMu))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getMercury))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getVenus))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getEarth))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getMoon))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getMars))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getJupiter))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getSaturn))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getUranus))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getNeptune))
      propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getPluto))


      propagator.setInitialState(new SpacecraftState(orb))
      propagator
  }
#-----------------------------------------------------------

Hi @rmorales

Maybe you can look at these two projects made by Hank Grabowski. I think they can be very useful for your application:

[1] HeliocentricDemos
[2] Top300Asteroids

You can also have a look on the following post

[3] Asteroid propagation not matching MPC results

In order to add a new Celestial body, you will need to create you own class by implementing the CelestialBody interface. You can find an example on Hank’s project with the JplHorizonsAsteroidCelestialBody.java class. You can also find valuable tips on the following post

[4] Own planetary bodies?

Best regards,
Bryan

Thank you Bryan,

I’ll take a look and I’ll publish the code when I find a solution based on your inputs.

Best regards.
Rafa.

Dear all,

After some research, in the case of centaurs and TNOs (my particular case), it is only necessary to include some planets as perturbators to obtain an average accuracy. For a general solution for any type of asteroid, it is necessary to include additional perturbators: Ceres, Pallas, Vesta…
In my particular case, the perturbators used are:


  //---------------------------------------------------------------------------
  private def addPerturberSeq(orb: Orbit, propagator: NumericalPropagator): Unit = {
    propagator.addForceModel(new NewtonianAttraction(orb.getMu))
    propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getEarthMoonBarycenter))
    propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getMars))
    propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getJupiter))
    propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getSaturn))
    propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getUranus))
    propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getNeptune))
    propagator.addForceModel(new ThirdBodyAttraction(CelestialBodyFactory.getPluto))
  }
  //---------------------------------------------------------------------------

You can find the complete code in:

src/main/scala/com/henosis/ephemeris/Orekit.scala · main · Rafael Morales / henosis · GitLab

The code is in Scala, but it can be easyl moved to Java.
I am still not happy with the final accuracy, so I will continue to investigate.

Best regards.

1 Like

Thanks a lot @samuele for sharing your code with us !

The magic of open source :grin: