Thanks Bryan for your reply, it helped me!
I have modified my code, switching to the Eckstein Hechler propagator, and made this test:
isp = 280.0
mandv = Vector3D(0.0, 2000.0, 0.0) # delta-v in VNC orbital reference frame
inertialFrame = FramesFactory.getEME2000()
dt = 60.0 # [s] propagation time step
startDate = AbsoluteDate(2002, 5, 7, 12, 0, 0.0, TimeScalesFactory.getUTC())
manT = 60*60.0 # [s] man time from simulation start (it's at node)
simDur = 3.5*60*60.0 # [s] simulatioun duration
satelliteName = 'SPOT-5'
tle_line1 = "1 27421U 02021A 02124.48976499 -.00021470 00000-0 -89879-2 0 20"
tle_line2 = "2 27421 98.7490 199.5121 0001333 133.9522 226.1918 14.26113993 62"
finalDate = startDate.shiftedBy(simDur)
tle = TLE(tle_line1,tle_line2)
TLEepoch = tle.getDate()
# set up an attitude law dedicated to the maneuver
attitudeOverride = LofOffset(inertialFrame,LOFType.VNC)
# maneuver will start at a known date and stop after a known duration
firingDate = AbsoluteDate(startDate, manT)
print('TLE Epoch: '+TLEepoch.toString())
print('Sim Start: '+startDate.toString())
print(' Man time: '+firingDate.toString())
print(' Sim Stop: '+finalDate.toString())
triggers = DateDetector(firingDate)
# Impulse maneuver definition
impMan = ImpulseManeuver(triggers, attitudeOverride, mandv, isp)
# wrap-up everything in a propagator
propagatorTLE = TLEPropagator.selectExtrapolator(tle)
# Build a spacecraft state based on the input TLE using TLE propagation model
spacecraftState = propagatorTLE.propagate(TLEepoch)
# Intialize the Eckstein-Hechler model
propagatorEck = EcksteinHechlerPropagator(spacecraftState.getOrbit(), GravityFieldFactory.getUnnormalizedProvider(6, 6))
# Create the maneuver, add the maneuver to the Eckstein-Hechler model, and perform the orbit propagation to simDur epoch
# run simulation
I can see the inclination maneuver effect that I expected! So, the maneuver is being taken into account during propagation.
Now, if I replace the maneuver direction from Normal to Velocity:
mandv = Vector3D(2000.0, 0.0, 0.0) # delta-v in VNC orbital reference frame
I get the following error in the last line (propagation):
orekit.JavaError: <super: <class 'JavaError'>, <JavaError object>>
org.orekit.errors.OrekitException: too large eccentricity for propagation model: e = 0.61
I understand that this is happening because the (big) Along-Track maneuver modifies the orbit eccentricity too much, pushing it out of the limits that the Eckstein Hechler propagator can manage. In fact, from its class description I can read:
The Eckstein-Hechler model is suited for near circular orbits (e < 0.1, with poor accuracy between 0.005 and 0.1) and inclination neither equatorial (direct or retrograde) nor critical (direct or retrograde).
I’d like to use an analytical propagator that can handle maneuvers of any size and any post-maneuver orbital elements. Since I’m performing a preliminary mission analysis, I don’t have precision requirements, but, instead, I have computational speed requirements. That’s why my first guess was using TLEs and the TLEPropagator (for its speed), but, as you explained before,
the state of the
TLEPropagator cannot be reinitialized during an orbit propagation
Although it is not correct, is it possible to consider the following workaround for TLE propagation and impulsive maneuvers?
- propagate a TLE up to the maneuver time
- convert it to SpacecraftState
- applying the maneuver
- get a post-maneuver SpacecraftState
- generate a new TLE from post-maneuver SpacecraftState (how?)
- propagate the new TLE up to the next maneuver
If the above workaround is not an option, which Orekit analytical propagator would you recommend to handle any maneuver and any orbit?
Should I consider switching to a semi-analytical propagator, like the DSSTPropagator? Which limitations does it have?
Thank you very much,