def approximateOrbit(object1, object2, epoch): if object2.epoch == object1.epoch: proportion = 0 else: proportion = (epoch - object1.epoch) / (object2.epoch - object1.epoch) if (0.95 < object1.ecc and object1.ecc < 1.05) or ( 0.95 < object2.ecc and object2.ecc < 1.05) or (object1.isElliptic != object2.isElliptic): state1 = object1.getStateByEpoch(epoch) state2 = object2.getStateByEpoch(epoch) return kepler.createOrbitByState( kepler.StateVector( kepler.Vector3( approximateNumber(state1.position.x, state2.position.x, proportion), approximateNumber(state1.position.y, state2.position.y, proportion), approximateNumber(state1.position.z, state2.position.z, proportion)), kepler.Vector3( approximateNumber(state1.velocity.x, state2.velocity.x, proportion), approximateNumber(state1.velocity.y, state2.velocity.y, proportion), approximateNumber(state1.velocity.z, state2.velocity.z, proportion))), object2.mu, epoch) if object1.isElliptic: ma = approximateAngle(object1.getMeanAnomalyByEpoch(epoch), object2.getMeanAnomalyByEpoch(epoch), proportion) else: ma = approximateNumber(object1.getMeanAnomalyByEpoch(epoch), object2.getMeanAnomalyByEpoch(epoch), proportion) if approximateNumber(object1.ecc, object2.ecc, proportion) < 0: print(object1.epoch, object2.epoch, epoch, proportion) print(approximateNumber(object1.ecc, object2.ecc, proportion)) print(object1) print(object2) return kepler.Orbit( approximateNumber(object1.ecc, object2.ecc, proportion), approximateNumber(object1.sma, object2.sma, proportion), approximateAngle(object1.aop, object2.aop, proportion), approximateAngle(object1.inc, object2.inc, proportion), approximateAngle( object1.loan + object1.getNodalPrecessionByEpoch(EARTH_R, EARTH_J2, epoch), object2.loan + object2.getNodalPrecessionByEpoch(EARTH_R, EARTH_J2, epoch), proportion), ma, epoch, approximateNumber(object1.mu, object2.mu, proportion), False)
def createOrbit(tle): date = datetime.datetime( tle['epoch_year'], 1, 1, 0, 0, 0, 0, tzinfo=TZ()) + datetime.timedelta(tle['epoch_time'] - 1) epoch = (date - datetime.datetime(2000, 1, 1, 12, 0, 0, 0, tzinfo=TZ())).total_seconds() meanMotion = tle['mean_motion'] / 86400 sma = (EARTH_MU / (2 * math.pi * meanMotion)**2)**(1 / 3) return kepler.Orbit(tle['ecc'], sma, deg2rad(tle['aop']), deg2rad(tle['inc']), deg2rad(tle['raan']), deg2rad(tle['ma']), epoch, EARTH_MU, False)