Gneiss is a tightly-coupled GNSS and Inertial Navigation System (INS) engine written in Rust. It fuses raw satellite observations (pseudorange, carrier phase, and Doppler) with high-rate inertial sensors (accelerometer and gyroscope) using an Extended Kalman Filter (EKF).
The engine is designed for robust operation in multi-path environments, utilizing empirical statistical methods for outlier rejection and variance scaling.
- Tightly-Coupled Integration: Direct fusion of raw GNSS observations and IMU data within the primary state vector.
- Adaptive Estimation: Implements Innovation-based Adaptive Estimation (IAE) and Median Absolute Deviation (MAD) RAIM to scale observation variances dynamically.
- Ambiguity Resolution: Uses the LAMBDA (Least-squares AMBiguity Decorrelation Adjustment) algorithm for carrier-phase integer ambiguity resolution.
- Post-Processing (PPK): Supports forward-backward Rauch-Tung-Striebel (RTS) smoothing to produce continuous trajectories from static files.
- Real-Time Streaming:
#![no_std]compatible core engine, with atokio-basedlivesubcommand for streaming data via local UART and NTRIP casters.
The engine's architecture provides a mathematical scaffold for multiple GNSS processing modes. Currently, the project is heavily focused on optimizing RTK + INS workflows for urban canyon and challenging multipath environments.
Supported Modes:
- Single Point Positioning (SPP)
- Real-Time Kinematic (RTK)
- RTK + INS (Tightly-Coupled)
- Precise Point Positioning (PPP)
- PPP + INS
Features Included:
- Ionosphere-Free Linear Combinations for multi-frequency correction.
- Zenith Wet Delay (ZWD) tropospheric estimation.
- Geophysical corrections (Solid Earth Tides, Satellite Phase Wind-Up).
- CDDIS SP3 and precise clock (.clk) parsing via 10th-order Lagrange interpolation.
- Clock Jump State Preservation algorithms to prevent EKF divergence during TCXO adjustments.
The engine operates on a causal, recursive filtering architecture:
graph LR
A[Raw Satellite Data] --> B(Gneiss Engine)
C[Raw Inertial Data] --> B
B --> D{Extended Kalman Filter}
D -->|Float State| H[LAMBDA Ambiguity Resolution]
H -->|Fixed Ambiguities| I{FFRT Validation}
I -->|Pass| J[Apply Fix & Hold]
I -->|Fail| D
D --> E[Position Trajectory]
D --> F[Calibrated Sensor Biases]
D --> G[Attitude & Heading]
Gneiss provides a command-line interface for testing and processing datasets. To run a tightly-coupled fusion pipeline with backward smoothing on a static dataset:
cargo run --release -p gneiss-cli -- process \
--rover datasets/my_data/rover.obs \
--base datasets/my_data/base.obs \
--output trajectory.pos \
--enable-imu-fusion \
--enable-backward-smoothing \
--lever-arm "0.1,0.0,-0.2"To run the engine in real-time streaming mode using a serial port and an NTRIP base station:
cargo run --release -p gneiss-cli -- live \
--port /dev/ttyACM0 \
--baud 460800 \
--ntrip-url rtk2go.com \
--ntrip-mount MOUNT \
--ntrip-user USER \
--ntrip-pass PASS-
--rover <PATH>: (Required) Path to the rover's raw GNSS observations (RINEX.obs). -
--base <PATH>: Path to the base station's raw GNSS observations (RINEX.obs). Required for RTK/PPK. If omitted, the engine defaults to SPP (Single Point Positioning). -
--output <PATH>: (Required) Path for the resulting.postrajectory file. -
--config <PATH>: Path to a JSON configuration file to override default EKF process noise and tuning parameters. -
--enable-backward-smoothing: Enables the Rauch-Tung-Striebel (RTS) backward smoother. -
--lambda-ratio <FLOAT>: Minimum ratio for the LAMBDA Partial Ambiguity Resolution (PAR) test (default:3.0). -
--lambda-subset <INT>: Minimum number of satellites required for PAR (default:7). -
--lever-arm <X,Y,Z>: Translation vector (in meters) from the IMU center of navigation to the GNSS antenna phase center in the vehicle body frame. -
--calibrate-imu: Enables state-estimation of IMU mounting rotations (Roll, Pitch, Yaw) relative to the vehicle frame. -
--raim-outlier-m <FLOAT>: SPP Receiver Autonomous Integrity Monitoring (RAIM) threshold in meters. -
--chi-square-pr <FLOAT>: EKF Chi-Square threshold for pseudorange measurement rejection. -
--chi-square-cp <FLOAT>: EKF Chi-Square threshold for carrier phase measurement rejection.
For technical implementation details, see the following documents:
| Crate | Purpose |
|---|---|
gneiss-core |
Core data structures, physical constants, and geometric models. |
gneiss-geodesy |
Earth reference frames, datum transformations, and gravity models. |
gneiss-parsers |
Decoders for standard positioning formats (RINEX, UBX, RTCM3). |
gneiss-rtk |
The Extended Kalman Filter, mechanization, and ambiguity resolution logic. |
gneiss-ntrip |
Asynchronous networking client for RTK corrections. |
gneiss-cli |
Command-line interface for dataset processing and real-time execution. |