satkit
Satellite astrodynamics in Rust, with full Python bindings.
Satkit is a high-performance orbital mechanics library written in Rust with complete Python bindings via PyO3. It handles coordinate transforms, orbit propagation, time systems, gravity models, atmospheric density, and JPL ephemerides -- everything needed for satellite astrodynamics work.
Documentation and tutorials (Python examples, but the concepts and API apply equally to Rust) | Rust API reference
Installation
Rust:
Python:
Pre-built wheels are available for Linux, macOS, and Windows on Python 3.10--3.14.
After installing, download the required data files (gravity models, ephemerides, Earth orientation parameters):
# one-time download; re-run periodically for fresh EOP/space weather
Quick Examples
SGP4 propagation (Python)
=
, =
High-precision propagation (Python)
= 6378e3 + 500e3 # 500 km altitude
=
=
=
= 8
=
=
Coordinate transforms (Python)
=
=
=
= *
Planetary ephemerides (Rust)
use ;
let time = from_datetime?;
let = geocentric_state?;
Features
Coordinate Frames
Full IAU-2006/2000 reduction with Earth orientation parameters:
| Frame | Description |
|---|---|
| ITRF | International Terrestrial Reference Frame (Earth-fixed) |
| GCRF | Geocentric Celestial Reference Frame (inertial) |
| TEME | True Equator Mean Equinox (SGP4 output frame) |
| CIRS | Celestial Intermediate Reference System |
| TIRS | Terrestrial Intermediate Reference System |
| Geodetic | Latitude / longitude / altitude (WGS-84) |
Plus ENU, NED, and geodesic distance (Vincenty) utilities.
Orbit Propagation
- Numerical -- Adaptive Runge-Kutta 9(8) with dense output, state transition matrix, and configurable force models
- SGP4 -- Standard TLE/OMM propagator with TLE fitting from precision states
- Keplerian -- Analytical two-body propagation
Force Models
- Earth gravity: JGM2, JGM3, EGM96, ITU GRACE16 (spherical harmonics up to degree/order 360)
- Third-body gravity: Sun and Moon via JPL DE440/441 ephemerides
- Atmospheric drag: NRLMSISE-00 with automatic space weather data
- Solar radiation pressure: Cannonball model with shadow function
Time Systems
Seamless conversion between UTC, TAI, TT, TDB, UT1, and GPS time scales with full leap-second handling.
Solar System
- JPL DE440/DE441 ephemerides for all planets, Sun, Moon, and barycenters
- Fast analytical Sun/Moon models for lower-precision work
- Sunrise/sunset and Moon phase calculations
Cargo Features
| Feature | Default | Description |
|---|---|---|
omm-xml |
yes | XML OMM deserialization via quick-xml |
chrono |
no | TimeLike impl for chrono::DateTime |
Data Files
Satkit needs external data for gravity models, ephemerides, and Earth orientation. Call update_datafiles() to download them automatically.
Downloaded once: JPL DE440/441 (~100 MB), gravity model coefficients, IERS nutation tables
Update periodically: Space weather indices (F10.7, Ap) and Earth orientation parameters (polar motion, UT1-UTC) -- both sourced from Celestrak.
Testing and Validation
The library is validated against:
- Vallado test cases for SGP4, coordinate transforms, and Keplerian elements
- JPL test vectors for DE440/441 ephemeris interpolation (10,000+ cases)
- ICGEM reference values for gravity field calculations
- GPS SP3 precise ephemerides for multi-day numerical propagation
99 unit tests and 35 doc-tests run on every commit across Linux, macOS, and Windows.
Documentation
- Rust: docs.rs/satkit
- Python: ssmichael1.github.io/satkit -- tutorials, Jupyter notebooks, and API reference
References
- D. Vallado, Fundamentals of Astrodynamics and Applications, 4th ed., 2013
- O. Montenbruck & E. Gill, Satellite Orbits: Models, Methods, Applications, 2000
- J. Verner, Runge-Kutta integration coefficients
License
MIT