Background
This came out of a conversation with the ublox_dgnss maintainer (@hortovanyi): aussierobots/ublox_dgnss#63
The ublox UBX-NAV-COV message carries a full 3x3 velocity covariance in NED that NavSatFix does not have. Fusing GPS velocity as an independent measurement alongside wheel odometry would be useful for slip detection: if GPS velocity and wheel odometry disagree, the wheels are slipping.
Why not native UBX messages
@amock correctly pointed out that adding a direct dependency on ublox_ubx_msgs would force every FusionCore user to install ublox packages at compile time, even those running Septentrio, ZED, Piksi, or any other receiver. That breaks hardware-agnostic packaging for a single vendor benefit.
Revised design
FusionCore adds a generic gnss.velocity_topic that accepts geometry_msgs/TwistWithCovariance. Any receiver that outputs GPS velocity in that format plugs straight in.
fusioncore:
ros__parameters:
gnss.velocity_topic: "/gnss/velocity" # leave empty to disable
For ublox users specifically, a small separate bridge node subscribes to UBX-NAV-PVT and UBX-NAV-COV and republishes as TwistWithCovariance. That bridge lives in its own package with no impact on non-ublox users.
What this enables
- GPS velocity fusion as an independent measurement update (separate from wheel odometry)
- Slip detection: innovation between GPS velocity and wheel odometry reveals wheel slip
- Velocity stays valid during brief GPS position degradation, bridging dead-reckoning gaps
- Works with any receiver that publishes velocity, not just ublox
What stays the same
FusionCore core has zero new vendor dependencies. The ublox bridge is a separate optional package.
cc @hortovanyi @amock
Background
This came out of a conversation with the ublox_dgnss maintainer (@hortovanyi): aussierobots/ublox_dgnss#63
The ublox UBX-NAV-COV message carries a full 3x3 velocity covariance in NED that NavSatFix does not have. Fusing GPS velocity as an independent measurement alongside wheel odometry would be useful for slip detection: if GPS velocity and wheel odometry disagree, the wheels are slipping.
Why not native UBX messages
@amock correctly pointed out that adding a direct dependency on ublox_ubx_msgs would force every FusionCore user to install ublox packages at compile time, even those running Septentrio, ZED, Piksi, or any other receiver. That breaks hardware-agnostic packaging for a single vendor benefit.
Revised design
FusionCore adds a generic
gnss.velocity_topicthat acceptsgeometry_msgs/TwistWithCovariance. Any receiver that outputs GPS velocity in that format plugs straight in.For ublox users specifically, a small separate bridge node subscribes to UBX-NAV-PVT and UBX-NAV-COV and republishes as
TwistWithCovariance. That bridge lives in its own package with no impact on non-ublox users.What this enables
What stays the same
FusionCore core has zero new vendor dependencies. The ublox bridge is a separate optional package.
cc @hortovanyi @amock