astrodynamics-gnss 0.14.0

GNSS domain layer (SP3, broadcast ephemeris, multi-GNSS single-point positioning, ionosphere/troposphere, DOP) built on the astrodynamics core
Documentation

astrodynamics-gnss

GNSS domain layer built on the astrodynamics core crate. A sibling crate, not a feature — a propagation-only consumer never has to compile the SP3/RINEX/IONEX parsers.

What it provides

  • SP3 precise ephemerisephemeris::Sp3 / ephemeris::SP3 parsing and arbitrary-epoch position/clock interpolation.
  • Broadcast ephemeris — RINEX 3.x/4.xx navigation parsing and orbit/clock evaluation for GPS (LNAV), Galileo (I/NAV, F/NAV), BeiDou (D1/D2, including geostationary satellites), and GLONASS (PZ-90.11 state-vector propagation by Runge–Kutta integration).
  • Atmospheric corrections — broadcast Klobuchar ionosphere (frequency-aware) and Saastamoinen + Niell troposphere.
  • Single-point positioning — multi-constellation least-squares PVT with one receiver clock per system, elevation weighting, satellite rejection, and dilution of precision.

Public API shape

The public surface is organized by workflow:

use astrodynamics_gnss::{
    ephemeris::{BroadcastEphemeris, Sp3},
    positioning::{solve, Corrections, Observation, SolveInputs},
    rinex::{nav, observations},
};

The implementation modules are private; users should not need to know whether a function is backed by an SP3 parser, a broadcast store, or an SPP implementation module. Use the façade modules:

  • ephemeris for SP3 and broadcast ephemeris products,
  • rinex for RINEX NAV/OBS parsing and CRINEX decoding,
  • positioning for SPP and DOP diagnostics,
  • atmosphere for ionosphere/troposphere models,
  • orbit for reduced-orbit fitting and drift checks.

Parity bar

Every independently reproducible, libm-bound component (orbit and clock evaluation, ionosphere, troposphere, DOP) is held to bit-exact (0 ULP) parity against a pinned Python reference, proven by committed hex-float golden vectors; broadcast orbits are additionally validated against precise SP3 products. The least-squares solver's converged position is a sub-micron solver-agreement result, not a 0-ULP claim (the linear-algebra step is BLAS-bound).

Units are SI throughout, with the frame and datum encoded in the type (ItrfPositionM, Wgs84Geodetic). 0 ULP is certified against a pinned target (OS/arch, libm, toolchain, FMA policy); other platforms run the same algorithms but need their own fixtures.

License

MIT