Full Vehicle Fusion
Node ID: fullVehicleFusion · Role: Filter · Realtime config: no
Description
Multi-sensor vehicle fusion combining IMU, GNSS, and wheel odometry. Outputs FusedVehiclePoseV2 with position, heading, velocity, and global coordinates.
Algorithm notes
What the algorithm is
Full Vehicle Fusion is a two-stage cascade of nonlinear Kalman filters that estimates the pose of a road vehicle.
The first stage is a planar odometry-IMU filter. Its state is horizontal position, heading, and a gyro yaw-rate bias, driven by wheel speed and turn rate as control inputs and corrected by GNSS position. It works in a local ground-plane frame anchored on the first usable fix, and also reports global latitude/longitude.
The second stage is a full 3D GNSS-IMU filter whose state covers position, velocity, attitude, gravity, gyro and accelerometer biases, the GNSS antenna lever arm, and a GNSS-IMU time offset. It works in a local east-north-up frame referenced to a configured origin or the first fix. Its output - 3D pose, vehicle pose, and global pose - is the node’s final product.
The two stages are coupled through a synthetic (“virtual”) GNSS stream: the first stage’s filtered position and heading are stamped as GNSS samples and fed to the second stage. In this default mode the odometry stage bridges real GNSS dropouts, so the second stage never sees an outage. Alternatively the second stage can be fed real fixes directly, bypassing the cascade for its position input while the odometry stage still runs.
How each input is used
IMU goes to both stages at full rate. The odometry stage uses only the selected gyroscope axis as its turn rate; the GNSS-IMU stage uses the full gyroscope and accelerometer to propagate attitude, velocity, and position between fixes, and estimates their biases. Losing the IMU stops the odometry stage entirely unless the wheel turn-rate fallback is enabled, because heading would otherwise coast on a stale rate. The GNSS-IMU stage is the one that drives output: each IMU tick emits a pose, but only once the second stage has initialized and is unpaused.
Wheel speed is the odometry stage’s forward control input and drives its output rate; it also provides stopped detection for both stages and cross-validates GNSS speed during heading initialization.
GNSS always reaches the odometry stage. Until it initializes, no output is produced anywhere: it waits for a usable fix (RTK-fixed only, by default), then seeds heading either from the dual-antenna orientation or, failing that, from several consecutive course-over-ground samples above the minimum speed that agree with wheel speed. The second stage initializes similarly, then runs an initialization phase of a fixed number of measurement updates during which every fix is used and outlier gating on pitch is suspended. Real GNSS also supplies altitude, dual-antenna pitch, and heading to the synthetic stream even in virtual mode - height is latched from RTK-fixed samples only, and pitch is attached only while it is fresh.
After a sustained RTK dropout the second stage waits for a continuous window of fixed samples, reinitializes with a velocity seed, and then withholds output for a convergence grace period. Expect no pose during that window rather than a degraded one.
Parameters by concern
Pipeline shape. Direct-GNSS mode, the virtual sample rate, and the stamped quality/HDOP values decide what the second stage sees. Leave the reported-accuracy option on: in virtual mode it carries the odometry stage’s own position uncertainty forward, which is what stops the second stage from treating smoothed dead reckoning as a perfect fix. The continuity guard and stable-sample count govern how a discontinuity in stage one is kept out of stage two.
Trust balance. Each stage has a control-noise pair (speed/turn rate, or acceleration/angular rate) versus a measurement noise for position, heading, and pitch. Raising control noise or lowering measurement noise pulls the estimate toward GNSS; the reverse leans on dead reckoning. Innovation gates and outlier de-weighting soften rather than reject bad fixes; the heading and pitch gates reject outright but release after a few seconds of sustained disagreement, on the assumption that the estimate is then the wrong one.
Observability aids. Gravity leveling, Doppler velocity, zero-velocity updates when stopped, gyro-bias estimation, and wheel-scale estimation all add measurements that would otherwise be unobservable, particularly roll during sustained turns and biases at standstill.
Geometry and quality. IMU-to-vehicle rotations, the antenna lever arm, the turn-rate axis, RTK requirements, and RTCM age handling.
Tuning and failure modes
Get geometry right before touching noise: a wrong mounting rotation or turn-rate axis produces errors no retuning can absorb.
Common failures: no output at all usually means an uninitialized stage - check for an RTK fix, and for a single-antenna receiver check that the vehicle reaches the initialization speed. Persistent heading offset points to a wrong mounting rotation or an unestimated gyro bias. Position that drifts smoothly then snaps means fixes are being de-weighted or gated out. Altitude jumps at fix transitions mean the height gate is off. Repeated pauses of the second stage mean the odometry output is discontinuous - loosen nothing here, fix the wheel-speed or GNSS input instead. Enable intermediate output to see the odometry stage’s pose alongside the final one when isolating which stage is at fault.
Inputs / Outputs
- Inputs:
Imu,Gnss,VehicleSpeed - Outputs:
FusedPose,FusedVehiclePose,FusedVehiclePoseV2,GlobalFusedPose,FusionStateInt
Config aliases
FullVehicleFusionFilter, fullVehicleFusionFilter, fullVehicleFusion
Required feature
vehicular_fusion
Properties
The following fields are exposed in the node’s Properties panel in the UI. Types map to UI widgets (e.g. string → text input, number → numeric, boolean → toggle, select → dropdown, json → JSON editor).
| Key | Label | Type | Default | Description / Notes |
|---|---|---|---|---|
_h_pipeline | Pipeline | heading | — | — |
useDirectGnss | Use Direct GNSS | boolean | false | Feed real GNSS fixes straight into the GNSS-IMU stage instead of the virtual GNSS synthesized from the odometry-IMU output. Use when a trustworthy GNSS receiver is available; leave off to run odometry-driven dead reckoning through the GNSS stage. |
gateHeightOnRtkFix | Gate Height on RTK Fix | boolean | true | Only update the height carried by the virtual GNSS from RTK-fixed (quality 4) samples, holding the last good height through float/single-fix dropouts. The virtual GNSS is stamped quality 4, so without this a float-mode height (often metres off) is trusted as a perfect fix and the fused altitude jumps then dips when RTK returns. |
outputIntermediateResults | Output Intermediate Results | boolean | false | Also emit the odometry-IMU stage’s pose (the first stage of the pipeline) alongside the final fused output, for diagnostics and comparison. |
virtualGnssQuality | Virtual GNSS Quality | number | 4.0 | Fix-quality value stamped on the synthetic GNSS samples generated from the odometry-IMU output. 4 = RTK Fixed, so the downstream GNSS-IMU stage treats the virtual fixes as high quality. |
virtualGnssHdop | Virtual GNSS HDOP | number | 0.5 | Horizontal dilution-of-precision value stamped on the synthetic GNSS samples. Lower values make the GNSS-IMU stage trust the virtual position more. |
stableSamplesRequired | Stable Samples Required | number | 5 | Number of consecutive stable odometry-IMU samples required before the GNSS-IMU stage is un-paused after an odometry outage or jump (position more than 2 m beyond expected travel, or yaw > 0.1 rad). Guards against feeding a discontinuity into the second stage. |
enableOdometryContinuityCheck | Enable Odometry Continuity Check | boolean | true | Reject virtual GNSS samples when the odometry-IMU output has an unexpected position/yaw discontinuity. Disable for diagnostics when you want to inspect downstream filter behavior without this guard. |
virtualGnssUpdatePeriodMS | Virtual GNSS Update Period (ms) | number | 100 | Minimum interval in milliseconds between synthetic GNSS samples fed to the GNSS-IMU stage. Rate-limits the virtual GNSS to a realistic receiver update rate (100 ms = 10 Hz). |
virtualGnssPitchMaxAgeMS | Virtual GNSS Pitch Max Age (ms) | number | 250 | Maximum age in milliseconds of the most recent real RTK pitch sample for it to be attached to a synthetic GNSS sample. Older pitch is considered stale and dropped. |
_h_odoCore | Odometry - Core Tuning | heading | — | — |
odometryImuFusion.velError | Odo: Velocity Error | number | 0.278 | Odometry-IMU stage: control noise std-dev on the wheel-speed input in m/s. Higher values trust the odometry speed less. |
odometryImuFusion.omegaError | Odo: Angular Velocity Error | number | 0.5 | Odometry-IMU stage: control noise std-dev on the turn-rate input in rad/s. Lower values give smoother heading but slower response to turns. |
odometryImuFusion.measurementError | Odo: Measurement Error | number | 0.1 | Odometry-IMU stage: measurement noise std-dev for the GNSS position update, in meters. Lower trusts position fixes more; higher leans on odometry dead reckoning. |
odometryImuFusion.smoothFit | Odo: Smoothing | boolean | true | Odometry-IMU stage: smooth the output by interpolating between the lagged and current filter states across measurement epochs. |
_h_odoOutliers | Odometry - Outlier Handling | heading | — | — |
odometryImuFusion.usePositionOutlierDeweighting | Odo: Use Position Outlier De-weighting | boolean | true | Odometry-IMU stage: when a position update exceeds the innovation gate, inflate its measurement noise and apply it softly instead of applying it at full weight. |
odometryImuFusion.innovationGate | Odo: Innovation Gate (sigma) | number | 5.0 | Odometry-IMU stage: chi-square threshold for enabled outlier handling. A fix whose squared Mahalanobis distance exceeds dof + gate x sqrt(2 x dof) is treated as an outlier. 0 disables position outlier de-weighting. |
_h_odoWheel | Odometry - Wheel Odometry & Turn Rate | heading | — | — |
odometryImuFusion.useImuTurnRate | Odo: Use IMU Turn Rate | boolean | true | Odometry-IMU stage: take the yaw rate from the IMU gyroscope rather than differential wheel speeds. Far less sensitive to wheel slip and track-width error. |
odometryImuFusion.useWheelAngularFallback | Odo: Wheel Turn-Rate Fallback | boolean | false | Odometry-IMU stage: fall back to the wheel-derived turn rate when the IMU stream is lost. Off by default - with no measured wheel angular rate, a dead IMU leaves no heading reference, so output stops rather than dead-reckoning on a stale turn rate. Enable only with a trustworthy wheel angular rate. |
odometryImuFusion.imuTimeoutLimit | Odo: IMU Timeout (s) | number | 0.5 | Odometry-IMU stage: time in seconds without an IMU sample before the IMU stream is declared lost. On loss the stage stops output - or switches to the wheel turn rate if Odo: Wheel Turn-Rate Fallback is on and a valid wheel rate is present. The IMU normally streams at 100 Hz; raise only to tolerate longer dropouts. |
odometryImuFusion.imuTurnRateAxis | Odo: IMU Turn Rate Axis | vector3 | {"x":0,"y":0,"z":1} | Odometry-IMU stage: unit vector selecting which IMU gyroscope axis supplies the vehicle yaw rate. Default (0,0,1) uses the IMU Z axis. |
odometryImuFusion.wheelOmegaScale | Odo: Wheel Omega Scale | number | 1.0 | Odometry-IMU stage: multiplier on the wheel-derived angular velocity to correct track-width/wheel-radius calibration error. Only used when Odo: Use IMU Turn Rate is off. |
odometryImuFusion.detectSlip | Odo: Detect Wheel Slip | boolean | true | Odometry-IMU stage: inflate the control noise on ticks where the IMU and wheel-derived turn rates disagree (wheel slip or wrong track width). |
odometryImuFusion.estimateWheelScale | Odo: Estimate Wheel Scale | boolean | true | Odometry-IMU stage: estimate a slow wheel-speed scale factor (tire wear/pressure) from the ratio of RTK-fixed travelled distance to integrated odometry distance. |
odometryImuFusion.estimateGyroBias | Odo: Estimate Gyro Bias | boolean | true | Odometry-IMU stage: estimate the gyro yaw-rate bias as a Kalman filter state and subtract it from the IMU turn rate. Verified multi-second GNSS-yaw windows and stopped gyro samples measure it directly. |
odometryImuFusion.gyroBiasRandomWalk | Odo: Gyro Bias Random Walk | number | 0.0005 | Odometry-IMU stage: random-walk process noise density for the gyro yaw-bias state, in rad/s per sqrt(s). |
odometryImuFusion.gyroBiasZuptError | Odo: Gyro Bias ZUPT Error | number | 0.0035 | Odometry-IMU stage: measurement noise for stopped zero-angular-rate gyro-bias updates, in rad/s. |
_h_odoOrient | Odometry - Orientation & Heading | heading | — | — |
odometryImuFusion.initializeFromGnssOrientation | Odo: Init from GNSS Orientation | boolean | true | Odometry-IMU stage: seed the initial heading from the GNSS dual-antenna orientation. Only used when Odo: Use GNSS Without RTK Fix is off; when no valid orientation is reported (single antenna), or in that mode, the heading comes from course over ground instead. |
odometryImuFusion.useGnssYawMeasurement | Odo: Use GNSS Yaw Measurement | boolean | false | Odometry-IMU stage: use the GNSS dual-antenna heading as a 1D yaw measurement while moving, instead of relying on position cross-covariance alone. Also keeps the heading corrected through a position-only outage (single-point GPS with a still-fixed dual-antenna heading) and feeds the moving gyro-bias estimator. |
odometryImuFusion.gnssYawError | Odo: GNSS Yaw Error | number | 0.05 | Odometry-IMU stage: GNSS heading measurement noise std-dev in radians. |
_h_odoStopped | Odometry - Stopped Detection | heading | — | — |
odometryImuFusion.retainStateWhenStopped | Odo: Retain State When Stopped | boolean | true | Odometry-IMU stage: freeze the state while the vehicle is stationary to prevent drift from sensor noise. |
odometryImuFusion.velocityThreshold | Odo: Velocity Threshold | number | 0.01 | Odometry-IMU stage: speed in m/s below which the vehicle is considered stopped (with hysteresis at half this value). Used for stopped-state detection and optional state freezing. |
_h_odoInit | Odometry - Initialization & Convergence | heading | — | — |
odometryImuFusion.initVelocityThreshold | Odo: Init Velocity Threshold | number | 3.0 | Odometry-IMU stage: minimum speed in m/s for the course-over-ground heading initialization. |
odometryImuFusion.initVelocityTolerance | Odo: Init Velocity Tolerance | number | 0.4 | Odometry-IMU stage: maximum allowed difference in m/s between the GNSS-derived speed and the wheel speed for a sample to count toward the course-over-ground heading initialization. |
_h_odoRtk | Odometry - RTK & GNSS Quality | heading | — | — |
odometryImuFusion.useGpsOnRtkFloat | Odo: Use GNSS Without RTK Fix | boolean | false | Odometry-IMU stage: accept GNSS position fixes of any quality instead of only RTK Fixed (quality 4). When off, the stage stays uninitialized until the first RTK Fixed sample. |
odometryImuFusion.useRtcmAgeDeweighting | Odo: Use RTCM Age De-weighting | boolean | true | Odometry-IMU stage: inflate the GNSS position and heading measurement noise with the receiver’s RTCM correction age, so an RTK-fixed fix on stale corrections is smoothly de-weighted toward dead reckoning. When off, RTK-fixed fixes are trusted regardless of correction age. |
odometryImuFusion.rtcmAgeSigmaPerSec | Odo: RTCM Age Sigma Per Second (m/s) | number | 0.05 | Odometry-IMU stage: per-second growth in meters of the GNSS position sigma when RTK FIXED with a non-zero RTCM correction age. Effective measurement error becomes measurementError + diffAge * this. Only used when Odo: Use RTCM Age De-weighting is on. |
_h_odoMount | Odometry - IMU Mounting & Frames | heading | — | — |
odometryImuFusion.imuToCarRotation | Odo: IMU-to-Car Rotation | quaternion | {"w":1,"x":0,"y":0,"z":0} | Odometry-IMU stage: quaternion (w,x,y,z) from the IMU sensor frame to the vehicle body frame, accounting for the IMU mounting orientation. |
_h_gnssCore | GNSS - Core Tuning | heading | — | — |
gnssImuFusion.accelError | GNSS: Acceleration Error | number | 0.2 | GNSS-IMU stage: accelerometer measurement noise std-dev in m/s². Lower trusts IMU acceleration more; higher relies more on GNSS position updates. |
gnssImuFusion.omegaError | GNSS: Angular Velocity Error | number | 0.04 | GNSS-IMU stage: gyroscope measurement noise std-dev in rad/s. Lower trusts the gyro more for orientation; higher lets GNSS heading dominate. |
gnssImuFusion.measurementError | GNSS: Measurement Error | number | 0.07 | GNSS-IMU stage: GNSS position measurement noise std-dev in meters. In virtual GNSS mode the odometry stage’s posterior sigma additionally floors this value. |
gnssImuFusion.orientationFromGnssError | GNSS: Orientation from GNSS Error | number | 0.006 | GNSS-IMU stage: GNSS-derived heading measurement noise std-dev. Lower gives GNSS heading more authority over the fused orientation. |
gnssImuFusion.smoothFit | GNSS: Smoothing | boolean | true | GNSS-IMU stage: smooth the output by interpolating between the lagged and current filter states across measurement epochs. |
gnssImuFusion.measurementStep | GNSS: Measurement Step | number | 1 | GNSS-IMU stage: GNSS measurement decimation. After initialization only every N-th sample creates a measurement update. 1 uses every sample. |
_h_gnssOutliers | GNSS - Outlier Handling | heading | — | — |
gnssImuFusion.useGnssPositionOutlierDeweighting | GNSS: Use Position Outlier De-weighting | boolean | true | GNSS-IMU stage: when a GNSS position update exceeds the innovation gate, inflate its measurement noise and apply it softly instead of applying it at full weight. |
gnssImuFusion.useGnssVelocityOutlierDeweighting | GNSS: Use Velocity Outlier De-weighting | boolean | true | GNSS-IMU stage: when a GNSS Doppler velocity update exceeds the innovation gate, inflate its measurement noise and apply it softly instead of applying it at full weight. Only applies when GNSS velocity measurement is enabled. |
gnssImuFusion.innovationGate | GNSS: Innovation Gate (sigma) | number | 5.0 | GNSS-IMU stage: chi-square threshold for enabled outlier handling. 0 disables position/velocity outlier de-weighting. |
_h_gnssOrient | GNSS - Orientation & Heading | heading | — | — |
gnssImuFusion.initializeFromGnssOrientation | GNSS: Init from GNSS Orientation | boolean | true | GNSS-IMU stage: use the initial GNSS heading to set the starting orientation, avoiding heading estimation from motion at startup. |
gnssImuFusion.useGnssOrientationMeasurement | GNSS: Use GNSS Orientation Measurement | boolean | true | GNSS-IMU stage: continuously correct the IMU-derived orientation with GNSS heading, preventing heading drift over time. |
gnssImuFusion.transformGnssOrientation | GNSS: Transform GNSS Orientation | boolean | true | GNSS-IMU stage: apply the IMU-to-car rotation when interpreting GNSS orientation. Enable when GNSS heading is in the vehicle frame but the IMU is mounted differently. |
gnssImuFusion.useGnssPitchMeasurement | GNSS: Use GNSS Pitch Measurement | boolean | true | GNSS-IMU stage: apply GNSS-derived pitch (dual-antenna or Doppler-velocity) as a measurement update for the tilt estimate. |
gnssImuFusion.gnssPitchError | GNSS: Pitch Error | number | 0.005 | GNSS-IMU stage: GNSS pitch measurement noise std-dev in radians. Lower gives GNSS pitch more authority over the fused tilt. |
gnssImuFusion.gnssPitchMinSpeed | GNSS: Pitch Min Speed (m/s) | number | 0.3 | GNSS-IMU stage: minimum vehicle speed in m/s before Doppler-velocity-derived GNSS pitch is used. Does not affect direct dual-antenna pitch. |
gnssImuFusion.useGnssPitchOutlierGate | GNSS: Use Pitch Outlier Gate | boolean | true | GNSS-IMU stage: reject GNSS pitch measurements that disagree with the IMU-propagated tilt by more than the gate, suppressing the dual-antenna pitch blunders that appear right at RTK fix transitions (still flagged quality-4). |
gnssImuFusion.gnssPitchOutlierGateDeg | GNSS: Pitch Outlier Gate (deg) | number | 6.0 | GNSS-IMU stage: maximum disagreement in degrees between a GNSS pitch measurement and the IMU-propagated tilt before the measurement is rejected. Only used when GNSS: Use Pitch Outlier Gate is on. |
gnssImuFusion.useGnssHeadingOutlierGate | GNSS: Use Heading Outlier Gate | boolean | true | GNSS-IMU stage: reject GNSS heading (orientation) measurements that disagree with the gyro-propagated heading by more than the gate, suppressing the dual-antenna heading blunders at RTK fix transitions. A sustained outage re-seeds heading via the init path, which bypasses this gate. |
gnssImuFusion.gnssHeadingOutlierGateDeg | GNSS: Heading Outlier Gate (deg) | number | 10.0 | GNSS-IMU stage: maximum disagreement in degrees between a GNSS heading measurement and the gyro-propagated heading before the measurement is rejected. Only used when GNSS: Use Heading Outlier Gate is on. |
_h_gnssGravity | GNSS - Gravity & Velocity Updates | heading | — | — |
gnssImuFusion.useGravityMeasurement | GNSS: Use Gravity Leveling Measurement | boolean | true | GNSS-IMU stage: centripetal-compensated gravity-direction update keeping pitch AND roll observable during sustained turns. |
gnssImuFusion.gravityMeasurementError | GNSS: Gravity Measurement Error | number | 0.02 | GNSS-IMU stage: per-component noise std-dev of the gravity direction measurement (unitless; 0.02 corresponds to about 1.1 degrees). |
gnssImuFusion.gravityMeasurementIntervalMs | GNSS: Gravity Measurement Interval (ms) | number | 250 | GNSS-IMU stage: minimum interval between gravity leveling updates in milliseconds. |
gnssImuFusion.gravityNormTolerance | GNSS: Gravity Norm Tolerance (m/s²) | number | 0.5 | GNSS-IMU stage: reject the gravity measurement when the centripetal-compensated specific-force norm deviates from g by more than this. Filters out acceleration/braking transients. |
gnssImuFusion.useGnssVelocityMeasurement | GNSS: Use GNSS Velocity Measurement | boolean | true | GNSS-IMU stage: use the receiver Doppler velocity vector as a direct 3D velocity update. Improves tilt observability and speeds up recovery after dropouts. |
gnssImuFusion.gnssVelocityError | GNSS: Velocity Error | number | 0.1 | GNSS-IMU stage: GNSS Doppler velocity measurement noise std-dev in m/s. |
_h_gnssStopped | GNSS - Stopped Detection & ZUPT | heading | — | — |
gnssImuFusion.retainStateWhenStopped | GNSS: Retain State When Stopped | boolean | true | GNSS-IMU stage: freeze the state when the vehicle is stationary to prevent position drift from IMU noise. |
gnssImuFusion.isStoppedThreshold | GNSS: Is-Stopped Threshold | number | 0.005 | GNSS-IMU stage: speed in m/s below which the vehicle is considered stationary, used for stopped detection and optional state freezing. |
gnssImuFusion.setHeightToZero | GNSS: Set Height to Zero | boolean | false | GNSS-IMU stage: constrain the vertical (Up) position to zero, suitable for ground vehicles on a known flat plane to prevent altitude drift. |
gnssImuFusion.enableZupt | GNSS: Zero-Velocity Updates When Stopped | boolean | true | GNSS-IMU stage: zero-velocity pseudo-measurement plus IMU at-rest update while stopped, converging biases and tilt at every stop. |
gnssImuFusion.zuptIntervalMs | GNSS: ZUPT Interval (ms) | number | 250 | GNSS-IMU stage: minimum interval between zero-velocity updates in milliseconds. |
_h_gnssInit | GNSS - Initialization & Convergence | heading | — | — |
gnssImuFusion.nMeasurementInit | GNSS: Initialization Measurement Count | number | 100 | GNSS-IMU stage: number of measurement updates during the initialization phase before switching to normal operation. |
gnssImuFusion.velocityThreshold | GNSS: Velocity Threshold | number | 3.0 | GNSS-IMU stage: minimum vehicle speed in m/s required to initialize heading from GNSS course-over-ground. Below this, heading is ambiguous and initialization is deferred. |
gnssImuFusion.velocityTolerance | GNSS: Velocity Tolerance | number | 0.4 | GNSS-IMU stage: maximum allowed difference in m/s between GNSS-derived velocity and vehicle speed during cross-validation at initialization. |
gnssImuFusion.filterConvergenceTimeMs | GNSS: Filter Convergence Time (ms) | number | 3000 | GNSS-IMU stage: grace period in milliseconds after reinitialization during which the output is considered not yet converged. |
_h_gnssRtk | GNSS - RTK & GNSS Quality | heading | — | — |
gnssImuFusion.requireRtkFix | GNSS: Require RTK Fix | boolean | true | GNSS-IMU stage: accept only RTK Fixed (quality 4) GNSS samples; float and standalone fixes are rejected to keep centimeter-level accuracy. |
gnssImuFusion.useReportedAccuracy | GNSS: Use Reported Accuracy | boolean | true | GNSS-IMU stage: use the receiver-reported horizontal accuracy as a floor for the position measurement error. In virtual GNSS mode this carries the odometry stage’s posterior sigma into the second filter, so leaving it on is recommended. |
gnssImuFusion.useRtcmAgeDeweighting | GNSS: Use RTCM Age De-weighting | boolean | true | GNSS-IMU stage: inflate the GNSS position measurement noise with the receiver’s RTCM correction age, so an RTK-fixed fix on stale corrections is smoothly de-weighted instead of hard-rejected. When off, RTK-fixed fixes are trusted regardless of correction age. |
gnssImuFusion.rtcmAgeSigmaPerSec | GNSS: RTCM Age Sigma Per Second (m/s) | number | 0.05 | GNSS-IMU stage: per-second growth (in meters) of GNSS position sigma when the receiver reports RTK FIXED with a non-zero RTCM correction age. Only used when GNSS: Use RTCM Age De-weighting is on. |
gnssImuFusion.rtcmAgeMaxS | GNSS: RTCM Age Hard Limit (s) | number | 30.0 | GNSS-IMU stage: hard ceiling on RTCM correction age in seconds. An older RTK FIXED sample is treated as fix loss. 0 disables the ceiling. |
gnssImuFusion.rtkFixLostTimeoutMs | GNSS: RTK Fix Lost Timeout (ms) | number | 2000 | GNSS-IMU stage: time in milliseconds after losing RTK fix before the filter triggers a reinitialization sequence. |
gnssImuFusion.rtkSettleMs | GNSS: RTK Settle After Restore (ms) | number | 5000 | GNSS-IMU stage: after a sustained RTK outage, wait this many milliseconds of uninterrupted RTK-FIXED samples before reinitialising and resuming output. |
_h_gnssMount | GNSS - IMU Mounting & Frames | heading | — | — |
gnssImuFusion.autoImuToCarRotation | GNSS: Auto IMU-to-Car Rotation | boolean | false | GNSS-IMU stage: automatically compute the IMU-to-car rotation from the accelerometer during initialization. Determines pitch/roll only; yaw is handled by GNSS heading. |
gnssImuFusion.imuToCarRotation | GNSS: IMU-to-Vehicle Rotation | quaternion | {"w":1,"x":0,"y":0,"z":0} | GNSS-IMU stage: quaternion (w,x,y,z) from the IMU sensor frame to the vehicle body frame, accounting for the IMU mounting orientation. |
gnssImuFusion.estimateGpsAntennaOffset | GNSS: Estimate GPS Antenna Offset | boolean | true | GNSS-IMU stage: estimate the GPS antenna lever arm (IMU-to-antenna offset) as part of the filter state, adding 3 states (x/y/z offset in meters). |
gnssImuFusion.gpsAntennaOffset | GNSS: GPS Antenna Offset | vector3 | {"x":0,"y":0,"z":0} | GNSS-IMU stage: initial GPS antenna position offset from the IMU in meters (x=forward, y=left, z=up). Starting value when estimation is on, or fixed offset when off. |
gnssImuFusion.globalOrigin | GNSS: Global Origin | latlon | — | GNSS-IMU stage: reference point for converting GNSS WGS84 coordinates to local ENU frame. If unset, the first GNSS fix is used as origin. |
_h_gnssAdvanced | GNSS - Timing & Advanced Process Noise | heading | — | — |
gnssImuFusion.imuQueueDelayMs | GNSS: IMU Queue Delay (ms) | number | 0 | GNSS-IMU stage: delay in milliseconds applied to incoming IMU data to time-align it with GNSS arrival. Compensates for differing message latencies. |
gnssImuFusion.estimateTimeDelay | GNSS: Estimate GNSS-IMU Time Delay | boolean | false | GNSS-IMU stage: estimate the time offset between the GNSS and IMU clocks as an additional filter state (online time-delay calibration). |
gnssImuFusion.omegaBiasRandomWalk | GNSS: Gyro Bias Random Walk | number | 1e-05 | GNSS-IMU stage: random-walk process noise density for the gyro bias states in rad/s per sqrt(s). 0 disables. |
gnssImuFusion.accelBiasRandomWalk | GNSS: Accel Bias Random Walk | number | 0.0001 | GNSS-IMU stage: random-walk process noise density for the accelerometer bias states in m/s² per sqrt(s). 0 disables. |
gnssImuFusion.controlNoiseRefDt | GNSS: Control Noise Reference dt (s) | number | 0.01 | GNSS-IMU stage: reference IMU sample interval for process-noise scaling, making tuning independent of the IMU rate. 0 keeps the legacy fixed per-sample sigma. |
_h_gnssOutput | GNSS - Output & Diagnostics | heading | — | — |
gnssImuFusion.outputWhenFilterNotReady | GNSS: Output When Filter Not Ready | boolean | false | GNSS-IMU stage: emit fused pose output even before the filter has fully initialized and converged. Useful for diagnostics but output quality will be poor. |
gnssImuFusion.outputRawGnssData | GNSS: Output Raw GNSS Data | boolean | false | GNSS-IMU stage: include raw GNSS position data alongside fused output for comparison and debugging. |
gnssImuFusion.debugFilter | GNSS: Debug Filter | boolean | false | GNSS-IMU stage: enable verbose debug logging for the fusion filter (prediction/measurement steps, innovations, state updates). |
Example node definition
A full node definition in config.json looks like the block below. Paste it under the sinks key of your config, keyed by the node’s instance name (any identifier; it doesn’t have to match the node ID).
{
"sinks": {
"fullVehicleFusion": {
"dataEndpoint": "inproc://fullVehicleFusion_data",
"inputEndpoints": [
"inproc://imu_data",
"inproc://gnss_data",
"inproc://vehicleSpeed_data"
],
"inputDataFilter": [
"Imu",
"Gnss",
"VehicleSpeed"
],
"settings": {
"enableOdometryContinuityCheck": true,
"gateHeightOnRtkFix": true,
"gnssImuFusion": {
"accelBiasRandomWalk": 0.0001,
"accelError": 0.2,
"autoImuToCarRotation": false,
"controlNoiseRefDt": 0.01,
"debugFilter": false,
"enableZupt": true,
"estimateGpsAntennaOffset": true,
"estimateTimeDelay": false,
"filterConvergenceTimeMs": 3000,
"globalOrigin": null,
"gnssHeadingOutlierGateDeg": 10.0,
"gnssPitchError": 0.005,
"gnssPitchMinSpeed": 0.3,
"gnssPitchOutlierGateDeg": 6.0,
"gnssVelocityError": 0.1,
"gpsAntennaOffset": {
"x": 0,
"y": 0,
"z": 0
},
"gravityMeasurementError": 0.02,
"gravityMeasurementIntervalMs": 250,
"gravityNormTolerance": 0.5,
"imuQueueDelayMs": 0,
"imuToCarRotation": {
"w": 1,
"x": 0,
"y": 0,
"z": 0
},
"initializeFromGnssOrientation": true,
"innovationGate": 5.0,
"isStoppedThreshold": 0.005,
"measurementError": 0.07,
"measurementStep": 1,
"nMeasurementInit": 100,
"omegaBiasRandomWalk": 1e-05,
"omegaError": 0.04,
"orientationFromGnssError": 0.006,
"outputRawGnssData": false,
"outputWhenFilterNotReady": false,
"requireRtkFix": true,
"retainStateWhenStopped": true,
"rtcmAgeMaxS": 30.0,
"rtcmAgeSigmaPerSec": 0.05,
"rtkFixLostTimeoutMs": 2000,
"rtkSettleMs": 5000,
"setHeightToZero": false,
"smoothFit": true,
"transformGnssOrientation": true,
"useGnssHeadingOutlierGate": true,
"useGnssOrientationMeasurement": true,
"useGnssPitchMeasurement": true,
"useGnssPitchOutlierGate": true,
"useGnssPositionOutlierDeweighting": true,
"useGnssVelocityMeasurement": true,
"useGnssVelocityOutlierDeweighting": true,
"useGravityMeasurement": true,
"useReportedAccuracy": true,
"useRtcmAgeDeweighting": true,
"velocityThreshold": 3.0,
"velocityTolerance": 0.4,
"zuptIntervalMs": 250
},
"odometryImuFusion": {
"detectSlip": true,
"estimateGyroBias": true,
"estimateWheelScale": true,
"gnssYawError": 0.05,
"gyroBiasRandomWalk": 0.0005,
"gyroBiasZuptError": 0.0035,
"imuTimeoutLimit": 0.5,
"imuToCarRotation": {
"w": 1,
"x": 0,
"y": 0,
"z": 0
},
"imuTurnRateAxis": {
"x": 0,
"y": 0,
"z": 1
},
"initVelocityThreshold": 3.0,
"initVelocityTolerance": 0.4,
"initializeFromGnssOrientation": true,
"innovationGate": 5.0,
"measurementError": 0.1,
"omegaError": 0.5,
"retainStateWhenStopped": true,
"rtcmAgeSigmaPerSec": 0.05,
"smoothFit": true,
"useGnssYawMeasurement": false,
"useGpsOnRtkFloat": false,
"useImuTurnRate": true,
"usePositionOutlierDeweighting": true,
"useRtcmAgeDeweighting": true,
"useWheelAngularFallback": false,
"velError": 0.278,
"velocityThreshold": 0.01,
"wheelOmegaScale": 1.0
},
"outputIntermediateResults": false,
"stableSamplesRequired": 5,
"useDirectGnss": false,
"virtualGnssHdop": 0.5,
"virtualGnssPitchMaxAgeMS": 250,
"virtualGnssQuality": 4.0,
"virtualGnssUpdatePeriodMS": 100
}
}
}
}
Field reference
| Field | Purpose |
|---|---|
dataEndpoint | Endpoint this node binds to publish its output. Omit to let the runtime generate one. |
inputEndpoints | List of upstream endpoints this node connects to (outEndpoint / dataEndpoint values from upstream nodes). |
inputDataFilter | Optional whitelist of data types. Messages whose type isn’t in the list are dropped at the subscriber. |
settings | All user-configurable fields — see the Properties table above. |
Connections can also be declared at the top-level
connectionsarray whensettings.explicitConnectionsistrue, as an alternative to fillinginputEndpointson each node.