Hello,
I’m trying to simulate several maneuvers, and as I want to compute each maneuver after the previous one, I was planning to use the StopOnEvent handler for the maneuvers, however it does not seem to stop the propagation Am I misinterpreting the expected behavior or is there a bug? I did not found a “PythonStopOnEvent”
Here is a small example with the legacy python wrapper (13.0.1), a numerical propagation and some impulse maneuvers:
# Orekit Init
import orekit
from orekit.pyhelpers import setup_orekit_curdir
vm=orekit.initVM()
setup_orekit_curdir(from_pip_library=True)
import math
from orekit.pyhelpers import setup_orekit_curdir, absolutedate_to_datetime
from org.orekit.attitudes import LofOffset, FrameAlignedProvider
from org.orekit.bodies import CelestialBodyFactory, OneAxisEllipsoid
from org.orekit.forces.gravity import HolmesFeatherstoneAttractionModel
from org.orekit.forces.gravity.potential import GravityFieldFactory
from org.orekit.forces.maneuvers import ImpulseManeuver
from org.orekit.orbits import CircularOrbit, PositionAngleType
from org.orekit.propagation import SpacecraftState, PropagationType
from org.orekit.propagation.conversion import DormandPrince853IntegratorBuilder, NumericalPropagatorBuilder, PropagatorBuilder
from org.orekit.propagation.events import NodeDetector, EventsLogger
from org.orekit.propagation.events.handlers import StopOnIncreasing, StopOnDecreasing, StopOnEvent, ContinueOnEvent, PythonEventHandler
from org.orekit.time import AbsoluteDate, TimeScalesFactory
from org.orekit.utils import Constants, IERSConventions
from org.orekit.frames import FramesFactory, LOFType
from org.hipparchus.geometry.euclidean.threed import Vector3D
# Init State
epoch = AbsoluteDate(2027, 1, 1, 0, 0, 0.0, TimeScalesFactory.getUTC())
sma = 6378e3+450e3
ecc = 1e-4
inc = math.radians(97.6)
AoP = math.radians(90.0)
raan = math.radians(250.0)
anoT = math.radians(0.0)
init_orb = CircularOrbit(sma, ecc*math.cos(math.radians(AoP)), ecc*math.sin(math.radians(AoP)), inc, raan, anoT+AoP, PositionAngleType.MEAN, FramesFactory.getEME2000(), epoch, Constants.IERS2010_EARTH_MU)
init_state = SpacecraftState(init_orb, 100.0)
# Build propagator
min_step = 1e-6
max_step = 600.0
position_tolerance = 1e-2
integrator_builder = DormandPrince853IntegratorBuilder(min_step, max_step, position_tolerance)
propagator_builder = NumericalPropagatorBuilder(init_state.getOrbit(), integrator_builder, PositionAngleType.TRUE, 1.0)
propagator_builder.setMass(init_state.getMass())
## Add forces from potential
earth_frame = FramesFactory.getITRF(IERSConventions.IERS_2010, True)
earth = OneAxisEllipsoid(Constants.IERS2010_EARTH_EQUATORIAL_RADIUS,
Constants.IERS2010_EARTH_FLATTENING,
FramesFactory.getITRF(IERSConventions.IERS_2010, True))
moon = CelestialBodyFactory.getMoon()
sun = CelestialBodyFactory.getSun()
# Earth gravity
gravity_provider = GravityFieldFactory.getNormalizedProvider(10, 10)
propagator_builder.addForceModel(HolmesFeatherstoneAttractionModel(earth_frame, gravity_provider))
propagator = PropagatorBuilder.cast_(propagator_builder).buildPropagator()
# OCM
dv_norm = 10.0 # m/s
isp = 1000.0
ocm_detector = NodeDetector(init_orb, init_state.getFrame()).withHandler(StopOnEvent())
logger = EventsLogger()
logged_ocm_detector = logger.monitorDetector(ocm_detector)
# Maneuver commanding in VNC
attitude_provider = LofOffset(FramesFactory.getEME2000(), LOFType.VNC)
ocm = ImpulseManeuver(logged_ocm_detector, attitude_provider, Vector3D.PLUS_I.scalarMultiply(dv_norm), isp)
propagator.addEventDetector(ocm)
# Propagate and check
propagator.propagate(init_state.getDate())
end_state = propagator.propagate(init_state.getDate().shiftedBy(init_state.getOrbit().getKeplerianPeriod()))
print(f'Δsma = {end_state.getOrbit().getA()-init_state.getOrbit().getA()} m')
print(f'Δepoch = {end_state.getDate().durationFrom(init_state.getDate())} (Tkep = {init_state.getOrbit().getKeplerianPeriod()} s)')
for event in logger.getLoggedEvents():
print(f'Recorded OCM at {absolutedate_to_datetime(event.getState().getDate())}')
I have two recorded events, but the propagator stops at the propagation epoch and not on the first event. The maneuvers have been applied (confirmed by the sma change… even if it’s not clean to check the osculating sma at 2 different epochs, but the dV is laerge enough to see the effect without a doubt):
Δsma = 36123.069148475304 m
Δepoch = 5615.019245661808 (Tkep = 5615.019245661808 s)
Recorded OCM at 2027-01-01 00:23:25.233224
Recorded OCM at 2027-01-01 01:10:39.987876