Professional-grade, open-source Python toolkit for satellite communications engineering.
Maps antenna + RF chain + propagation + mission time-series to link margin & capacity, with reproducible, trade-study-ready outputs.
- Snapshot link budgets — EIRP, G/T, C/N0, Eb/N0, margin in one call
- Composite propagation — FSPL + ITU-R P.618 rain + P.676 gas + scintillation
- DVB-S2 modem — 28 built-in ModCods, analytic BER curves, hysteresis ACM
- Multi-beam payload — BeamSet, SINR/C(N+I) maps, interference modeling
- Mission simulation — Tier 1 (single-sat), Tier 2 (multi-sat handover), Tier 3 (network traffic)
- Trade studies — DOE (LHS/factorial/random), batch evaluation, Pareto extraction
- Beautiful visualizations — Plotly interactive + Seaborn statistical plots
- HTML reports — Standalone reports with embedded interactive charts
- CLI interface —
opensatcom run,mission,beammap,doe,batch,pareto
pip install opensatcomFor development:
pip install -e ".[dev]"For Jupyter notebooks:
pip install -e ".[notebooks]"from opensatcom.core.models import *
from opensatcom.antenna.parametric import ParametricAntenna
from opensatcom.propagation import FreeSpacePropagation
from opensatcom.link.engine import DefaultLinkEngine
from opensatcom.geometry.slant import slant_range_m
# Define terminals
satellite = Terminal("GEO-Sat", 0.0, 0.0, 35_786_000.0)
ground = Terminal("Ground", 38.9, -77.0, 0.0, system_noise_temp_k=290.0)
# Build link inputs
link_inputs = LinkInputs(
tx_terminal=satellite,
rx_terminal=ground,
scenario=Scenario(
name="Ku-DL", direction="downlink",
freq_hz=12e9, bandwidth_hz=36e6,
polarization="RHCP", required_metric="ebn0_db", required_value=5.0,
),
tx_antenna=ParametricAntenna(gain_dbi=36.0),
rx_antenna=ParametricAntenna(gain_dbi=38.0),
propagation=FreeSpacePropagation(),
rf_chain=RFChainModel(tx_power_w=100.0, tx_losses_db=1.5, rx_noise_temp_k=75.0),
)
# Evaluate
engine = DefaultLinkEngine()
range_m = slant_range_m(0.0, 35_786_000.0, 30.0)
result = engine.evaluate_snapshot(30.0, 0.0, range_m, link_inputs, PropagationConditions())
print(f"Margin: {result.margin_db:.2f} dB")src/opensatcom/
├── core/ # Datamodels, protocols, units, constants
├── antenna/ # PAM wrappers, parametric, cosine, coupling
├── rf/ # RF chain, cascaded stages
├── propagation/ # FSPL, ITU-R rain/gas/scintillation, composite
├── geometry/ # Slant range, elevation/azimuth
├── modem/ # DVB-S2 ModCods, analytic BER, ACM policy
├── link/ # Snapshot link budget engine
├── payload/ # BeamSet, BeamMap, multi-beam interference
├── world/ # WorldSim Tier 1/2/3, traffic, schedulers
├── trades/ # DOE, batch runner, Pareto extraction
├── viz/ # Plotly + Seaborn visualizations
├── reports/ # HTML report generation
├── io/ # Artifact I/O (parquet, yaml, json)
└── cli/ # CLI entry points
# Snapshot link evaluation
opensatcom run config.yaml
# Time-series mission simulation
opensatcom mission config.yaml
# Multi-beam capacity map
opensatcom beammap config.yaml
# Design of experiments
opensatcom doe config.yaml -n 500 --method lhs
# Batch evaluation
opensatcom batch cases.parquet --parallel
# Pareto extraction
opensatcom pareto results.parquet --x cost_usd --y throughput_p50
# Generate report
opensatcom report results.parquet --format htmlpytest tests/ -v # All tests
pytest tests/ -m golden # Golden regression tests only
pytest tests/ -m integration # Integration tests only
ruff check src/ tests/ # Lint
mypy src/opensatcom/ # Type check- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Write tests for new functionality
- Ensure all tests pass (
pytest tests/) - Submit a pull request
If you use OpenSatCom in your research or publications, please cite:
@software{opensatcom,
author = {Hodge, John},
title = {OpenSatCom: Open-Source Satellite Communications Engineering Toolkit},
year = {2025},
publisher = {GitHub},
url = {https://github.com/jman4162/opensatcom},
version = {0.4.0},
license = {MIT}
}MIT License. See LICENSE for details.