示例#1
0
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)
示例#2
0
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)