# SatKit
**Satellite astrodynamics in Rust, with full Python bindings.**



[](https://crates.io/crates/satkit)
[](https://docs.rs/satkit)

📚 **API documentation:** [**Python**](api/index.md) on this site · [**Rust**](https://docs.rs/satkit) on docs.rs.
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.
Pre-built wheels are available for **Linux**, **macOS**, and **Windows** on Python 3.10--3.14.
## Quick Start
```bash
pip install satkit
```
The IERS nutation tables and gravity models are compiled into the package, so frames, gravity and SGP4 work with no data files at all. The JPL ephemeris (~100 MB, SHA-256 verified) is downloaded on first use into the user data directory; Earth orientation and space weather are fetched from CelesTrak on first use. To provision everything up front, or to refresh the daily files, run:
```python
import satkit as sk
sk.utils.update_datafiles()
```
## Quick Examples
### SGP4 propagation
```python
import satkit as sk
tle = sk.TLE.from_lines([
"ISS (ZARYA)",
"1 25544U 98067A 24001.50000000 .00016717 00000-0 10270-3 0 9003",
"2 25544 51.6432 351.4697 0007417 130.5364 329.6482 15.48915330299357"
])
pos, vel = sk.sgp4(tle, sk.time(2024, 1, 2))
```
### High-precision propagation
```python
import satkit as sk
import numpy as np
r0 = 6378e3 + 500e3 # 500 km altitude
v0 = np.sqrt(sk.consts.mu_earth / r0)
settings = sk.propsettings(
gravity_model=sk.gravmodel.jgm3,
gravity_degree=8,
)
result = sk.propagate(
np.array([r0, 0, 0, 0, v0, 0]),
sk.time(2024, 1, 1),
end=sk.time(2024, 1, 1) + sk.duration.from_days(1),
propsettings=settings,
)
state = result.interp(sk.time(2024, 1, 1) + sk.duration.from_hours(6))
```
### Coordinate transforms
```python
import satkit as sk
time = sk.time(2024, 1, 1, 12, 0, 0)
coord = sk.itrfcoord(latitude_deg=42.0, longitude_deg=-71.0, altitude=100.0)
q = sk.frametransform.rotation(from_frame=sk.frame.ITRF, to_frame=sk.frame.GCRF, tm=time)
gcrf_pos = q * coord.vector
```
## Features
### Coordinate Frames
Full IERS 2010 Conventions reduction ([Petit & Luzum 2010](guide/references.md#petit2010), Ch. 5: IAU 2006/2000A precession-nutation) with Earth orientation parameters:
| 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 1975](guide/references.md#vincenty1975)) utilities.
### Orbit Propagation
- **Numerical** -- Adaptive Runge-Kutta integrators (9(8), 8(7), 6(5), 5(4); [Verner 2010](guide/references.md#verner2010), [Tsitouras 2011](guide/references.md#tsitouras2011)), RODAS4 and Gauss-Jackson 8 ([Berry & Healy 2004](guide/references.md#berry2004)), with dense output, state transition matrix, and configurable force models
- **SGP4** -- Standard TLE/OMM propagator ([Vallado et al. 2006](guide/references.md#vallado2006)) with TLE fitting from precision states
- **Keplerian** -- Analytical two-body propagation
- **Lambert** -- Multi-revolution Lambert targeting for orbit transfer design ([Izzo 2015](guide/references.md#izzo2015))
### Force Models
- **Earth gravity**: JGM2, JGM3, EGM96, ITU GRACE16 (spherical harmonics up to degree/order 40; [Montenbruck & Gill 2000](guide/references.md#montenbruck2000), §3.2)
- **Third-body gravity**: Sun and Moon via JPL DE440/441 ephemerides ([Park et al. 2021](guide/references.md#park2021))
- **Atmospheric drag**: NRLMSISE-00 ([Picone et al. 2002](guide/references.md#picone2002); pure Rust) with automatic space weather data
- **Solar radiation pressure**: Cannonball model with shadow function
- **Solid Earth tides**: IERS 2010 §6.2.1 Step 1 (frequency-independent Love-number response; [Petit & Luzum 2010](guide/references.md#petit2010))
- **General relativity**: IERS 2010 §10.3 Eq. 10.12 — Schwarzschild, geodesic (de Sitter) precession, and Lense–Thirring
### 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
## Quick Links
| **[Installation](getting-started/installation.md)** | Install from PyPI or build from source |
| **[Data Files](getting-started/datafiles.md)** | Required data files for calculations |
| **[Learn](tutorials/index.md)** | Tutorials and theory — from basics to advanced topics |
| **[API Reference](api/index.md)** | Full Python API documentation |
| **[References](guide/references.md)** | Sources for every model and algorithm |
| **[Rust API (docs.rs)](https://docs.rs/satkit/)** | Rust API reference |
| **[GitHub](https://github.com/ssmichael1/satkit)** | Source code and issue tracker |
## Author
Steven Michael (ssmichael@gmail.com)
Please reach out if you find errors in code or calculations, are interested in contributing to this repository, or have suggestions for improvements to the API.