Hi @petrus.hyvonen,
thank you very much for your suggestion. Unfortunately I’m still getting the java error:
orekit.JavaError: <super: <class 'JavaError'>, <JavaError object>>
Java stacktrace:
java.lang.RuntimeException: type error
at org.orekit.propagation.events.PythonEnablingPredicate.eventIsEnabled(Native Method)
at org.orekit.propagation.events.EventEnablingPredicateFilter.g(EventEnablingPredicateFilter.java:150)
at org.orekit.forces.maneuvers.ImpulseManeuver.g(ImpulseManeuver.java:160)
at org.orekit.propagation.integration.AbstractIntegratedPropagator$AdaptedEventDetector.g(AbstractIntegratedPropagator.java:777)
at org.hipparchus.ode.events.EventState.reinitializeBegin(EventState.java:175)
at org.hipparchus.ode.AbstractIntegrator.acceptStep(AbstractIntegrator.java:299)
at org.hipparchus.ode.nonstiff.RungeKuttaIntegrator.integrate(RungeKuttaIntegrator.java:170)
at org.orekit.propagation.integration.AbstractIntegratedPropagator.integrateDynamics(AbstractIntegratedPropagator.java:416)
at org.orekit.propagation.integration.AbstractIntegratedPropagator.propagate(AbstractIntegratedPropagator.java:372)
at org.orekit.propagation.integration.AbstractIntegratedPropagator.propagate(AbstractIntegratedPropagator.java:340)
I paste here my Python code that sets up the propagator:
def setup_propagator(self, inertialFrame, dt, eclipses=False):
'''
sets up orbit propagator and events detectors
'''
orbitType = OrbitType.EQUINOCTIAL
integrator = ClassicalRungeKuttaIntegrator(dt)
self.prop = NumericalPropagator(integrator)
self.prop.setOrbitType(orbitType)
self.prop.setAttitudeProvider(LofOffset(inertialFrame, LOFType.VNC))
# Gravity
gravityField = HolmesFeatherstoneAttractionModel(FramesFactory.getITRF(IERSConventions.IERS_2010, True), GravityFieldFactory.getNormalizedProvider(2, 0))
self.prop.addForceModel(gravityField)
# Eclipses
if eclipses:
eclipseDetectorWithLogger = EclipseDetector(sun, Constants.SUN_RADIUS, earth).withUmbra().withHandler(ContinueOnEvent())
self.logger = EventsLogger()
loggedDetector = self.logger.monitorDetector(eclipseDetectorWithLogger)
self.prop.addEventDetector(loggedDetector)
# Nodes
NodesDetector = NodeDetector(inertialFrame).withHandler(ContinueOnEvent())
self.NodesLogger = EventsLogger()
NodesloggedDetector = self.NodesLogger.monitorDetector(NodesDetector)
self.prop.addEventDetector(NodesloggedDetector)
I paste here my Python code that inserts the maneuver in the propagator object (notice the predicate definition as you suggested me):
def add_impulsive_maneuver(self,inertialFrame,firingDate,mandv,isp):
'''
This method inserts an impulsive maneuver in the propagator. Rules:
- in plane maneuvers trigger: firingDate
- out of plane maneuvers trigger: first Acending Node after firingDate
'''
attitudeOverride = LofOffset(inertialFrame,LOFType.VNC) # Align attitude with VNC frame
if abs(mandv.getY()) > 1e-3: # If 2nd component of delta-v is non zero, this is an out of plane maneuver:
ascendingNodeStopper = NodeDetector(inertialFrame).withHandler(StopOnIncreasing()) # stop at 1st ascending node
class MyPredicate(PythonEnablingPredicate): # MyPredicate class definition
def eventIsEnabled(self, state, detector, g): # eventIsEnabled method definition
state.getDate().isAfterOrEqualTo(firingDate) # enable event after input firing date
predicate = MyPredicate().of_(NodeDetector) # define predicate object
triggers = EventEnablingPredicateFilter(ascendingNodeStopper, predicate) # define trigger as ascending node stopper with predicate
else: # This is an in plane maneuver:
triggers = DateDetector(firingDate) # define trigger as date detector at firing date
impMan = ImpulseManeuver(triggers, attitudeOverride, mandv, isp) # define impulse maneuver
self.prop.addEventDetector(impMan) # add maneuver to the propagator with event detector method
I paste here my Python code that propagates:
def propagate(self, startDate, finalDate, dt):
'''
propagates from startDate to finalDate with dt step
'''
self.prop.setInitialState(self.pv) # set initial spate with self object opv (position velocity)
states = [] # init states array
while (startDate.compareTo(finalDate) <= 0.0): # If startDate is earlier than finalDate:
states.append(self.prop.propagate(startDate)) # append spacecraft state after propagation
startDate = startDate.shiftedBy(dt) # [AbsoluteDate] increase current date by dt
[self.java_state_list.add(s) for s in states] # save states to java list
self.pv = states[-1] # save last state
The error occurs in this last method, while propagating, in line:
states.append(self.prop.propagate(startDate)) # append spacecraft state after propagation
What am I doing wrong?
Thank you so much for your support.
Kind Regards,
Alfredo