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