The high-performance mathematical foundation for space situational awareness.
ASTRA-Core is a rigorous Python astrodynamics engine for aerospace engineers, researchers, and developers. It propagates large catalogs, screens conjunctions, estimates collision probability, and predicts ground passes—using both legacy TLE and modern OMM data end-to-end.
📖 API reference: Read the Docs
🧠 How the math works: KNOWMORE.md — TLEs, OMM, SGP4, spatial screening, P_c, Cowell forces, and what the models assume.
ASTRA-Core supports both the legacy TLE format and the CCSDS OMM (Orbit Mean-Elements Message). Physics APIs accept either via the unified SatelliteState type.
| Feature | SatelliteTLE (legacy) |
SatelliteOMM (modern ★) |
|---|---|---|
| Source format | 69-character text lines | JSON key-value pairs |
| Mass (kg) | Not in format | mass_kg |
| Radar cross-section (m²) | Not in format | rcs_m2 |
| Ballistic coefficient | Not in format | cd_area_over_mass |
| Collision radius | Estimated default | From RCS / metadata when present |
| Parsing | Checksums, fixed columns | JSON — structured fields |
| Backwards compatible | Yes | Yes (same pipelines) |
| Recommended for | Legacy workflows | New projects |
Tip: Prefer OMM when you care about drag, realistic cross-sections, or conjunction risk—the extra metadata flows into screening and Cowell without extra glue code.
| Spacebook (COMSPOC) | CelesTrak | Space-Track.org | |
|---|---|---|---|
| Account | Not required | Not required | Free registration |
| Formats | XP-TLE, STK Synthetic | TLE + OMM JSON | TLE + OMM JSON |
| Coverage | Highly precise objects | Large public catalogs | Authoritative catalog |
| Updates | Daily (live observational) | Periodic | Periodic (per provider) |
| Notes | Superior uncertainty/SW | Rate limits may apply | Session auth via env vars |
Spacebook provides synthetic covariance and standard/XP-TLEs along with highly precise Space Weather metrics. Spacebook overrides CelesTrak SW defaults when active.
import astra
# Load XP-TLE catalog formatted transparently as SatelliteOMM with precision tags
xp_catalog = astra.fetch_xp_tle_catalog()import astra
tles = astra.fetch_celestrak_group("starlink")
omms = astra.fetch_celestrak_group_omm("starlink")Requests identify the client as ASTRA-Core/<version>.
Never hardcode passwords. Set once per machine:
# Windows (Command Prompt — restart shell after setx)
setx SPACETRACK_USER [email protected]
setx SPACETRACK_PASS yourpassword
# Linux / macOS (~/.bashrc or ~/.zshrc)
export [email protected]
export SPACETRACK_PASS=yourpasswordimport astra
starlinks = astra.fetch_spacetrack_group("starlink")
catalog = astra.fetch_spacetrack_active()If credentials are missing, ASTRA raises a clear error with setup hints.
- Spacebook Integration: Direct streaming of Spacebook XP-TLEs, true observational covariance matrices, and live Space Weather priorities—bypassing heuristic estimation models for flight-grade accuracy.
- Dual format (TLE + OMM): One API surface for parsing, propagation, filtering, and conjunctions.
- SGP4 at scale: Vectorized propagation (
propagate_many, generators) with UT1-aware handling where ephemeris data are available. - Cowell propagation: Dormand–Prince integration with J₂–J₄, empirical drag (space weather), Sun/Moon third-body gravity (JPL DE421), high-fidelity solar radiation pressure with conical Earth shadow (continuous penumbra modeling), and 7-DOF finite burns with mass flow.
- Conjunction screening: KD-tree prefilter over time steps (~14.8x speedup), spline refinement for TCA, Spacebook EOP coordinate mapping, and dynamic effective radius from metadata when available.
- Collision probability: Analytical (Chan/Foster lineage), exact 2D Gaussian Quadrature (
dblquad), and 6D Monte Carlo paths when full covariances are supplied; Seamless integration with Spacebook synthetic covariance matrices. - Catalog ingestion: CelesTrak and Space-Track helpers plus local OMM files.
- Pass prediction: TEME → ground observer pipeline (ENU), coarse grid + refinement for AOS/TCA/LOS.
- Optional 3D plots: Interactive Plotly figures via the
[viz]extra—core install stays lean for servers and CI.
Default (core physics, no Plotly):
pip install astra-core-engineWith 3D trajectory plotting:
pip install "astra-core-engine[viz]"From source (development + tests):
git clone https://github.com/ISHANTARE/ASTRA.git
cd ASTRA
pip install -e ".[test]"Requires Python 3.10+. Core dependencies include NumPy, SciPy, Skyfield, SGP4, Requests, Numba, and defusedxml.
ASTRA-Core implements widely used models suitable for research, education, integration prototypes, and operations-style workflows when you understand the assumptions. It is not a certified conjunction or mission-closure product by itself—validate against your own requirements and reference tools if needed.
| Topic | What to know |
|---|---|
| Sun/Moon ephemeris | Default kernel is DE421 (roughly 1900–2050). Very long or future-dated studies may need another ephemeris (e.g. DE440) and your own validation. |
| Atmosphere | Empirical Jacchia-class density, not NRLMSISE. Not intended for detailed re-entry or the densest LEO regimes alone. |
| SRP | Simple cannonball model; enhanced with high-fidelity conical Earth shadow capable of smoothly modeling fractional illumination through the penumbra. |
| P_c | Depends on covariance quality. Built-in estimate_covariance() is a rough heuristic—for serious thresholds, use CDM-class covariances. Turn on strict mode to avoid silent fallbacks. |
| Monte Carlo P_c | Uses a straight-line relative-motion model per sample; very slow co-orbital encounters need careful interpretation and finer time sampling. |
| Catalog quality | Stale or poor elements dominate error—always check epoch and data source. |
Strict mode: astra.set_strict_mode(True) or astra.config.ASTRA_STRICT_MODE = True makes many missing-data paths raise instead of warn-and-continue—recommended when building tools that must not guess.
More detail: KNOWMORE.md and the Limitations page on Read the Docs.
import astra
import numpy as np
active_catalog = astra.fetch_celestrak_active()
objects = [astra.make_debris_object(tle) for tle in active_catalog]
leo_only = astra.filter_altitude(objects, min_km=200, max_km=2000)
sources = [obj.source for obj in leo_only]
times_jd = leo_only[0].source.epoch_jd + np.arange(0, 120, 5.0) / 1440.0
trajectories = astra.propagate_many(sources, times_jd)
events = astra.find_conjunctions(
trajectories,
times_jd=times_jd,
elements_map={obj.source.norad_id: obj for obj in leo_only},
threshold_km=5.0,
)import astra
import numpy as np
omm_catalog = astra.fetch_celestrak_active_omm()
# Or: omm_catalog = astra.load_omm_file("catalog.json")
objects = [astra.make_debris_object(omm) for omm in omm_catalog]
leo_only = astra.filter_altitude(objects, min_km=200, max_km=2000)
sources = [obj.source for obj in leo_only]
times_jd = leo_only[0].source.epoch_jd + np.arange(0, 120, 5.0) / 1440.0
trajectories = astra.propagate_many(sources, times_jd)
events = astra.find_conjunctions(
trajectories,
times_jd=times_jd,
elements_map={obj.source.norad_id: obj for obj in leo_only},
threshold_km=5.0,
)
print(f"Found {len(events)} conjunction events.")import astra
catalog = astra.fetch_spacetrack_active()
print(f"Loaded {len(catalog)} satellites.")from astra import plot_trajectories
fig = plot_trajectories({"25544": positions_array})Functions are available from the astra namespace.
| Function | Returns |
|---|---|
fetch_celestrak_active() |
list[SatelliteTLE] |
fetch_celestrak_group(group) |
list[SatelliteTLE] |
fetch_celestrak_comprehensive() |
list[SatelliteTLE] |
fetch_celestrak_active_omm() |
list[SatelliteOMM] |
fetch_celestrak_group_omm(group) |
list[SatelliteOMM] |
fetch_celestrak_comprehensive_omm() |
list[SatelliteOMM] |
| Function | Returns |
|---|---|
fetch_spacetrack_group(group, format=...) |
OMM (default) or TLE |
fetch_spacetrack_active() |
Active catalog |
fetch_spacetrack_satcat() |
SATCAT-style records |
spacetrack_logout() |
End session |
| Function | Returns |
|---|---|
fetch_xp_tle_catalog() |
Spacebook XP-TLE active subset |
fetch_historical_tle(date) |
Historical TLEs |
fetch_synthetic_covariance_stk(id) |
STK 6x6 observational errors |
get_space_weather_sb(jd) |
COMSPOC live SW parameters |
parse_omm_json(text)→list[SatelliteOMM]parse_omm_record(dict)→SatelliteOMMload_omm_file(path)→list[SatelliteOMM]validate_omm(dict)→bool
load_tle_catalog(lines)→list[SatelliteTLE]parse_tle(name, l1, l2)→SatelliteTLEvalidate_tle(name, l1, l2)→bool
make_debris_object(source)—SatelliteTLEorSatelliteOMMfilter_altitude,filter_region,filter_time_window,apply_filters,catalog_statistics
propagate_orbit,propagate_many,propagate_many_generator,propagate_trajectory,ground_trackpropagate_cowell— numerical Cowell +DragConfig
find_conjunctions,closest_approach,distance_3dcompute_collision_probability,compute_collision_probability_mcestimate_covariance,propagate_covariance_stm,rotate_covariance_rtn_to_eciparse_cdm_xml
get_space_weather,load_space_weather,atmospheric_density_empiricalsun_position_de,moon_position_de, etc.
passes_over_location,visible_from_location
convert_time,vincenty_distance,orbit_period,orbital_elementsset_strict_mode,astra.config.ASTRA_STRICT_MODE
| Script | Topic |
|---|---|
examples/01_basic_conjunctions.py |
Collision screening pipeline |
examples/02_visualize_swarm.py |
3D LEO constellation plot |
examples/03_ground_station_visibility.py |
Pass prediction |
examples/04_omm_pipeline.py |
OMM end-to-end |
examples/05_compare_tle_omm.py |
TLE vs OMM |
examples/06_spacetrack_pipeline.py |
Space-Track |
Release notes: CHANGELOG.md.
@software{Tare_ASTRA_2026,
author = {Tare, Ishan},
title = {ASTRA: Autonomous Space Traffic Risk Analyzer},
year = {2026},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/ISHANTARE/ASTRA}},
version = {3.4.0}
}Ishan Tare
© 2026 ASTRA Project · MIT License