sidereon
GNSS and astrodynamics for Rust: propagate satellites, predict passes, solve precise positions (SPP / RTK / PPP), and convert between coordinate frames and time scales — checked against the references the field trusts (Vallado, Skyfield, IGS, IERS).
It's a pure-Rust engine, fast and #![forbid(unsafe_code)] at the surface, with
one ergonomic crate that re-exports the whole stack. You just cargo add sidereon.
Install
cargo add sidereon
Quickstart: when does the ISS fly over you?
No data files, no setup — give it a two-line element set and a ground station, and ask when the satellite is above the horizon.
use ;
use ;
use Satellite;
A typical run prints something like:
08:30 UTC | 6.8 min | peak 88 deg
15:01 UTC | 6.6 min | peak 56 deg
16:39 UTC | 3.5 min | peak 14 deg
Each [SatellitePass] gives you acquisition (aos), loss (los), culmination
time, and peak elevation. The same sidereon::passes module has look_angle
(azimuth / elevation / range to a satellite at an instant) and propagate_teme_arc
for raw state vectors; Satellite from sidereon::sgp4 is the propagator behind
all of it.
Precise positioning
The positioning engine is the other half of the library: feed it pseudoranges and a precise-ephemeris (SP3) product and it returns a least-squares fix.
use ;
use ;
let sp3 = load_sp3?;
let inputs = SolveInputs ;
let fix = solve_spp?;
println!; // ItrfPositionM — ECEF metres
println!; // Some(Wgs84Geodetic) — lat / lon / height
println!; // the satellites that contributed
solve_rtk_float_with, solve_rtk_fixed_with, solve_ppp_float_with, and
solve_ppp_fixed_with follow the same shape — a typed config in, a result struct
with ECEF/geodetic position, residuals, DOP, and status out. One [Error] enum
unifies every product-parse and solve failure, and solve_spp_batch fans a fleet
of epochs across a rayon pool, bit-identical to the serial path.
What's in the box
- Orbits — SGP4/TLE and OMM, numerical propagation, passes, look angles
- Frames & time — TEME ↔ GCRS ↔ ITRS, GMST/GAST, geodetic ↔ ECEF, UTC/TT/TDB/UT1
- Bodies — Sun/Moon positions, eclipse events, plus JPL SPK (DAF/.bsp) kernels
- Positioning — SPP, RTK (float/fixed), PPP (float/fixed), DOP, velocity
- GNSS data — SP3, RINEX (obs/nav/clock), CRINEX, ANTEX, broadcast ephemeris
- Space situational awareness — conjunction/TCA screening, collision probability, CDM, covariance
- RF — link budget (FSPL, EIRP, C/N0, antenna gain)
The product parsers, look-angle helpers, and propagation shortcuts live at the
crate root (load_sp3, solve_spp, passes, sgp4, tle, tca); the full
astrodynamics tree is under sidereon::astro. Lower-level RTK/PPP internals stay
behind the explicit sidereon::raw escape hatch so the ergonomic surface stays
small.
Other languages
sidereon is one validated engine with first-class interfaces in Rust, Python, C, Elixir, and WebAssembly — same numbers everywhere. See the live demo and docs at sidereon.dev.
How it's validated
The SGP4 propagator is a Rust port of David Vallado's reference implementation, bit-exact to it. Frames and time are checked against Skyfield and IERS; the positioning stack is checked against IGS products.
MIT licensed. The engine's SGP4 propagation credits David Vallado (AIAA 2006);
see the sidereon-core crate for full attribution.