Susi Server

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

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).

KeyLabelTypeDefaultDescription / Notes
_h_pipelinePipelineheading
useDirectGnssUse Direct GNSSbooleanfalseFeed 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.
gateHeightOnRtkFixGate Height on RTK FixbooleantrueOnly 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.
outputIntermediateResultsOutput Intermediate ResultsbooleanfalseAlso emit the odometry-IMU stage’s pose (the first stage of the pipeline) alongside the final fused output, for diagnostics and comparison.
virtualGnssQualityVirtual GNSS Qualitynumber4.0Fix-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.
virtualGnssHdopVirtual GNSS HDOPnumber0.5Horizontal dilution-of-precision value stamped on the synthetic GNSS samples. Lower values make the GNSS-IMU stage trust the virtual position more.
stableSamplesRequiredStable Samples Requirednumber5Number 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.
enableOdometryContinuityCheckEnable Odometry Continuity CheckbooleantrueReject 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.
virtualGnssUpdatePeriodMSVirtual GNSS Update Period (ms)number100Minimum 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).
virtualGnssPitchMaxAgeMSVirtual GNSS Pitch Max Age (ms)number250Maximum 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_odoCoreOdometry - Core Tuningheading
odometryImuFusion.velErrorOdo: Velocity Errornumber0.278Odometry-IMU stage: control noise std-dev on the wheel-speed input in m/s. Higher values trust the odometry speed less.
odometryImuFusion.omegaErrorOdo: Angular Velocity Errornumber0.5Odometry-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.measurementErrorOdo: Measurement Errornumber0.1Odometry-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.smoothFitOdo: SmoothingbooleantrueOdometry-IMU stage: smooth the output by interpolating between the lagged and current filter states across measurement epochs.
_h_odoOutliersOdometry - Outlier Handlingheading
odometryImuFusion.usePositionOutlierDeweightingOdo: Use Position Outlier De-weightingbooleantrueOdometry-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.innovationGateOdo: Innovation Gate (sigma)number5.0Odometry-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_odoWheelOdometry - Wheel Odometry & Turn Rateheading
odometryImuFusion.useImuTurnRateOdo: Use IMU Turn RatebooleantrueOdometry-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.useWheelAngularFallbackOdo: Wheel Turn-Rate FallbackbooleanfalseOdometry-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.imuTimeoutLimitOdo: IMU Timeout (s)number0.5Odometry-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.imuTurnRateAxisOdo: IMU Turn Rate Axisvector3{"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.wheelOmegaScaleOdo: Wheel Omega Scalenumber1.0Odometry-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.detectSlipOdo: Detect Wheel SlipbooleantrueOdometry-IMU stage: inflate the control noise on ticks where the IMU and wheel-derived turn rates disagree (wheel slip or wrong track width).
odometryImuFusion.estimateWheelScaleOdo: Estimate Wheel ScalebooleantrueOdometry-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.estimateGyroBiasOdo: Estimate Gyro BiasbooleantrueOdometry-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.gyroBiasRandomWalkOdo: Gyro Bias Random Walknumber0.0005Odometry-IMU stage: random-walk process noise density for the gyro yaw-bias state, in rad/s per sqrt(s).
odometryImuFusion.gyroBiasZuptErrorOdo: Gyro Bias ZUPT Errornumber0.0035Odometry-IMU stage: measurement noise for stopped zero-angular-rate gyro-bias updates, in rad/s.
_h_odoOrientOdometry - Orientation & Headingheading
odometryImuFusion.initializeFromGnssOrientationOdo: Init from GNSS OrientationbooleantrueOdometry-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.useGnssYawMeasurementOdo: Use GNSS Yaw MeasurementbooleanfalseOdometry-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.gnssYawErrorOdo: GNSS Yaw Errornumber0.05Odometry-IMU stage: GNSS heading measurement noise std-dev in radians.
_h_odoStoppedOdometry - Stopped Detectionheading
odometryImuFusion.retainStateWhenStoppedOdo: Retain State When StoppedbooleantrueOdometry-IMU stage: freeze the state while the vehicle is stationary to prevent drift from sensor noise.
odometryImuFusion.velocityThresholdOdo: Velocity Thresholdnumber0.01Odometry-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_odoInitOdometry - Initialization & Convergenceheading
odometryImuFusion.initVelocityThresholdOdo: Init Velocity Thresholdnumber3.0Odometry-IMU stage: minimum speed in m/s for the course-over-ground heading initialization.
odometryImuFusion.initVelocityToleranceOdo: Init Velocity Tolerancenumber0.4Odometry-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_odoRtkOdometry - RTK & GNSS Qualityheading
odometryImuFusion.useGpsOnRtkFloatOdo: Use GNSS Without RTK FixbooleanfalseOdometry-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.useRtcmAgeDeweightingOdo: Use RTCM Age De-weightingbooleantrueOdometry-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.rtcmAgeSigmaPerSecOdo: RTCM Age Sigma Per Second (m/s)number0.05Odometry-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_odoMountOdometry - IMU Mounting & Framesheading
odometryImuFusion.imuToCarRotationOdo: IMU-to-Car Rotationquaternion{"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_gnssCoreGNSS - Core Tuningheading
gnssImuFusion.accelErrorGNSS: Acceleration Errornumber0.2GNSS-IMU stage: accelerometer measurement noise std-dev in m/s². Lower trusts IMU acceleration more; higher relies more on GNSS position updates.
gnssImuFusion.omegaErrorGNSS: Angular Velocity Errornumber0.04GNSS-IMU stage: gyroscope measurement noise std-dev in rad/s. Lower trusts the gyro more for orientation; higher lets GNSS heading dominate.
gnssImuFusion.measurementErrorGNSS: Measurement Errornumber0.07GNSS-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.orientationFromGnssErrorGNSS: Orientation from GNSS Errornumber0.006GNSS-IMU stage: GNSS-derived heading measurement noise std-dev. Lower gives GNSS heading more authority over the fused orientation.
gnssImuFusion.smoothFitGNSS: SmoothingbooleantrueGNSS-IMU stage: smooth the output by interpolating between the lagged and current filter states across measurement epochs.
gnssImuFusion.measurementStepGNSS: Measurement Stepnumber1GNSS-IMU stage: GNSS measurement decimation. After initialization only every N-th sample creates a measurement update. 1 uses every sample.
_h_gnssOutliersGNSS - Outlier Handlingheading
gnssImuFusion.useGnssPositionOutlierDeweightingGNSS: Use Position Outlier De-weightingbooleantrueGNSS-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.useGnssVelocityOutlierDeweightingGNSS: Use Velocity Outlier De-weightingbooleantrueGNSS-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.innovationGateGNSS: Innovation Gate (sigma)number5.0GNSS-IMU stage: chi-square threshold for enabled outlier handling. 0 disables position/velocity outlier de-weighting.
_h_gnssOrientGNSS - Orientation & Headingheading
gnssImuFusion.initializeFromGnssOrientationGNSS: Init from GNSS OrientationbooleantrueGNSS-IMU stage: use the initial GNSS heading to set the starting orientation, avoiding heading estimation from motion at startup.
gnssImuFusion.useGnssOrientationMeasurementGNSS: Use GNSS Orientation MeasurementbooleantrueGNSS-IMU stage: continuously correct the IMU-derived orientation with GNSS heading, preventing heading drift over time.
gnssImuFusion.transformGnssOrientationGNSS: Transform GNSS OrientationbooleantrueGNSS-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.useGnssPitchMeasurementGNSS: Use GNSS Pitch MeasurementbooleantrueGNSS-IMU stage: apply GNSS-derived pitch (dual-antenna or Doppler-velocity) as a measurement update for the tilt estimate.
gnssImuFusion.gnssPitchErrorGNSS: Pitch Errornumber0.005GNSS-IMU stage: GNSS pitch measurement noise std-dev in radians. Lower gives GNSS pitch more authority over the fused tilt.
gnssImuFusion.gnssPitchMinSpeedGNSS: Pitch Min Speed (m/s)number0.3GNSS-IMU stage: minimum vehicle speed in m/s before Doppler-velocity-derived GNSS pitch is used. Does not affect direct dual-antenna pitch.
gnssImuFusion.useGnssPitchOutlierGateGNSS: Use Pitch Outlier GatebooleantrueGNSS-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.gnssPitchOutlierGateDegGNSS: Pitch Outlier Gate (deg)number6.0GNSS-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.useGnssHeadingOutlierGateGNSS: Use Heading Outlier GatebooleantrueGNSS-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.gnssHeadingOutlierGateDegGNSS: Heading Outlier Gate (deg)number10.0GNSS-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_gnssGravityGNSS - Gravity & Velocity Updatesheading
gnssImuFusion.useGravityMeasurementGNSS: Use Gravity Leveling MeasurementbooleantrueGNSS-IMU stage: centripetal-compensated gravity-direction update keeping pitch AND roll observable during sustained turns.
gnssImuFusion.gravityMeasurementErrorGNSS: Gravity Measurement Errornumber0.02GNSS-IMU stage: per-component noise std-dev of the gravity direction measurement (unitless; 0.02 corresponds to about 1.1 degrees).
gnssImuFusion.gravityMeasurementIntervalMsGNSS: Gravity Measurement Interval (ms)number250GNSS-IMU stage: minimum interval between gravity leveling updates in milliseconds.
gnssImuFusion.gravityNormToleranceGNSS: Gravity Norm Tolerance (m/s²)number0.5GNSS-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.useGnssVelocityMeasurementGNSS: Use GNSS Velocity MeasurementbooleantrueGNSS-IMU stage: use the receiver Doppler velocity vector as a direct 3D velocity update. Improves tilt observability and speeds up recovery after dropouts.
gnssImuFusion.gnssVelocityErrorGNSS: Velocity Errornumber0.1GNSS-IMU stage: GNSS Doppler velocity measurement noise std-dev in m/s.
_h_gnssStoppedGNSS - Stopped Detection & ZUPTheading
gnssImuFusion.retainStateWhenStoppedGNSS: Retain State When StoppedbooleantrueGNSS-IMU stage: freeze the state when the vehicle is stationary to prevent position drift from IMU noise.
gnssImuFusion.isStoppedThresholdGNSS: Is-Stopped Thresholdnumber0.005GNSS-IMU stage: speed in m/s below which the vehicle is considered stationary, used for stopped detection and optional state freezing.
gnssImuFusion.setHeightToZeroGNSS: Set Height to ZerobooleanfalseGNSS-IMU stage: constrain the vertical (Up) position to zero, suitable for ground vehicles on a known flat plane to prevent altitude drift.
gnssImuFusion.enableZuptGNSS: Zero-Velocity Updates When StoppedbooleantrueGNSS-IMU stage: zero-velocity pseudo-measurement plus IMU at-rest update while stopped, converging biases and tilt at every stop.
gnssImuFusion.zuptIntervalMsGNSS: ZUPT Interval (ms)number250GNSS-IMU stage: minimum interval between zero-velocity updates in milliseconds.
_h_gnssInitGNSS - Initialization & Convergenceheading
gnssImuFusion.nMeasurementInitGNSS: Initialization Measurement Countnumber100GNSS-IMU stage: number of measurement updates during the initialization phase before switching to normal operation.
gnssImuFusion.velocityThresholdGNSS: Velocity Thresholdnumber3.0GNSS-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.velocityToleranceGNSS: Velocity Tolerancenumber0.4GNSS-IMU stage: maximum allowed difference in m/s between GNSS-derived velocity and vehicle speed during cross-validation at initialization.
gnssImuFusion.filterConvergenceTimeMsGNSS: Filter Convergence Time (ms)number3000GNSS-IMU stage: grace period in milliseconds after reinitialization during which the output is considered not yet converged.
_h_gnssRtkGNSS - RTK & GNSS Qualityheading
gnssImuFusion.requireRtkFixGNSS: Require RTK FixbooleantrueGNSS-IMU stage: accept only RTK Fixed (quality 4) GNSS samples; float and standalone fixes are rejected to keep centimeter-level accuracy.
gnssImuFusion.useReportedAccuracyGNSS: Use Reported AccuracybooleantrueGNSS-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.useRtcmAgeDeweightingGNSS: Use RTCM Age De-weightingbooleantrueGNSS-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.rtcmAgeSigmaPerSecGNSS: RTCM Age Sigma Per Second (m/s)number0.05GNSS-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.rtcmAgeMaxSGNSS: RTCM Age Hard Limit (s)number30.0GNSS-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.rtkFixLostTimeoutMsGNSS: RTK Fix Lost Timeout (ms)number2000GNSS-IMU stage: time in milliseconds after losing RTK fix before the filter triggers a reinitialization sequence.
gnssImuFusion.rtkSettleMsGNSS: RTK Settle After Restore (ms)number5000GNSS-IMU stage: after a sustained RTK outage, wait this many milliseconds of uninterrupted RTK-FIXED samples before reinitialising and resuming output.
_h_gnssMountGNSS - IMU Mounting & Framesheading
gnssImuFusion.autoImuToCarRotationGNSS: Auto IMU-to-Car RotationbooleanfalseGNSS-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.imuToCarRotationGNSS: IMU-to-Vehicle Rotationquaternion{"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.estimateGpsAntennaOffsetGNSS: Estimate GPS Antenna OffsetbooleantrueGNSS-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.gpsAntennaOffsetGNSS: GPS Antenna Offsetvector3{"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.globalOriginGNSS: Global OriginlatlonGNSS-IMU stage: reference point for converting GNSS WGS84 coordinates to local ENU frame. If unset, the first GNSS fix is used as origin.
_h_gnssAdvancedGNSS - Timing & Advanced Process Noiseheading
gnssImuFusion.imuQueueDelayMsGNSS: IMU Queue Delay (ms)number0GNSS-IMU stage: delay in milliseconds applied to incoming IMU data to time-align it with GNSS arrival. Compensates for differing message latencies.
gnssImuFusion.estimateTimeDelayGNSS: Estimate GNSS-IMU Time DelaybooleanfalseGNSS-IMU stage: estimate the time offset between the GNSS and IMU clocks as an additional filter state (online time-delay calibration).
gnssImuFusion.omegaBiasRandomWalkGNSS: Gyro Bias Random Walknumber1e-05GNSS-IMU stage: random-walk process noise density for the gyro bias states in rad/s per sqrt(s). 0 disables.
gnssImuFusion.accelBiasRandomWalkGNSS: Accel Bias Random Walknumber0.0001GNSS-IMU stage: random-walk process noise density for the accelerometer bias states in m/s² per sqrt(s). 0 disables.
gnssImuFusion.controlNoiseRefDtGNSS: Control Noise Reference dt (s)number0.01GNSS-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_gnssOutputGNSS - Output & Diagnosticsheading
gnssImuFusion.outputWhenFilterNotReadyGNSS: Output When Filter Not ReadybooleanfalseGNSS-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.outputRawGnssDataGNSS: Output Raw GNSS DatabooleanfalseGNSS-IMU stage: include raw GNSS position data alongside fused output for comparison and debugging.
gnssImuFusion.debugFilterGNSS: Debug FilterbooleanfalseGNSS-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

FieldPurpose
dataEndpointEndpoint this node binds to publish its output. Omit to let the runtime generate one.
inputEndpointsList of upstream endpoints this node connects to (outEndpoint / dataEndpoint values from upstream nodes).
inputDataFilterOptional whitelist of data types. Messages whose type isn’t in the list are dropped at the subscriber.
settingsAll user-configurable fields — see the Properties table above.

Connections can also be declared at the top-level connections array when settings.explicitConnections is true, as an alternative to filling inputEndpoints on each node.

Loading documentation…