Professional-grade open-source Python toolkit for satellite communications engineering
Project description
OpenSatCom
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.
Features
- 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
Installation
pip install opensatcom
For development:
pip install -e ".[dev]"
For Jupyter notebooks:
pip install -e ".[notebooks]"
Quickstart
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")
Architecture
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
CLI Usage
# 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 html
Tutorial Notebooks
Testing
pytest 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
Contributing
- 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
Citation
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}
}
License
MIT License. See LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file opensatcom-0.4.0.tar.gz.
File metadata
- Download URL: opensatcom-0.4.0.tar.gz
- Upload date:
- Size: 102.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
388f24698e97467a9ac9128674a83981f65e0c57d290c61985dc588a7bec82ef
|
|
| MD5 |
04d222472cf7aef580272de9929b8131
|
|
| BLAKE2b-256 |
cb1391fae1a3190fa7a733bf75fcca405825cb731225b21672de0209691f6f66
|
Provenance
The following attestation bundles were made for opensatcom-0.4.0.tar.gz:
Publisher:
publish.yml on jman4162/opensatcom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opensatcom-0.4.0.tar.gz -
Subject digest:
388f24698e97467a9ac9128674a83981f65e0c57d290c61985dc588a7bec82ef - Sigstore transparency entry: 962377532
- Sigstore integration time:
-
Permalink:
jman4162/opensatcom@eede881448ca5b3e4c58b4b202759473dd540e66 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/jman4162
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eede881448ca5b3e4c58b4b202759473dd540e66 -
Trigger Event:
release
-
Statement type:
File details
Details for the file opensatcom-0.4.0-py3-none-any.whl.
File metadata
- Download URL: opensatcom-0.4.0-py3-none-any.whl
- Upload date:
- Size: 75.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
881bc4a999f4d9221f9d8e75895f25d07653a2a08e7b9aa80e890dbfe91b4d89
|
|
| MD5 |
ab8259436fcacacd3fd1435aacd7b72b
|
|
| BLAKE2b-256 |
3ef8417bed0df0e50bf552354f99370a248e2b993c5e6210660dd2be2d4caf21
|
Provenance
The following attestation bundles were made for opensatcom-0.4.0-py3-none-any.whl:
Publisher:
publish.yml on jman4162/opensatcom
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
opensatcom-0.4.0-py3-none-any.whl -
Subject digest:
881bc4a999f4d9221f9d8e75895f25d07653a2a08e7b9aa80e890dbfe91b4d89 - Sigstore transparency entry: 962377537
- Sigstore integration time:
-
Permalink:
jman4162/opensatcom@eede881448ca5b3e4c58b4b202759473dd540e66 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/jman4162
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@eede881448ca5b3e4c58b4b202759473dd540e66 -
Trigger Event:
release
-
Statement type: