[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Orekit Users] Mimic TLEPropagator with Numerical?



Hello All,

I am new in using OREKIT. I was wondering if its possible to mimic
TLEPropagator by incorporating similar force models into a Numerical
propagator. Basically, I am trying to replicate the results of the "Satellite
Orbital Conjunction Reports Assessing Threatening Encounters in
Space" (SOCRATES) that are given in the celestrak
website :http://celestrak.com/cgi-bin/searchSOCRATES.pl?IDENT=NAME&NAME_TEXT1=&NAME_TEXT2=&ORDER=MINRANGE&MAX=10

I am able to get exact (very closer : +/-0.1 seconds) closest approach
results, but not with a Numerical Propagator (with J2 perturbations). I am
aware TLEprop is based on SGP4/SDP4 model but I wonder if it is possible to
bring that model into Numerical. Because I would like to experiment by
applying small delta-Vs to the state to increase the closest approach distance
which cannot be done within a TLEPropagator.

I used something like this(in Python):

objA_tle = TLE("1 40037U 14033AD  17085.78642693  .00000199  00000-0  28987-4
0  9998",
"2 40037  97.9175 354.9522 0013624 210.8425 149.1991 14.86189764149576")
objB_tle = TLE("1 16263U 85108B   17085.79797911  .00000114  00000-0  11121-4
0  9997",
"2 16263  82.5064 191.6062 0018606 258.6047 216.3527 14.82975072692179")

propagator_tleA = TLEPropagator.selectExtrapolator(objA_tle)
propagator_tleB = TLEPropagator.selectExtrapolator(objB_tle)

epo_objA = objA_tle.getDate()
epo_objB = objB_tle.getDate()
pvA_init = propagator_tleA.propagate(epo_objA).getPVCoordinates()
pvB_init = propagator_tleB.propagate(epo_objB).getPVCoordinates()

initialOrbitA = CartesianOrbit(pvA_init_, inertialFrame, epo_objA, mu)
initialOrbitB = CartesianOrbit(pvB_init_, inertialFrame, epo_objB, mu)



def NumProp(initialOrbit, orbitType):

    #Setup Propagator
    minStep = 0.001;
    maxstep = 1000.0;
    initStep = 10.0
    positionTolerance = 1e-2
    initialState = SpacecraftState(initialOrbit)
    tol = NumericalPropagator.tolerances(positionTolerance, initialOrbit,
orbitType)
    integrator = DormandPrince853Integrator(minStep, maxstep,
                                        JArray_double.cast_(tol[0]),  # Double
array of doubles needs to be casted in Python
                                        JArray_double.cast_(tol[1]))
    integrator.setInitialStepSize(initStep)

    propagator_num = NumericalPropagator(integrator)
    propagator_num.setOrbitType(orbitType)
    propagator_num.setInitialState(initialState)
    propagator_num.setEphemerisMode()
    return propagator_num


propagator_numA = NumProp(initialOrbitA, orbitType)
propagator_numB = NumProp(initialOrbitB, orbitType)

itrf    = FramesFactory.getITRF(IERSConventions.IERS_2010, True)
gravityProvider = GravityFieldFactory.getNormalizedProvider(10,10)
gravity = HolmesFeatherstoneAttractionModel(itrf, gravityProvider)

propagator_numA.addForceModel(gravity)
propagator_numB.addForceModel(gravity)


Best,
Justin