Ejemplo n.º 1
0
def format_long_line(satrec, tsince, mu, r, v):
    """Long line, using the same format string that testcpp.cpp uses."""

    short = format_short_line(tsince, r, v).strip('\n')

    jd = satrec.jdsatepoch + satrec.jdsatepochF + tsince / 1440.0
    year, mon, day, hr, minute, sec = invjday(jd)

    (p, a, ecc, incl, node, argp, nu, m, arglat, truelon,
     lonper) = rv2coe(r, v, mu)

    return short + (' %14.6f %8.6f %10.5f %10.5f %10.5f %10.5f %10.5f'
                    ' %5i%3i%3i %2i:%2i:%9.6f\n') % (
                        a,
                        ecc,
                        incl * rad,
                        node * rad,
                        argp * rad,
                        nu * rad,
                        m * rad,
                        year,
                        mon,
                        day,
                        hr,
                        minute,
                        sec,
                    )
Ejemplo n.º 2
0
 def updateOrbitalParameters3(self, date=None):
     if (date is None):
         date = datetime.utcnow()
     year = date.year
     month = date.month
     day = date.day
     hour = date.hour
     minute = date.minute
     second = date.second + date.microsecond * 0.000001
     pos, vel = self.sat.propagate(year, month, day, hour, minute, second)
     p, a, e, i, raan, w, theta, m, argl, tlon, lonp = rv2coe(
         pos, vel, self.mu * 0.000000001)
     self.x = pos[0] * 1000
     self.y = pos[1] * 1000
     self.z = pos[2] * 1000
     self.r = sqrt(self.x**2 + self.y**2 + self.z**2)
     self.alt = self.r - self.getPlanetRadius()
     self.r_iner[0, 0] = self.x
     self.r_iner[1, 0] = self.y
     self.r_iner[2, 0] = self.z
     self.v_iner[0, 0] = vel[0] * 1000
     self.v_iner[1, 0] = vel[1] * 1000
     self.v_iner[2, 0] = vel[2] * 1000
     self.p = p * 1000
     self.a = a * 1000
     self.e = e
     self.incl = i
     self.RAAN = raan
     self.w = w
     self.theta = theta
     self.MA = m
     self.n = sqrt(self.mu / (self.a**3))
     self.h = sqrt(self.a * self.mu * (1 - self.e**2))
     self.v_peri[0, 0] = -self.mu * sin(theta) / self.h
     self.v_peri[1, 0] = self.mu * (e + cos(theta)) / self.h
Ejemplo n.º 3
0
def format_long_line(satrec, mu, r, v):
    """Long line, using the same format string that testcpp.cpp uses."""

    short = format_short_line(satrec, r, v).strip("\n")

    jd = satrec.jdsatepoch + satrec.t / 1440.0
    year, mon, day, hr, minute, sec = invjday(jd)

    (p, a, ecc, incl, node, argp, nu, m, arglat, truelon, lonper) = rv2coe(r, v, mu)

    return short + (" %14.6f %8.6f %10.5f %10.5f %10.5f %10.5f %10.5f" " %5i%3i%3i %2i:%2i:%9.6f\n") % (
        a,
        ecc,
        incl * rad,
        node * rad,
        argp * rad,
        nu * rad,
        m * rad,
        year,
        mon,
        day,
        hr,
        minute,
        sec,
    )
Ejemplo n.º 4
0
    def updateOrbitalParameters(self, date=None):
        """
        Updates all the orbital parameters with the SGP4 propagation
        model.

        date : datetime
               The orbital elements are updated for this date.
        """
        if (date is None):
            date = datetime.utcnow()
        year = date.year
        month = date.month
        day = date.day
        hour = date.hour
        minute = date.minute
        second = date.second + date.microsecond*0.000001
        pos, vel = self.sat_model.propagate(year, month, day,
                                            hour, minute, second)
        p, a, e, i, raan, w, theta, m, argl, tlon, lonp = rv2coe(pos, vel,
                                                           self.mu*0.000000001)
        self.x = pos[0]*1000
        self.y = pos[1]*1000
        self.z = pos[2]*1000
        self.r = sqrt(self.x**2 + self.y**2 + self.z**2)
        self.r_iner[0,0] = self.x
        self.r_iner[1,0] = self.y
        self.r_iner[2,0] = self.z
        self.v_iner[0,0] = vel[0]*1000
        self.v_iner[1,0] = vel[1]*1000
        self.v_iner[2,0] = vel[2]*1000
        self.p = p*1000
        self.a = a*1000
        self.e = e
        self.incl = i
        self.RAAN = raan
        self.w = w
        self.theta = theta
        self.MA = m
        self.n = sqrt(self.mu/(self.a**3))
        self.h = sqrt(self.a*self.mu*(1 - self.e**2))
Ejemplo n.º 5
0
def sgp4_ephemeris(coords, prediction_dates_list):
    r = coords[['x', 'y', 'z']].values
    v = coords[['Vx', 'Vy', 'Vz']].values
    ref_date = coords["epoch"]

    p, sma, ecc, inc, raan, arg_p, nu, mean_an, arglat, truelon, lonper = rv2coe(
        r, v, wgs72.mu)
    inc = math.degrees(inc)
    raan = math.degrees(raan)
    arg_p = math.degrees(arg_p)
    mean_an = math.degrees(mean_an)

    tle = params2tle(ref_epoch=ref_date,
                     inc=inc,
                     raan=raan,
                     ecc=ecc,
                     arg_p=arg_p,
                     mean_an=mean_an,
                     sma=sma)
    lines = tle2tle_lines(tle)
    sat = twoline2rv(lines[0], lines[1], wgs72)

    ephemeris = []
    for date in prediction_dates_list:
        date_ = epoch2datetime(date)
        y_ = date_.year
        m_ = date_.month
        d_ = date_.day
        h_ = date_.hour
        min_ = date_.minute
        sec_ = date_.second + date_.microsecond * 1e-6
        r, v = sat.propagate(y_, m_, d_, h_, min_, sec_)
        ephemeris.append([date] + list(r) + list(v))

    return pd.DataFrame(
        data=ephemeris,
        columns=['epoch'] +
        [c + "_sim_upd" for c in ['x', 'y', 'z', 'Vx', 'Vy', 'Vz']])
Ejemplo n.º 6
0
def test_epoch_methods():
    line00 = line0 + " Apogee"
    line1  =  "1 28888U 05042A   14063.83505828 0.00032100  00000-0  29747-3 0    09"
    # 3 iters
    # line10 = '1 28888U 05042A   14063.82545230 0.00032100  00000-0  29747-3 0    09'
    # 30 iters
    line10  = '1 28888U 05042A   14063.82545230 0.00032096  00000-0  29747-3 0    03' # satfit.cpp
    line100 = '1 28888T 05042A   14063.82545230 0.00032100  00000-0  29747-3 0    09' # Mine
            
    line2  =  "2 28888  96.8945 115.9842 0499287 308.6206  51.3792 14.85742003    02"
    # 3 iters
    #line20 = '2 28888  96.8945 115.9758 0499291 308.6530   0.0000 14.85741387    00'
    # 30 iters
    line20  = '2 28888  96.8945 115.9758 0499282 308.6530   0.0000 14.85741387    00' # satfit.cpp
    line200 = '2 28888  96.8945 115.9758 0499293 308.6530 360.0000 14.85742003    07' # mine


    # sat0 : Elements regressed to perigee by satfit.cpp TLE0 epoch
    TLE0 = tle_util.TruSatellite(line0=line00, line1=line10, line2=line20)
    sat0 = satfit.initsat(TLE0)
    sat0 = satfit.delta_t(sat0,sat0.jdsatepoch)

    # sat2 : Elements regressed to perigee by satfit.py TLE0 epoch
    TLE2 = tle_util.TruSatellite(line0=line00, line1=line100, line2=line200)
    sat2 = satfit.initsat(TLE2)
    sat2 = satfit.delta_t(sat2,sat0.jdsatepoch)

    # "satx: Original elements back-propagated to perigee (epoch of sat0)"
    TLE = tle_util.TruSatellite(line0=line0, line1=line1, line2=line2)
    sat1 = satfit.initsat(TLE)
    sat1 = satfit.delta_t(sat1,sat0.jdsatepoch) # Changing tsince changes the mean elements

    # satA : Elements created from sat0 mean elements after propagating to TLE0 epoch
    satA = copy.deepcopy(sat0)    
    satA = satfit.delta_el(satA,xincl=satA.im,xnodeo=satA.Om,ec=satA.em,omegao=satA.om,xmo=satA.mm,xno=satA.no_kozai,bsr=sat1.bstar, jdsatepoch=sat0.jdsatepoch)
    satA = satfit.delta_t(satA,sat0.jdsatepoch)

    # satB : Elements created from sat1 mean elements after propagating to TLE0 epoch
    satB = copy.deepcopy(sat1)    
    satB = satfit.delta_el(satB,xincl=satB.im,xnodeo=satB.Om,ec=satB.em,omegao=satB.om,xmo=satB.mm,xno=satB.no_kozai,bsr=sat1.bstar, jdsatepoch=sat0.jdsatepoch)
    # satB.jdsatepoch = sat0.jdsatepoch 
    # satB.jdSGP4epoch = satB.jdsatepoch - 2433281.5
    # satB.epoch_datetime = satfit.jday_to_datetime(satB.jdsatepoch)
    satB = satfit.delta_t(satB,sat0.jdsatepoch)


    # satr : Elements created from rv2coe from sat1x r,v vectors TLE0 epoch
    satr = copy.deepcopy(sat1)    
    (p, a, ecc, incl, omega, argp, nu, m, arglat, truelon, lonper) = rv2coe(satr.rr_km, satr.vv_kmpersec, satr.whichconst.mu)
    # satx = satfit.delta_el(sat1,xincl=sat1.inclo,xnodeo=sat1.nodeo,ec=sat1.ecco,omegao=sat1.argpo,xmo=sat1.mo,xno=sat1.no_kozai,bsr=sat1.bstar)
    mean_motion = sqrt(satr.whichconst.mu/(pow(a,3)))*60.0 # radians per minute
    satr = satfit.delta_el(satr,xincl=incl,xnodeo=omega,ec=ecc,omegao=argp,xmo=m,xno=mean_motion,bsr=satr.bstar, jdsatepoch=sat0.jdsatepoch)
    # satr.jdsatepoch = sat0.jdsatepoch 
    # satr.jdSGP4epoch = satr.jdsatepoch - 2433281.5
    # satr.epoch_datetime = satfit.jday_to_datetime(satr.jdsatepoch)
    satr = satfit.delta_t(satr,sat0.jdsatepoch)


    print()
    print("sat1: Original elements back-propagated to perigee (epoch of sat0)")
    print("sat2 : Elements regressed to perigee by satfit.py TLE0 epoch")
    print("sat0 : Elements regressed to perigee by satfit.cpp TLE0 epoch")
    print("satA : Elements created from sat0 mean elements after propagating to TLE0 epoch")
    print("satB : Elements created from sat1 mean elements after propagating to TLE0 epoch")
    print("satr : Elements created from rv2coe from sat1x r,v vectors TLE0 epoch")
    print()
    print("At TLE epoch jd {}".format(sat0.jdsatepoch))
    print("sat1.rr {} sat1.vv {}".format(sat1.rr_km,sat1.vv_kmpersec))
    print("sat2.rr {} sat2.vv {}".format(sat2.rr_km,sat2.vv_kmpersec))
    print("sat0.rr {} sat0.vv {}".format(sat0.rr_km,sat0.vv_kmpersec))
    print("satA.rr {} satA.vv {}".format(satA.rr_km,satA.vv_kmpersec))
    print("satB.rr {} satB.vv {}".format(satB.rr_km,satB.vv_kmpersec))
    print("satr.rr {} satr.vv {}".format(satr.rr_km,satr.vv_kmpersec))

    dayahead = sat0.jdsatepoch + 1
    sat0 = satfit.delta_t(sat0,dayahead)
    sat1 = satfit.delta_t(sat1,dayahead) # Changing tsince changes the mean elements
    sat2 = satfit.delta_t(sat2,dayahead) # Changing tsince changes the mean elements
    satA = satfit.delta_t(satA,dayahead)
    satB = satfit.delta_t(satB,dayahead)
    print()
    print("At TLE epoch jd {} (Epoch + 1 day)".format(dayahead))
    print("sat1.rr {} sat1.vv {}".format(sat1.rr_km,sat1.vv_kmpersec))
    print("sat2.rr {} sat2.vv {}".format(sat2.rr_km,sat2.vv_kmpersec))
    print("sat0.rr {} sat0.vv {}".format(sat0.rr_km,sat0.vv_kmpersec))
    print("satA.rr {} satA.vv {}".format(satA.rr_km,satA.vv_kmpersec))
    print("satB.rr {} satB.vv {}".format(satB.rr_km,satB.vv_kmpersec))
    print("satr.rr {} satr.vv {}".format(satr.rr_km,satr.vv_kmpersec))

    dayahead = sat0.jdsatepoch + 10
    sat0 = satfit.delta_t(sat0,dayahead)
    sat1 = satfit.delta_t(sat1,dayahead) # Changing tsince changes the mean elements
    sat2 = satfit.delta_t(sat2,dayahead) # Changing tsince changes the mean elements
    satA = satfit.delta_t(satA,dayahead)
    satB = satfit.delta_t(satB,dayahead)
    print()
    print("At TLE epoch jd {} (Epoch + 10 day)".format(dayahead))
    print("sat1.rr {} sat1.vv {}".format(sat1.rr_km,sat1.vv_kmpersec))
    print("sat2.rr {} sat2.vv {}".format(sat2.rr_km,sat2.vv_kmpersec))
    print("sat0.rr {} sat0.vv {}".format(sat0.rr_km,sat0.vv_kmpersec))
    print("satA.rr {} satA.vv {}".format(satA.rr_km,satA.vv_kmpersec))
    print("satB.rr {} satB.vv {}".format(satB.rr_km,satB.vv_kmpersec))
    print("satr.rr {} satr.vv {}".format(satr.rr_km,satr.vv_kmpersec))