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, )
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
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, )
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))
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']])
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))