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 artifact_bytes;
70pub mod astro;
71pub(crate) mod format;
72
73// ---------------------------------------------------------------------------
74// GNSS domain layer. Behind the default-on `gnss` feature so a propagation-only
75// consumer can opt out. Additional product modules are added as each lands.
76// ---------------------------------------------------------------------------
77
78mod ambiguity; // shared RTK/PPP cycle-slip policy + wide-lane/narrow-lane prep
79mod antenna; // shared ANTEX PCV/PCO zenith/azimuth interpolation kernels
80pub mod antex; // ANTEX receiver/satellite antenna parser + PCO/PCV lookup
81pub mod araim; // advanced RAIM multi-hypothesis protection levels
82pub mod bias; // Bias-SINEX and DCB bias products
83mod broadcast; // broadcast-ephemeris (GPS LNAV / Galileo I/NAV) orbit + clock
84pub mod broadcast_comparison; // broadcast-vs-precise (SISRE orbit/clock) accuracy
85pub mod carrier_phase; // carrier-phase combinations, cycle-slip detection, Hatch smoothing
86pub mod clock_stability; // Allan-family receiver clock stability estimators
87pub mod constants; // shared physical/time constants (used by astro + gnss)
88pub mod constellation; // GNSS constellation identity catalog (CelesTrak/NAVCEN)
89mod crinex; // Hatanaka (CRINEX) observation-file decoder
90pub mod data; // sans-IO GNSS product filename and archive URL catalog
91pub mod dop; // dilution-of-precision geometry (GDOP/PDOP/HDOP/VDOP/TDOP)
92pub mod error_metrics; // covariance-derived CEP, radial, and ellipse metrics
93pub mod exact_cache; // exact-product cache identity binding and atomic publication
94pub mod frequencies; // canonical GNSS carrier-frequency table
95mod glonass; // GLONASS PZ-90.11 state-vector RK4 propagation
96pub mod has; // Galileo HAS MT1 correction payload decode/encode
97mod ionex; // Klobuchar broadcast model + IONEX ionospheric maps
98pub mod navigation; // navigation-message bit-level codecs (GPS LNAV)
99pub mod nmea; // NMEA 0183 sentence parsing, stream grouping, and GGA writing
100pub mod ntrip; // NTRIP client sans-I/O request, response, and stream handling
101pub mod observables; // forward GNSS observable prediction
102pub mod ppp_corrections; // static-arc PPP correction tables
103pub mod precise_positioning; // static multi-epoch PPP float solve
104mod reduced_orbit; // compact mean-element orbit approximation (fitted)
105mod rinex_clock; // RINEX clock satellite-bias parsing and interpolation
106mod rinex_common; // shared RINEX header concepts (time-system label mapping)
107mod rinex_nav; // RINEX 3 navigation-message parsing (GPS/Galileo broadcast)
108mod rinex_obs; // RINEX 3 observation parsing + single-frequency pseudoranges
109mod rinex_qc; // RINEX observation/navigation lint and mechanical repair
110pub mod rtcm; // RTCM 3 differential-GNSS stream decode/encode (MSM, station, ephemeris)
111pub mod rtk; // RTK double-difference construction
112pub mod sbas;
113pub mod sbas_pl; // SBAS single-hypothesis protection levels
114pub mod scenario; // scenario-driven synthetic GNSS observable generation
115pub mod sidereal; // repeating-geometry residual filtering and period diagnostics
116pub mod signal; // GPS C/A code, coherent correlation, and acquisition
117pub mod source_localization; // ToA/TDOA source localization from arrival times
118mod sp3; // SP3-c / SP3-d parser + arbitrary-epoch interpolation
119mod spp; // single-point positioning (least-squares PVT)
120pub mod ssr; // SSR correction store and corrected broadcast ephemeris source
121pub mod staleness; // product-staleness graceful degradation for time-varying products
122pub mod static_positioning; // multi-epoch static position fusion
123mod static_reference_station; // RINEX reference-station static solve
124mod tropo; // Saastamoinen zenith + Niell (NMF) mapping troposphere
125pub mod velocity; // receiver velocity / clock-drift least-squares solve
126
127mod error;
128pub mod frame;
129pub mod frame_catalog;
130mod id;
131
132pub mod atmosphere;
133pub mod combinations;
134pub mod dgnss;
135pub mod ephemeris;
136pub mod estimation; // Phase-2 estimation substrate: named operation-order recipes
137pub mod geodesic; // WGS84 geodesic direct and inverse solvers
138pub mod geodetic_time_series; // robust station velocity, trajectory, steps, and fields
139pub mod geofence; // geodesic geofence containment and uncertainty gates
140pub mod geoid; // geoid undulation grid + bilinear interpolation (orthometric heights)
141pub mod geometry;
142pub mod geometry_quality;
143pub mod ils; // integer least squares ambiguity-resolution kernels
144pub mod inertial; // ECEF strapdown INS frames, mechanization, and IMU error model
145pub mod integrity; // shared protection and covariance primitives
146pub mod observation_qc; // RINEX observation completeness and signal rollups
147pub mod qc_obs {
148    //! RINEX observation quality-control rollups.
149    pub use crate::observation_qc::*;
150}
151pub mod orbit;
152pub mod orbit_determination;
153pub mod positioning;
154pub mod prelude;
155pub mod quality; // measurement weighting, RAIM, and FDE integrity checks
156pub mod rinex;
157pub mod rtk_filter; // sequential RTK baseline filter - serializable state ABI (kernel migration)
158pub mod terrain;
159pub mod terrain_store;
160pub mod tides;
161pub mod tolerances;
162
163pub mod fusion; // GNSS/INS error-state prediction and EKF correction over the inertial surface
164
165pub use crate::astro::frames::{
166    EarthOrientation, EarthOrientationProvider, PolarMotionSample,
167    PolarMotionSeriesEarthOrientationProvider, TdbEarthOrientationProvider,
168};
169pub use crate::error_metrics::{
170    error_ellipse_from_enu_m2, horizontal_radius_at, metrics_from_ecef_covariance_m2,
171    metrics_from_enu_covariance_m2, metrics_from_kinematic_solution,
172    metrics_from_position_covariance, spherical_radius_at, vertical_radius_at, ErrorEllipse,
173    ErrorMetricsError, PercentileRadius, PositionErrorMetrics,
174};
175pub use crate::estimation::{
176    alpha_beta_apply_measurement, alpha_beta_filter_step, alpha_beta_predict,
177    alpha_beta_steady_state_gains, cfar_ca_false_alarm_probability, cfar_ca_multiplier_from_pfa,
178    cfar_ca_pfa_from_multiplier, cfar_ca_threshold, ewma_update, ewma_update_power_of_two,
179    kalman_cv_steady_state_gains, mad_spread, nis_expected_value, nis_gate_test,
180    nis_gate_threshold, nis_statistic, normalized_innovation, rts_smooth, smooth_track_rts,
181    AlphaBetaGains, AlphaBetaState, AlphaBetaStep, PrimitiveError, ScalarKalmanGains,
182    SmoothedTrack, SmoothedTrackEpoch, TrackCoordinateFrame, TrackError, TrackFilter,
183    TrackFilterConfig, TrackGatedUpdate, TrackInnovation, TrackPrediction, TrackRtsEpoch,
184    TrackRtsHistory, TrackRtsHistoryBuilder, TrackState, TrackUpdate, MAD_GAUSSIAN_CONSISTENCY,
185};
186pub use crate::quality::{
187    reliability_araim, reliability_design, wtest_noncentrality, wtest_noncentrality_components,
188    ObservationReliability, RangeReliabilityRow, ReliabilityOptions, ReliabilityReport,
189    ReliabilitySummary, WtestNoncentralityComponents,
190};
191pub use araim::ProtectionModel;
192pub use error::{Error, Result};
193pub use frame::{
194    geodetic_to_itrf, itrf_to_geodetic, FrameValueError, ItrfPositionM, ItrfVelocityMS,
195    Wgs84Geodetic,
196};
197pub use frame_catalog::{
198    catalog, catalog_entry, propagate_position, transform, transform_from_epoch, FrameCatalogError,
199    HelmertParameters, HelmertRates, HelmertTransform, TerrestrialFrame, TerrestrialPositionM,
200    TerrestrialState, TerrestrialVelocityMPerYear, TERRESTRIAL_FRAME_CATALOG,
201};
202pub use fusion::{
203    loose_coupling_correction, smooth_fusion_rts, ukf_correct_closed_loop,
204    validate_time_sync_gnss_order, validate_time_sync_imu_order, velocity_match_outage,
205    velocity_match_outage_to_state, F64Bits, FusionFilterKind, FusionRtsEpoch, FusionRtsHistory,
206    FusionRtsHistoryBuilder, FusionStateCodecError, FusionUpdate, GnssFixMeasurement,
207    GnssFixStatus, GnssFixStatusWeighting, IggIiiMeasurementReweighting, InertialFilter,
208    InertialFilterConfig, LooseCouplingConfig, NonHolonomicConstraintConfig,
209    SerializableErrorStateLayout, SerializableFusionSnapshot, SerializableFusionState,
210    SerializableGnssFixStatus, SerializableImuSample, SerializableImuSampleKind,
211    SerializableInsFilterState, SerializableLooseMeasurement, SerializableNavState,
212    SerializableRateEndpoint, SerializableSatelliteId, SerializableStationarityDetectorSample,
213    SerializableStoredCheckpoint, SerializableStoredGnssMeasurement, SerializableStoredImuSample,
214    SerializableTightCarrierPhaseObservation, SerializableTightFilterState,
215    SerializableTightGnssEpoch, SerializableTightGnssObservation,
216    SerializableTightRangeRateObservation, SerializableTimeSyncHistory,
217    SerializableTimeSyncHistoryConfig, SmoothedFusionEpoch, SmoothedFusionTrajectory,
218    StationarityDetectorSnapshotSample, StationaryDetectorConfig, StationaryUpdateConfig,
219    TimeSyncHistoryConfig, TimeSyncHistoryStatus, TimeSyncUpdate, UkfUpdateOptions,
220    UnscentedTransformOptions, VelocityMatchState, VelocityMatchedTrajectory,
221    VelocityMatchingConfig, YangPredictionAdaptiveFactor, DEFAULT_TIME_SYNC_CHECKPOINT_CAPACITY,
222    DEFAULT_TIME_SYNC_IMU_CAPACITY, FUSION_STATE_CODEC_VERSION,
223};
224pub use geodesic::{geodesic_direct, geodesic_inverse, GeodesicError};
225pub use geofence::{
226    containment, containment_probability, containment_probability_with_options, crossing,
227    crossing_probability, crossing_probability_with_options, distance_to_boundary, CrossingEvent,
228    CrossingKind, Fence, GeofenceError, GeofencePositionEstimate, PositionUncertainty,
229    ProbabilityHysteresis, ProbabilityMethod, ProbabilityOptions, GEOFENCE_BOUNDARY_TOLERANCE_M,
230    PLANAR_FAST_PATH_MAX_RADIUS_M,
231};
232pub use geoid::{
233    egm96_undulations_deg, egm96_undulations_rad, ellipsoidal_height_m, geoid_undulation,
234    geoid_undulations_deg, geoid_undulations_rad, orthometric_height_m, Egm2008GridSpacing,
235    Egm2008RasterWindow, GeoidError, GeoidGrid, ProjVgridshiftArithmetic, ProjVgridshiftError,
236};
237pub use id::{GnssSatelliteId, GnssSystem, SatelliteIdError};
238pub use inertial::{
239    gauss_markov_bias_decay, gauss_markov_bias_variance_increment, gravity_ecef_mps2,
240    mechanize_ecef, normal_gravity_mps2, rodrigues_delta_dcm, simulate_imu_samples,
241    simulate_imu_samples_from_increments, true_imu_increment_between, AttitudeQuaternion,
242    ConingCorrection, CorrectedImuIncrement, ImuBias, ImuCalibration, ImuErrorModel, ImuGrade,
243    ImuRateRandomWalk, ImuSample, ImuSampleKind, ImuSimulationOptions, ImuSimulationOutput,
244    ImuSimulator, ImuSpec, InertialError, MechanizationConfig, NavState, SimulatedImuSequence,
245    StrapdownMechanizer, DEFAULT_IMU_SIM_SEED, WGS84_NORMAL_GRAVITY_EQUATOR_MPS2,
246    WGS84_NORMAL_GRAVITY_POLE_MPS2, WGS84_SOMIGLIANA_K,
247};
248pub use observables::{
249    emission_media_batch_at_j2000_s, observable_media_corrections, predict_batch_with_media,
250    predict_batch_with_media_parallel, predict_ranges_with_media, predict_with_media,
251    AppliedMediaCorrections, EmissionMediaBatch, EmissionMediaBatchOptions, EmissionMediaStatus,
252    MediaPredictOptions, MediaPredictedObservables, MediaRangePrediction,
253    ObservableIonosphereCorrection, ObservableMediaOptions, ObservableTroposphereCorrection,
254};
255pub use positioning::{RejectedSat, RejectionReason};
256pub use sbas_pl::{
257    sbas_protection_levels, AirborneModel, DegradationParams, ProtectionGeometry, ProtectionRow,
258    SbasErrorModel, SbasKMultipliers, SbasPlError, SbasProtection, SbasSisError,
259};
260pub use sidereal::{
261    orbit_repeat_lag, periodicity_strength, periodicity_strength_with_sample_interval,
262    repeat_period, sidereal_filter, solar_day_period, SiderealFilterError, SiderealFilterOptions,
263    SiderealFilterOutput, SiderealTemplateMethod, SIDEREAL_DAY_NANOS, SIDEREAL_DAY_SECONDS,
264};