Skip to content

Commit

Permalink
Merge 6b34f27 into f47ae93
Browse files Browse the repository at this point in the history
  • Loading branch information
astrojuanlu committed Oct 30, 2019
2 parents f47ae93 + 6b34f27 commit d773cdb
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 20 deletions.
15 changes: 3 additions & 12 deletions orbit_predictor/predictors/accurate.py
Original file line number Diff line number Diff line change
Expand Up @@ -101,24 +101,15 @@ def _propagate_only_position_ecef(self, timetuple):
gmst = _gstime(jday(*timetuple))
return coordinate_systems.eci_to_ecef(position_eci, gmst)

def _propagate_eci(self, when_utc=None):
"""Return position and velocity in the given date using ECI coordinate system."""
tle = self.source.get_tle(self.sate_id, when_utc)
logger.debug("Propagating using ECI. sate_id: %s, when_utc: %s, tle: %s",
self.sate_id, when_utc, tle)
tle_line_1, tle_line_2 = tle.lines
sgp4_sate = twoline2rv(tle_line_1, tle_line_2, wgs84)
timetuple = when_utc.timetuple()[:6]
timetuple[5] = timetuple[5] + when_utc.microsecond * 1e-6
position_eci, velocity_eci = sgp4_sate.propagate(*timetuple)
return position_eci, velocity_eci

def _propagate_ecef(self, when_utc):
"""Return position and velocity in the given date using ECEF coordinate system."""
timetuple = (when_utc.year, when_utc.month, when_utc.day,
when_utc.hour, when_utc.minute, when_utc.second + when_utc.microsecond * 1e-6)

position_eci, velocity_eci = self.propagator.propagate(*timetuple)
if self.propagator.error != 0:
raise RuntimeError(self.propagator.error_message)

gmst = _gstime(jday(*timetuple))
position_ecef = coordinate_systems.eci_to_ecef(position_eci, gmst)
velocity_ecef = coordinate_systems.eci_to_ecef(velocity_eci, gmst)
Expand Down
12 changes: 4 additions & 8 deletions orbit_predictor/predictors/keplerian.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@

import numpy as np
from sgp4.earth_gravity import wgs84
from sgp4.io import twoline2rv

from orbit_predictor import coordinate_systems
from orbit_predictor.angles import ta_to_M, M_to_ta
Expand Down Expand Up @@ -111,14 +110,11 @@ def from_tle(cls, sate_id, source, date=None):
if date is None:
date = dt.datetime.utcnow()

tle = source.get_tle(sate_id, date)

# Retrieve TLE epoch and corresponding position
epoch = twoline2rv(tle.lines[0], tle.lines[1], wgs84).epoch
pos = TLEPredictor(sate_id, source).get_position(epoch)
# Retrieve TLE position at given date as starting point
pos = TLEPredictor(sate_id, source).get_position(date)

# Convert position from ECEF to ECI
gmst = gstime_from_datetime(epoch)
gmst = gstime_from_datetime(date)
position_eci = coordinate_systems.ecef_to_eci(pos.position_ecef, gmst)
velocity_eci = coordinate_systems.ecef_to_eci(pos.velocity_ecef, gmst)

Expand All @@ -127,7 +123,7 @@ def from_tle(cls, sate_id, source, date=None):
wgs84.mu, np.array(position_eci), np.array(velocity_eci))
sma = p / (1 - ecc ** 2)

return cls(sma, ecc, degrees(inc), degrees(raan), degrees(argp), degrees(ta), epoch)
return cls(sma, ecc, degrees(inc), degrees(raan), degrees(argp), degrees(ta), date)

def _propagate_eci(self, when_utc):
"""Return position and velocity in the given date using ECI coordinate system.
Expand Down
29 changes: 29 additions & 0 deletions tests/test_keplerian_predictor.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,35 @@ def test_from_tle_returns_same_initial_conditions_on_epoch(self):
assert_allclose(pos_keplerian.position_ecef, pos_tle.position_ecef, rtol=1e-9)
assert_allclose(pos_keplerian.velocity_ecef, pos_tle.velocity_ecef, rtol=1e-13)

def test_from_tle_returns_same_initial_conditions_tle_date(self):
start = dt.datetime(2017, 3, 6, 7, 51)
db = MemoryTLESource()
db.add_tle(self.SATE_ID, self.LINES, start)

keplerian_predictor = KeplerianPredictor.from_tle(self.SATE_ID, db, start)
tle_predictor = TLEPredictor(self.SATE_ID, db)

pos_keplerian = keplerian_predictor.get_position(start)
pos_tle = tle_predictor.get_position(start)

assert_allclose(pos_keplerian.position_ecef, pos_tle.position_ecef, rtol=1e-9)
assert_allclose(pos_keplerian.velocity_ecef, pos_tle.velocity_ecef, rtol=1e-13)

def test_from_tle_returns_same_initial_conditions_future_date(self):
start = dt.datetime(2017, 3, 6, 7, 51)
future = dt.datetime(2017, 9, 6, 7, 51)
db = MemoryTLESource()
db.add_tle(self.SATE_ID, self.LINES, start)

keplerian_predictor = KeplerianPredictor.from_tle(self.SATE_ID, db, future)
tle_predictor = TLEPredictor(self.SATE_ID, db)

pos_keplerian = keplerian_predictor.get_position(future)
pos_tle = tle_predictor.get_position(future)

assert_allclose(pos_keplerian.position_ecef, pos_tle.position_ecef, rtol=1e-9)
assert_allclose(pos_keplerian.velocity_ecef, pos_tle.velocity_ecef, rtol=1e-13)

def test_from_tle_with_no_date_works(self):
# https://github.com/satellogic/orbit-predictor/issues/52
start = dt.datetime(2017, 3, 6, 7, 51)
Expand Down

0 comments on commit d773cdb

Please sign in to comment.