This repository was archived by the owner on Apr 11, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtelemetry.py
More file actions
122 lines (94 loc) · 4.17 KB
/
telemetry.py
File metadata and controls
122 lines (94 loc) · 4.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import math
from datetime import datetime, timezone
import requests
from skyfield.api import load
import logging
#constants
LAUNCH = datetime(2026, 4, 1, 22, 35, 12, tzinfo=timezone.utc)
FEET_TO_KM = 0.0003048
KM_TO_MI = 0.621371
MI_TO_KM = 1.609344
EARTH_RADIUS_KM = 6371.0
MOON_RADIUS_KM = 1737.4
META_URL = "https://storage.googleapis.com/storage/v1/b/p-2-cen1/o/October%2F1%2FOctober_105_1.txt"
DATA_URL = "https://storage.googleapis.com/download/storage/v1/b/p-2-cen1/o/October%2F1%2FOctober_105_1.txt?alt=media&generation={gen}"
#planetary data for distance calculations
logger = logging.getLogger(__name__)
logger.info("Loading planetary data...")
planets = load("de421.bsp")
earth_obj, moon_obj = planets["earth"], planets["moon"]
ts = load.timescale()
def _value(data, n):
"""
Helper to extract a parameter value from the telemetry data, ensuring it's valid and converting to float.
"""
datum = data.get(f"Parameter_{n}")
if not datum or datum.get("Status") != "Good":
return None
try:
return float(datum["Value"])
except (TypeError, ValueError):
return None
def get_met():
"""
Calculate Mission Elapsed Time (MET) as a dict with string and total seconds"""
total = int((datetime.now(timezone.utc) - LAUNCH).total_seconds()) #Total seconds since launch
return {
"string": f"{total//86400}:{total%86400//3600:02d}:{total%3600//60:02d}",
"total_seconds": total
}
def get_artemis_telemetry(timeout=5):
"""Fetch telemetry snapshot and compute derived metrics
"""
meta_resp = requests.get(#get the metadat
META_URL,
headers={"Cache-Control": "no-cache"}, #trying to prevent caching here...
timeout=timeout,
)
meta_resp.raise_for_status()#bad status code
if not meta_resp.text.strip():
raise ValueError("NASA metadata endpoint returned empty response !")
meta = meta_resp.json()
generation = meta.get("generation")
if not generation:
raise ValueError("Metadata missing 'generation' field...")
data_resp = requests.get(DATA_URL.format(gen=generation), timeout=timeout)
data_resp.raise_for_status() #also bad status code
if not data_resp.text.strip():
raise ValueError("NASA data endpoint returned empty response !")
data = data_resp.json()
px, py, pz = _value(data, "2003"), _value(data, "2004"), _value(data, "2005") #position vectors in feet
vx, vy, vz = _value(data, "2009"), _value(data, "2010"), _value(data, "2011") #velocity vectors in feet per second
if None in (px, py, pz, vx, vy, vz):
raise ValueError("Telemetry payload is missing one or more required parameters.")
t = ts.now() #current time
#Orion position converted from feet to kilometers.
ox, oy, oz = px * FEET_TO_KM, py * FEET_TO_KM, pz * FEET_TO_KM
#Earth distance, spacecraft to Earth surface.
dist_earth_km = math.sqrt(ox**2 + oy**2 + oz**2) - EARTH_RADIUS_KM #distance from Earth center minus Earth radius gives distance to surface in km
dist_earth_mi = dist_earth_km * KM_TO_MI #convert to miles
#Moon distance, spacecraft to Moon surface.
mx, my, mz = (moon_obj - earth_obj).at(t).position.km #moon position relative to Earth at current time
dist_moon_center_km = math.sqrt((ox - mx) ** 2 + (oy - my) ** 2 + (oz - mz) ** 2) #distance from spacecraft to Moon center in km
dist_moon_km = dist_moon_center_km - MOON_RADIUS_KM #distance from spacecraft to Moon surface in km
dist_moon_mi = dist_moon_km * KM_TO_MI #convert to miles
#speed from fps to mph/kmh.
spd_fps = math.sqrt(vx**2 + vy**2 + vz**2) #pythagorean theorem to get speed in feet per second
spd_mph = spd_fps * 3600 / 5280
spd_kmh = spd_mph * MI_TO_KM
return {
"met": get_met(),
"generation": generation,
"distance_earth": {
"metric": {"km": dist_earth_km},
"imperial": {"mi": dist_earth_mi},
},
"distance_moon": {
"metric": {"km": dist_moon_km},
"imperial": {"mi": dist_moon_mi},
},
"speed": {
"metric": {"kmh": spd_kmh},
"imperial": {"mph": spd_mph},
},
}