You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.5 KiB
Python

# %%
from datetime import datetime, timedelta
from os import stat
from attr import dataclass
from erfa.core import pas
from joblib.parallel import Parallel, delayed
from numpy import double
from tletools import TLE
from astropy import units as u
from spacetrack import SpaceTrackClient
def parse_tle(tle_lines: list[str]):
assert (len(tle_lines) == 3)
tle = TLE.from_lines(*tle_lines)
orbit = tle.to_orbit()
r, v = orbit.rv()
r_m = r.to(u.m).to_value()
v_ms = v.to(u.m / u.s).to_value()
return r_m, v_ms
def to_TLE(tle_lines: list[str]):
assert (len(tle_lines) == 3)
return TLE.from_lines(*tle_lines)
def parse_tle_file(fd):
lines = fd.readlines()
res: list[TLE] = []
for i in range(0, len(lines), 3):
res.append(to_TLE(lines[i:i + 3]))
return res
def get_tle(client: SpaceTrackClient, orbit_ids, days):
return client.tle(**{
'epoch': f'>now-{days}',
'norad_cat_id': orbit_ids,
'format': '3le'
})
client = SpaceTrackClient("geulocrutusse-7937@yopmail.com", "ETionGeOmEnDiUMp")
# print(get_tle(client, [49138], 30))
# %%
with open("1.tle") as f:
tles = parse_tle_file(f)
# %%
from poliastro.twobody.propagation import cowell
from tqdm import tqdm
@dataclass
class orbit_status:
id: int
epoch: datetime
r_x: float
r_y: float
r_z: float
v_x: float
v_y: float
v_z: float
stats = []
for i in tqdm(range(1, len(tles)), position=0):
p1 = tles[i - 1]
p2 = tles[i]
t1 = p1.epoch.to_datetime()
t2 = p2.epoch.to_datetime()
o1 = p1.to_orbit()
o2 = p2.to_orbit()
dt: timedelta = t2 - t1
if dt.seconds <= 60:
continue
for sec in tqdm(range(0, dt.seconds, 60), position=1, leave=False):
ratio = sec / dt.seconds
x1 = o1.propagate(sec * u.s, method=cowell)
x2 = o2.propagate(-(dt.seconds - sec) * u.s, method=cowell)
r1, v1 = x1.rv()
r1_m = r1.to(u.m).to_value()
v1_ms = v1.to(u.m / u.s).to_value()
r2, v2 = x2.rv()
r2_m = r2.to(u.m).to_value()
v2_ms = v2.to(u.m / u.s).to_value()
r_m = [x * (1 - ratio) + y * ratio for x, y in zip(r1_m, r2_m)]
v_ms = [x * (1 - ratio) + y * ratio for x, y in zip(v1_ms, v2_ms)]
stats.append(
orbit_status(
p1.norad,
t1 + timedelta(seconds=sec),
*r_m,
*v_ms,
).__dict__)
import pandas as pd
df = pd.DataFrame(stats)
df.to_parquet("1.pq")
# %%
df
# %%