What's new in 0.3.0
Filter observability: see inside the filter in real time
Every GPS fix now publishes a structured message on /fusion/debug/gnss_status with the exact rejection reason, Mahalanobis distance, chi2 threshold, fix metadata, and coast mode state. Instead of a generic log line you can now see:
accepted: false
rejection_reason: CHI2_FAILED
mahalanobis_sq: 847.3
chi2_threshold: 16.27
hdop: 1.2
in_coast_mode: false
lever_arm_used: false
heading_sigma_deg: 28.1A second topic, /fusion/debug/filter_health, publishes at 1 Hz with innovation norms per sensor, position and heading 1-sigma uncertainty (meters and degrees), and GPS coast mode state. All fields are plain float64 — plottable directly in Foxglove, PlotJuggler, or rqt without a custom panel.
Two new message types: fusioncore_ros/msg/GnssStatus and fusioncore_ros/msg/FilterHealth. No new dependencies.
Lever arm correction now gated on heading quality
Previously lever arm activated whenever heading_validated=true regardless of how uncertain heading was. During prolonged turns, heading sigma can grow to 25-30 degrees while heading_validated stays true. At 30 degrees with a 0.5m lever arm, the position correction adds 0.25m of error instead of removing it.
The new gnss.lever_arm_max_heading_sigma_deg parameter (default 20 degrees) disables lever arm when heading uncertainty exceeds the threshold and re-enables it when heading tightens. The current lever_arm_used and heading_sigma_deg values are published on every fix via /fusion/debug/gnss_status.
gnss.lever_arm_max_heading_sigma_deg: 20.0 # defaultConfigurable heading motion thresholds
The minimum speed and maximum yaw rate required for GPS displacement to count toward heading observability were previously hardcoded. Now configurable:
gnss.track_heading_min_speed: 0.2 # m/s (default)
gnss.track_heading_max_yaw_rate: 0.3 # rad/s (default)Useful for high-vibration platforms (increase min_speed) or robots that navigate tight corridors at low speed (decrease max_yaw_rate).
Config audit
fusioncore.yaml rewritten to document all 87 parameters with inline explanations. Every hardware config updated with missing params. configuration.md fixed: removed a non-existent param and a duplicate section.
Full changelog: CHANGELOG.md