Skip to main content

sidereon_core/
lib.rs

1//! # sidereon-core
2//!
3//! The complete Sidereon engine in one crate. It folds the numerical
4//! astrodynamics core (orbit propagation, force models, frames, time, SGP4)
5//! together with the GNSS domain layer (SP3, broadcast ephemeris, multi-GNSS
6//! positioning, RTK/PPP, ionosphere/troposphere, DOP).
7//!
8//! - The propagation/astro layer is always present under the [`astro`] module.
9//! - The GNSS layer lives behind the default-on `gnss` cargo feature, so a
10//!   propagation-only consumer can build with `--no-default-features` (plus
11//!   any astro features it wants) and never compile the IONEX/SP3 parsers.
12//!
13//! The GNSS façade is organized by user-facing tasks:
14//!
15//! - [`ephemeris`] - precise SP3 and broadcast ephemeris products,
16//! - [`rinex`] - RINEX navigation/observation parsing and CRINEX decoding,
17//! - [`antex`] - ANTEX receiver and satellite antenna calibration parsing,
18//! - [`combinations`] - observable linear combinations such as ionosphere-free,
19//! - [`observables`] - forward range, Doppler, and azimuth/elevation prediction,
20//! - [`velocity`] - receiver velocity and clock-drift solve from range-rate data,
21//! - [`positioning`] - single-point positioning and DOP diagnostics,
22//! - [`dgnss`] - code-differential pseudorange correction and rover pairing,
23//! - [`quality`] - pseudorange weighting, RAIM, and FDE integrity checks,
24//! - [`observation_qc`] - RINEX observation completeness and signal rollups,
25//! - [`signal`] - GPS C/A code generation, correlation, and acquisition,
26//! - [`ppp_corrections`] - static-arc PPP correction precomputation,
27//! - [`atmosphere`] - ionosphere and troposphere corrections,
28//! - [`scenario`] - deterministic synthetic GNSS observation scenarios,
29//! - [`orbit`] - compact reduced-orbit fitting/evaluation.
30//!
31//! Implementation modules (`sp3`, `rinex_nav`, `spp`, etc.) are crate-private.
32//! This is a clean public surface rather than a compatibility shim around the
33//! original implementation-shaped module layout.
34//!
35//! ## Units policy (internal representation)
36//!
37//! All quantities are stored and computed in **SI base units**, with the frame
38//! and datum encoded in the type name (per the spec's frames-in-the-type-system
39//! rule), never hidden behind a bare `position_m`:
40//!
41//! - **Length / position:** meters (`_m`). SP3 positions are ITRF/IGS-frame
42//!   ECEF meters; SPP receiver positions are WGS84/ITRF-compatible ECEF meters.
43//!   (The [`astro`] state layer works in kilometers; conversions happen
44//!   explicitly at the boundary, never implicitly.)
45//! - **Time / clock:** seconds (`_s`). Epochs are represented by the [`astro`]
46//!   time family (`Instant`/`TimeScale`), always scale-tagged; there is no bare
47//!   ambiguous epoch.
48//! - **Velocity:** meters per second (`_m_s`).
49//! - **Angles:** radians (`_rad`) internally. Degrees appear only at I/O edges
50//!   and are named `_deg`.
51//! - **Frequency:** hertz (`_hz`).
52//!
53//! Field and parameter names carry the unit suffix so the unit is visible at
54//! every call site. Matrix/vector linear algebra uses `nalgebra`
55//! (`DMatrix`/`DVector`) per the spec.
56
57extern crate self as sidereon_core;
58
59// ---------------------------------------------------------------------------
60// Astro / propagation layer. Always present. The GNSS layer below depends on
61// it via `crate::astro::*`.
62// ---------------------------------------------------------------------------
63
64mod validate;
65
66#[cfg(all(test, sidereon_repo_tests))]
67mod test_parity;
68
69pub mod astro;
70pub(crate) mod format;
71
72// ---------------------------------------------------------------------------
73// GNSS domain layer. Behind the default-on `gnss` feature so a propagation-only
74// consumer can opt out. Additional product modules are added as each lands.
75// ---------------------------------------------------------------------------
76
77mod ambiguity; // shared RTK/PPP cycle-slip policy + wide-lane/narrow-lane prep
78mod antenna; // shared ANTEX PCV/PCO zenith/azimuth interpolation kernels
79pub mod antex; // ANTEX receiver/satellite antenna parser + PCO/PCV lookup
80pub mod araim; // advanced RAIM multi-hypothesis protection levels
81pub mod bias; // Bias-SINEX and DCB bias products
82mod broadcast; // broadcast-ephemeris (GPS LNAV / Galileo I/NAV) orbit + clock
83pub mod broadcast_comparison; // broadcast-vs-precise (SISRE orbit/clock) accuracy
84pub mod carrier_phase; // carrier-phase combinations, cycle-slip detection, Hatch smoothing
85pub mod clock_stability; // Allan-family receiver clock stability estimators
86pub mod constants; // shared physical/time constants (used by astro + gnss)
87pub mod constellation; // GNSS constellation identity catalog (CelesTrak/NAVCEN)
88mod crinex; // Hatanaka (CRINEX) observation-file decoder
89pub mod data; // sans-IO GNSS product filename and archive URL catalog
90pub mod dop; // dilution-of-precision geometry (GDOP/PDOP/HDOP/VDOP/TDOP)
91pub mod error_metrics; // covariance-derived CEP, radial, and ellipse metrics
92pub mod exact_cache; // exact-product cache identity binding and atomic publication
93pub mod frequencies; // canonical GNSS carrier-frequency table
94mod glonass; // GLONASS PZ-90.11 state-vector RK4 propagation
95pub mod has; // Galileo HAS MT1 correction payload decode/encode
96mod ionex; // Klobuchar broadcast model + IONEX ionospheric maps
97pub mod navigation; // navigation-message bit-level codecs (GPS LNAV)
98pub mod nmea; // NMEA 0183 sentence parsing, stream grouping, and GGA writing
99pub mod ntrip; // NTRIP client sans-I/O request, response, and stream handling
100pub mod observables; // forward GNSS observable prediction
101pub mod ppp_corrections; // static-arc PPP correction tables
102pub mod precise_positioning; // static multi-epoch PPP float solve
103mod reduced_orbit; // compact mean-element orbit approximation (fitted)
104mod rinex_clock; // RINEX clock satellite-bias parsing and interpolation
105mod rinex_common; // shared RINEX header concepts (time-system label mapping)
106mod rinex_nav; // RINEX 3 navigation-message parsing (GPS/Galileo broadcast)
107mod rinex_obs; // RINEX 3 observation parsing + single-frequency pseudoranges
108mod rinex_qc; // RINEX observation/navigation lint and mechanical repair
109pub mod rtcm; // RTCM 3 differential-GNSS stream decode/encode (MSM, station, ephemeris)
110pub mod rtk; // RTK double-difference construction
111pub mod sbas;
112pub mod sbas_pl; // SBAS single-hypothesis protection levels
113pub mod scenario; // scenario-driven synthetic GNSS observable generation
114pub mod sidereal; // repeating-geometry residual filtering and period diagnostics
115pub mod signal; // GPS C/A code, coherent correlation, and acquisition
116pub mod source_localization; // ToA/TDOA source localization from arrival times
117mod sp3; // SP3-c / SP3-d parser + arbitrary-epoch interpolation
118mod spp; // single-point positioning (least-squares PVT)
119pub mod ssr; // SSR correction store and corrected broadcast ephemeris source
120pub mod staleness; // product-staleness graceful degradation for time-varying products
121pub mod static_positioning; // multi-epoch static position fusion
122mod static_reference_station; // RINEX reference-station static solve
123mod tropo; // Saastamoinen zenith + Niell (NMF) mapping troposphere
124pub mod velocity; // receiver velocity / clock-drift least-squares solve
125
126mod error;
127pub mod frame;
128pub mod frame_catalog;
129mod id;
130
131pub mod atmosphere;
132pub mod combinations;
133pub mod dgnss;
134pub mod ephemeris;
135pub mod estimation; // Phase-2 estimation substrate: named operation-order recipes
136pub mod geodesic; // WGS84 geodesic direct and inverse solvers
137pub mod geodetic_time_series; // robust station velocity, trajectory, steps, and fields
138pub mod geofence; // geodesic geofence containment and uncertainty gates
139pub mod geoid; // geoid undulation grid + bilinear interpolation (orthometric heights)
140pub mod geometry;
141pub mod geometry_quality;
142pub mod ils; // integer least squares ambiguity-resolution kernels
143pub mod inertial; // ECEF strapdown INS frames, mechanization, and IMU error model
144pub mod integrity; // shared protection and covariance primitives
145pub mod observation_qc; // RINEX observation completeness and signal rollups
146pub mod qc_obs {
147    //! RINEX observation quality-control rollups.
148    pub use crate::observation_qc::*;
149}
150pub mod orbit;
151pub mod orbit_determination;
152pub mod positioning;
153pub mod prelude;
154pub mod quality; // measurement weighting, RAIM, and FDE integrity checks
155pub mod rinex;
156pub mod rtk_filter; // sequential RTK baseline filter - serializable state ABI (kernel migration)
157pub mod terrain;
158pub mod terrain_store;
159pub mod tides;
160pub mod tolerances;
161
162pub mod fusion; // GNSS/INS error-state prediction and EKF correction over the inertial surface
163
164pub use crate::astro::frames::{
165    EarthOrientation, EarthOrientationProvider, PolarMotionSample,
166    PolarMotionSeriesEarthOrientationProvider, TdbEarthOrientationProvider,
167};
168pub use crate::error_metrics::{
169    error_ellipse_from_enu_m2, horizontal_radius_at, metrics_from_ecef_covariance_m2,
170    metrics_from_enu_covariance_m2, metrics_from_kinematic_solution,
171    metrics_from_position_covariance, spherical_radius_at, vertical_radius_at, ErrorEllipse,
172    ErrorMetricsError, PercentileRadius, PositionErrorMetrics,
173};
174pub use crate::estimation::{
175    alpha_beta_apply_measurement, alpha_beta_filter_step, alpha_beta_predict,
176    alpha_beta_steady_state_gains, cfar_ca_false_alarm_probability, cfar_ca_multiplier_from_pfa,
177    cfar_ca_pfa_from_multiplier, cfar_ca_threshold, ewma_update, ewma_update_power_of_two,
178    kalman_cv_steady_state_gains, mad_spread, nis_expected_value, nis_gate_test,
179    nis_gate_threshold, nis_statistic, normalized_innovation, rts_smooth, smooth_track_rts,
180    AlphaBetaGains, AlphaBetaState, AlphaBetaStep, PrimitiveError, ScalarKalmanGains,
181    SmoothedTrack, SmoothedTrackEpoch, TrackCoordinateFrame, TrackError, TrackFilter,
182    TrackFilterConfig, TrackGatedUpdate, TrackInnovation, TrackPrediction, TrackRtsEpoch,
183    TrackRtsHistory, TrackRtsHistoryBuilder, TrackState, TrackUpdate, MAD_GAUSSIAN_CONSISTENCY,
184};
185pub use crate::quality::{
186    reliability_araim, reliability_design, wtest_noncentrality, wtest_noncentrality_components,
187    ObservationReliability, RangeReliabilityRow, ReliabilityOptions, ReliabilityReport,
188    ReliabilitySummary, WtestNoncentralityComponents,
189};
190pub use araim::ProtectionModel;
191pub use error::{Error, Result};
192pub use frame::{
193    geodetic_to_itrf, itrf_to_geodetic, FrameValueError, ItrfPositionM, ItrfVelocityMS,
194    Wgs84Geodetic,
195};
196pub use frame_catalog::{
197    catalog, catalog_entry, propagate_position, transform, transform_from_epoch, FrameCatalogError,
198    HelmertParameters, HelmertRates, HelmertTransform, TerrestrialFrame, TerrestrialPositionM,
199    TerrestrialState, TerrestrialVelocityMPerYear, TERRESTRIAL_FRAME_CATALOG,
200};
201pub use fusion::{
202    loose_coupling_correction, smooth_fusion_rts, ukf_correct_closed_loop,
203    validate_time_sync_gnss_order, validate_time_sync_imu_order, velocity_match_outage,
204    velocity_match_outage_to_state, F64Bits, FusionFilterKind, FusionRtsEpoch, FusionRtsHistory,
205    FusionRtsHistoryBuilder, FusionStateCodecError, FusionUpdate, GnssFixMeasurement,
206    GnssFixStatus, GnssFixStatusWeighting, IggIiiMeasurementReweighting, InertialFilter,
207    InertialFilterConfig, LooseCouplingConfig, NonHolonomicConstraintConfig,
208    SerializableErrorStateLayout, SerializableFusionSnapshot, SerializableFusionState,
209    SerializableGnssFixStatus, SerializableImuSample, SerializableImuSampleKind,
210    SerializableInsFilterState, SerializableLooseMeasurement, SerializableNavState,
211    SerializableRateEndpoint, SerializableSatelliteId, SerializableStationarityDetectorSample,
212    SerializableStoredCheckpoint, SerializableStoredGnssMeasurement, SerializableStoredImuSample,
213    SerializableTightCarrierPhaseObservation, SerializableTightFilterState,
214    SerializableTightGnssEpoch, SerializableTightGnssObservation,
215    SerializableTightRangeRateObservation, SerializableTimeSyncHistory,
216    SerializableTimeSyncHistoryConfig, SmoothedFusionEpoch, SmoothedFusionTrajectory,
217    StationarityDetectorSnapshotSample, StationaryDetectorConfig, StationaryUpdateConfig,
218    TimeSyncHistoryConfig, TimeSyncHistoryStatus, TimeSyncUpdate, UkfUpdateOptions,
219    UnscentedTransformOptions, VelocityMatchState, VelocityMatchedTrajectory,
220    VelocityMatchingConfig, YangPredictionAdaptiveFactor, DEFAULT_TIME_SYNC_CHECKPOINT_CAPACITY,
221    DEFAULT_TIME_SYNC_IMU_CAPACITY, FUSION_STATE_CODEC_VERSION,
222};
223pub use geodesic::{geodesic_direct, geodesic_inverse, GeodesicError};
224pub use geofence::{
225    containment, containment_probability, containment_probability_with_options, crossing,
226    crossing_probability, crossing_probability_with_options, distance_to_boundary, CrossingEvent,
227    CrossingKind, Fence, GeofenceError, GeofencePositionEstimate, PositionUncertainty,
228    ProbabilityHysteresis, ProbabilityMethod, ProbabilityOptions, GEOFENCE_BOUNDARY_TOLERANCE_M,
229    PLANAR_FAST_PATH_MAX_RADIUS_M,
230};
231pub use geoid::{
232    egm96_undulations_deg, egm96_undulations_rad, ellipsoidal_height_m, geoid_undulation,
233    geoid_undulations_deg, geoid_undulations_rad, orthometric_height_m, Egm2008GridSpacing,
234    Egm2008RasterWindow, GeoidError, GeoidGrid, ProjVgridshiftArithmetic, ProjVgridshiftError,
235};
236pub use id::{GnssSatelliteId, GnssSystem, SatelliteIdError};
237pub use inertial::{
238    gauss_markov_bias_decay, gauss_markov_bias_variance_increment, gravity_ecef_mps2,
239    mechanize_ecef, normal_gravity_mps2, rodrigues_delta_dcm, simulate_imu_samples,
240    simulate_imu_samples_from_increments, true_imu_increment_between, AttitudeQuaternion,
241    ConingCorrection, CorrectedImuIncrement, ImuBias, ImuCalibration, ImuErrorModel, ImuGrade,
242    ImuRateRandomWalk, ImuSample, ImuSampleKind, ImuSimulationOptions, ImuSimulationOutput,
243    ImuSimulator, ImuSpec, InertialError, MechanizationConfig, NavState, SimulatedImuSequence,
244    StrapdownMechanizer, DEFAULT_IMU_SIM_SEED, WGS84_NORMAL_GRAVITY_EQUATOR_MPS2,
245    WGS84_NORMAL_GRAVITY_POLE_MPS2, WGS84_SOMIGLIANA_K,
246};
247pub use observables::{
248    emission_media_batch_at_j2000_s, observable_media_corrections, predict_batch_with_media,
249    predict_batch_with_media_parallel, predict_ranges_with_media, predict_with_media,
250    AppliedMediaCorrections, EmissionMediaBatch, EmissionMediaBatchOptions, EmissionMediaStatus,
251    MediaPredictOptions, MediaPredictedObservables, MediaRangePrediction,
252    ObservableIonosphereCorrection, ObservableMediaOptions, ObservableTroposphereCorrection,
253};
254pub use positioning::{RejectedSat, RejectionReason};
255pub use sbas_pl::{
256    sbas_protection_levels, AirborneModel, DegradationParams, ProtectionGeometry, ProtectionRow,
257    SbasErrorModel, SbasKMultipliers, SbasPlError, SbasProtection, SbasSisError,
258};
259pub use sidereal::{
260    orbit_repeat_lag, periodicity_strength, periodicity_strength_with_sample_interval,
261    repeat_period, sidereal_filter, solar_day_period, SiderealFilterError, SiderealFilterOptions,
262    SiderealFilterOutput, SiderealTemplateMethod, SIDEREAL_DAY_NANOS, SIDEREAL_DAY_SECONDS,
263};