Distance from Earth
Speed
Anomaly Score (Isolation Forest)
Speed Residual (TCM signature)
Orbital Energy
Eccentricity
Orion-Watch
Real NASA flight data · Rust physics engine · Python ML pipeline · GitHub Actions auto-deploy
What This Is
This project ingests the actual NASA/JSC Flight Dynamics Operations OEM ephemeris file from Artemis II — the live state vectors FDO uses in Mission Control — and runs a multi-layer ML pipeline on it.
It is not a simulation. The input data is the same CCSDS OEM file served by FDOweb at MCC-H, updated every ~hour during the mission.
What the Pipeline Does
| Step | Tool | What it produces |
|---|---|---|
| Fetch | Rust (async reqwest/tokio) | Latest OEM from NASA AROW or JPL HORIZONS fallback |
| Parse + Features | Rust (oem-engine) | 28 orbital features per state vector in ~7ms total |
| Anomaly Detection | Python / sklearn IsolationForest | Flags TCM burns from jerk + energy residuals |
| Trajectory Forecast | Python / PyTorch LSTM | Predicts next 10 state vectors (40 min ahead) |
| Landing Prediction | Python / GradientBoosting + Monte Carlo | Splashdown lat/lon ± uncertainty radius |
| Visualize | Python / matplotlib | 5 publication-quality plots |
| Auto-update | GitHub Actions (cron every 4h) | Fetches, runs, commits updated outputs automatically |
What the ML Found
Anomaly detection flagged 96 state vectors clustered around T+20.4 hours. This is the Outbound Trajectory Correction (OTC-1) maneuver — a small burn done before TLI to fine-tune the trans-lunar trajectory. The model caught it purely from orbital mechanics residuals (energy jump + jerk spike) with zero labeled training data.
Landing prediction: Monte Carlo ballistic propagation from the EI state vector (speed 10.999 km/s, alt 127 km) places splashdown at approximately 18.4°N, 151.2°W — north of Hawaii, consistent with Artemis nominal Pacific recovery zone, ±42 km (1σ).
Run Locally
# 1. Build Rust binaries cargo build --release --workspace # 2. Install Python deps pip install numpy pandas scikit-learn matplotlib torch # 3. Run full pipeline (fetch → parse → ML → viz) python python/pipeline.py --fetch --out outputs # Or just run the engine on the bundled data ./target/release/oem-engine --input data/bootstrap.oem --features-out data/features.csv # Or run ML directly python python/ml/models.py data/features.csv outputs/summary.json outputs
Rust Engine Features (per state vector)
The Rust binary parses 3,193 state vectors and computes 28 features in under 7ms:
dist_km, alt_km, speed_kms, energy, h_mag, h_x/y/z, ecc, sma_km, inc_deg, visviva_kms, speed_residual, energy_residual, fpa_deg, accel_mag, jerk_mag, delta_speed, delta_energy, anomaly_score
GitHub Actions
The workflow at .github/workflows/watch.yml runs every 4 hours during the mission window. It fetches the latest OEM, runs the full pipeline, and commits updated outputs/ back to the repo automatically. No manual intervention needed.
Data Source
Primary: NASA AROW (Artemis Real-time Orbit Website) — public OEM downloads
Fallback: JPL HORIZONS REST API — body ID -170 (Artemis II Orion)