Skip to main content

Open-source conjunction assessment pipeline for space objects

Project description

SatGuard

Open-source conjunction assessment pipeline for space objects — from TLE ingest to maneuver planning.

TLE ingest → SGP4 propagation → conjunction screening → collision probability → CDM output → 3D globe → fleet ops → maneuver planning

SatGuard provides a complete Python toolkit for satellite conjunction assessment, implementing industry-standard algorithms (Foster, Chan, Alfano) with rigorous validation against published references (Vallado, Alfano 2005, NASA CARA). Includes an interactive CesiumJS 3D globe, fleet batch screening, PDF reports, CW-based maneuver planning, and historical replay.

Features

Core (v0.1)

  • TLE Parser — Two-Line Element parsing with checksum validation
  • Catalog Ingest — CelesTrak (no auth) and Space-Track.org (with credentials)
  • SGP4 Propagation — High-fidelity orbit propagation via compiled sgp4 library
  • Conjunction Screening — KDTree-based spatial indexing for O(N log N) screening
  • Collision Probability — Three methods: Foster (2D integral), Chan (series expansion), Alfano (max Pc bounds)
  • Covariance Handling — Default covariance models, 3D→2D encounter plane projection
  • CDM Output — CCSDS Conjunction Data Message (KVN format)
  • CLI — One-command screening: satguard screen --norad-id 25544 --days 7

Monitoring (v0.2)

  • Pc Evolution Tracking — Track how collision probability changes over time (JSON history)
  • Trend Analysis — Detect RISING/FALLING/STABLE trends, estimate time to threshold
  • Webhook Alerts — Fire alerts to Slack/Discord/Teams when Pc exceeds threshold
  • Covariance Assessment — Evaluate matrix quality (REALISTIC/SUSPECT/DEFAULT)
  • CLI watch — Screen + record + alert in one command
  • CLI history — View Pc evolution with optional matplotlib plot

Globe 3D (v0.3)

  • Interactive Globe — CesiumJS with 30K+ satellites rendered via PointPrimitiveCollection + satellite.js client-side SGP4
  • Click-to-Inspect — Click any satellite → fly-to camera transition + detail panel (orbital elements, derived params)
  • Conjunction Overlay — Glowing polylines between at-risk pairs, colored by Pc severity
  • Orbit Filters — Toggle LEO/MEO/GEO/OTHER with color coding
  • Time Controls — Play/pause, speed multiplier (1x–600x), reset-to-now
  • FastAPI Backend — REST API serving catalog, conjunctions, and object details
  • CLI satguard serve — Single command to launch API + globe

Globe Enhanced (v0.4)

  • Siblings Detection — Filter co-orbiting objects (same launch designator) from results
  • 3D Conjunction Arcs — Animated polylines connecting at-risk pairs on the globe
  • Heatmap Mode — Density overlay showing conjunction hotspots
  • Time Slider — Scrub through simulation time with playback
  • ConjunctionBrowser — Browse, sort, and filter all conjunctions in sidebar panel

Fleet Operations (v0.5)

  • Fleet YAML Config — Define constellations with per-object thresholds in fleet.yaml
  • Batch Screening — Screen entire fleet in one command (vectorized, 29s for full catalog)
  • PDF Reports — Conjunction summary with risk matrix (fpdf2)
  • CLI satguard fleet — Batch screen a constellation
  • CLI satguard report — Generate PDF report

Maneuver & Replay (v0.6)

  • CW Maneuver Planning — Clohessy-Wiltshire linearized relative motion for avoidance maneuvers
  • Tradespace Analysis — Grid search (delta-v × time) → minimum-fuel option meeting Pc threshold
  • Historical Replay — Re-propagate archived TLEs to reconstruct conjunction timeline
  • CLI satguard maneuver — Plan avoidance maneuver for a conjunction pair
  • CLI satguard replay — Replay historical conjunction from archived TLEs

Installation

pip install satguard

Or for development:

git clone https://github.com/genius-lab/satguard.git
cd satguard
pip install -e ".[dev]"

Requires Python 3.12+.

Quick Start

CLI

Screen the ISS (NORAD 25544) for conjunctions over the next 3 days:

satguard screen --norad-id 25544 --days 3

With CDM output for each conjunction:

satguard screen --norad-id 25544 --days 7 --threshold 50 --output-cdm

Python API

from satguard import (
    parse_tle, propagate_batch, screen,
    foster_pc, default_covariance, write_cdm,
)
from satguard.covariance.realism import project_to_encounter_plane

# 1. Parse TLEs
tle_primary = parse_tle(tle_string_primary)
tle_secondary = parse_tle(tle_string_secondary)

# 2. Propagate orbits (3 days, 60s steps)
states_p = propagate_batch(tle_primary, days=3.0, step_seconds=60.0)
states_s = propagate_batch(tle_secondary, days=3.0, step_seconds=60.0)

# 3. Screen for conjunctions
events = screen(states_p, states_s, threshold_km=50.0)

# 4. Compute collision probability
if events:
    event = events[0]
    cov_2d = project_to_encounter_plane(
        default_covariance("LEO"), default_covariance("LEO"),
        event.r_primary, event.v_primary,
        event.r_secondary, event.v_secondary,
    )
    pc = foster_pc(event.miss_distance_km, cov_2d, hard_body_radius=0.02)
    print(f"Pc = {pc:.2e}")

    # 5. Generate CDM
    cdm = write_cdm(event, pc)
    print(cdm)

CelesTrak Catalog

import asyncio
from satguard import fetch_catalog, fetch_tle_by_norad

# Fetch a single object
tle = asyncio.run(fetch_tle_by_norad(25544))  # ISS
print(f"{tle.name} — inclination: {tle.inclination_deg:.1f}°")

# Fetch full active catalog
catalog = asyncio.run(fetch_catalog("active"))
print(f"{len(catalog)} active objects")

CLI Reference

satguard screen [OPTIONS]
  --norad-id INTEGER     NORAD catalog number [required]
  --days FLOAT           Screening window in days (default: 3)
  --threshold FLOAT      Distance threshold in km (default: 50)
  --step FLOAT           Propagation step in seconds (default: 60)
  --output-cdm           Output CDM for each conjunction
  --record               Save results to Pc history (v0.2)
  --assess-covariance    Show covariance quality metrics (v0.2)

satguard watch [OPTIONS]           (v0.2)
  --norad-id INTEGER     NORAD catalog number [required]
  --days FLOAT           Screening window in days (default: 3)
  --config PATH          Alert config TOML file
  --history-dir PATH     History storage directory

satguard history [OPTIONS]         (v0.2)
  --norad-ids TEXT        Comma-separated NORAD IDs (e.g., 25544,41335) [required]
  --history-dir PATH     History storage directory
  --plot                 Save Pc evolution plot as PNG

satguard alert-test [OPTIONS]      (v0.2)
  --config PATH          Alert config TOML file

satguard serve [OPTIONS]           (v0.3)
  --port INTEGER         API server port (default: 8000)

satguard fleet [OPTIONS]           (v0.5)
  --config PATH          Fleet YAML config file [required]
  --output-dir PATH      Output directory for results

satguard report [OPTIONS]          (v0.5)
  --config PATH          Fleet YAML config file [required]
  --output PATH          Output PDF path

satguard maneuver [OPTIONS]        (v0.6)
  --norad-id INTEGER     Primary NORAD ID [required]
  --norad-id-secondary INTEGER  Secondary NORAD ID [required]
  --max-dv FLOAT         Maximum delta-v in m/s (default: 1.0)
  --pc-threshold FLOAT   Target Pc threshold (default: 1e-5)

satguard replay [OPTIONS]          (v0.6)
  --norad-ids TEXT        Comma-separated NORAD IDs [required]
  --history-dir PATH     History storage directory

Example Output

SatGuard Conjunction Screening
========================================
Primary object:   NORAD 25544
Window:           3.0 days
Threshold:        50.0 km
Step:             60 s

Fetching primary TLE from CelesTrak...
  Object: ISS (ZARYA)
  Epoch:  2024-02-14T12:25:11

Propagating primary orbit...
  Generated 4320 state vectors

Fetching active catalog from CelesTrak...
  Catalog: 8432 objects

Screening...

Results: 5 conjunction(s) found
============================================================

  [1] NORAD 25544 vs 41335
      TCA:           2024-02-15T08:12:33
      Miss distance: 12.847 km
      Rel. velocity: 14.221 km/s
      Pc (Foster):   2.31e-06

Collision Probability Methods

Method Reference Best For
Foster Foster & Estes 1992 Standard 2D Pc, isotropic covariance
Chan Chan 2008, AIAA J. Anisotropic covariance, series expansion
Alfano Alfano 2005, AAS Upper/lower bounds, quick screening

Validation

SatGuard is validated at 5 levels with 254 tests:

Level Description Count
L1 Unit Core function behavior ~158
L2 Domain Values from external sources (Vallado, Alfano, NASA CARA) ~25
L3 Property Hypothesis-based invariant testing (Hypothesis + CW) 18
L4 Snapshot Golden output approved by human review 1
L5 External Cross-validation vs Chan 2008, NASA CARA, real CSMs 15

M4 two-tool verification: CW analytical vs Hill numerical integration (7/7 PASS, <0.001% error).

Run all checks:

make check-all    # mypy + ruff + pytest + smoke test
pytest tests/ -v  # tests only

Project Structure

satguard/
├── src/satguard/
│   ├── catalog/       # TLE parsing, CelesTrak & Space-Track ingest
│   ├── propagate/     # SGP4 orbit propagation
│   ├── screen/        # KDTree + vectorized SatrecArray screening
│   ├── assess/        # Collision probability (Foster, Chan, Alfano)
│   ├── covariance/    # Covariance models, projection & assessment
│   ├── history/       # Pc evolution tracking + historical replay
│   ├── alert/         # Webhook alerts (Slack/Discord/Teams)
│   ├── fleet/         # Fleet YAML config + batch screening
│   ├── report/        # PDF report generation (fpdf2)
│   ├── maneuver/      # CW equations + tradespace planner
│   ├── api/           # FastAPI backend (catalog, conjunctions, maneuver, replay)
│   ├── cdm/           # CCSDS CDM writer
│   └── cli/           # Click CLI (screen, watch, fleet, maneuver, replay, serve)
├── tests/             # 254 tests across 5 validation levels
├── verify/            # Two-tool cross-verification (CW vs Hill)
└── web/               # CesiumJS 3D globe (React + Resium)

References

  • Vallado, D.A. Fundamentals of Astrodynamics and Applications, 5th ed.
  • Alfano, S. (2005). "A Numerical Implementation of Spherical Object Collision Probability." AAS/AIAA.
  • Chan, F.K. (2008). Spacecraft Collision Probability. AIAA.
  • Foster, J.L. & Estes, H.S. (1992). "A Parametric Analysis of Orbital Debris Collision Probability." NASA JSC-25898.
  • CCSDS 508.0-B-1: Conjunction Data Message standard.
  • Clohessy, W.H. & Wiltshire, R.S. (1960). "Terminal Guidance System for Satellite Rendezvous." J. Aerospace Sciences.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

satguard-1.0.0.tar.gz (206.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

satguard-1.0.0-py3-none-any.whl (64.9 kB view details)

Uploaded Python 3

File details

Details for the file satguard-1.0.0.tar.gz.

File metadata

  • Download URL: satguard-1.0.0.tar.gz
  • Upload date:
  • Size: 206.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for satguard-1.0.0.tar.gz
Algorithm Hash digest
SHA256 87f1f8d9275d196147351cdb6d28b31fecf21edb5285b7c90ca88264669f52b1
MD5 b95b156aa94169bf6434d3fa52fbc42b
BLAKE2b-256 0b86457b3f5ff7343d9947c8eb0bcf58a17f6251c62de6112e67c652cc007e51

See more details on using hashes here.

File details

Details for the file satguard-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: satguard-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 64.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for satguard-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ea789871d559bfdbe1ab1639bab694f1bbf8dcc82cddc82a5043f54e30f8723c
MD5 7199950c9f6b67e1ec9d225eaeb90c30
BLAKE2b-256 6209097506290ef0ce83b3f94de32b6d258dcbdfbc9d50e35eafdd51d5793487

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page