Skip to content

Add velocity_decay to Omnidirectional3D to prevent drift when odom goes silent#34

Draft
bkanator wants to merge 1 commit into
humblefrom
feat/omnidirectional-3d-velocity-decay
Draft

Add velocity_decay to Omnidirectional3D to prevent drift when odom goes silent#34
bkanator wants to merge 1 commit into
humblefrom
feat/omnidirectional-3d-velocity-decay

Conversation

@bkanator
Copy link
Copy Markdown

Summary

When a nav2 controller deactivates, wheel odom stops publishing. Without a correcting velocity source, Omnidirectional3D propagates the last known velocity indefinitely, causing unbounded position drift in the fuse estimate.

Adds a velocity_decay parameter (1/s, default 0.0) to Omnidirectional3D. When set, predicted velocity is multiplied by exp(-k * dt) each step. At k=1.0 (20 Hz), velocity halves in ~0.7s. Default 0.0 preserves existing behavior.

Updates analytical Jacobians: d(vel2)/d(vel1) = exp(-k*dt) instead of 1.0.

Claude agent checks

  • code-reviewer
  • test-runner
  • platform-architect-bot

@bkanator bkanator force-pushed the feat/omnidirectional-3d-velocity-decay branch from 3fa9dfd to 16233dd Compare May 29, 2026 02:12
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds configurable exponential velocity decay to the Omnidirectional3D motion model to reduce drift when velocity observations stop, while preserving existing behavior by default.

Changes:

  • Adds velocity_decay parameter parsing, validation, storage, and propagation through Omnidirectional3D constraints.
  • Updates prediction functions and analytical Jacobians to apply decay to linear/angular velocity.
  • Adds prediction tests for zero decay, velocity reduction, and decay-factor Jacobians.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
fuse_models/src/omnidirectional_3d.cpp Reads and forwards velocity_decay into prediction and constraints.
fuse_models/src/omnidirectional_3d_state_kinematic_constraint.cpp Stores decay on the constraint and passes it to the cost function.
fuse_models/include/fuse_models/omnidirectional_3d.hpp Documents and stores the new model parameter.
fuse_models/include/fuse_models/omnidirectional_3d_state_kinematic_constraint.hpp Extends constructor/serialization with decay.
fuse_models/include/fuse_models/omnidirectional_3d_state_cost_function.hpp Extends cost function with decay propagation.
fuse_models/include/fuse_models/omnidirectional_3d_predict.hpp Applies decay in prediction and Jacobians.
fuse_models/test/test_omnidirectional_3d_predict.cpp Adds tests for decay behavior and Jacobian scaling.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +129 to +131
vel_linear2_x = vel_linear1_x * decay_factor + acc_linear1_x * dt;
vel_linear2_y = vel_linear1_y * decay_factor + acc_linear1_y * dt;
vel_linear2_z = vel_linear1_z * decay_factor + acc_linear1_z * dt;
Comment on lines +229 to +231
vel_linear2_x = vel_linear1_x * decay_factor + acc_linear1_x * dt;
vel_linear2_y = vel_linear1_y * decay_factor + acc_linear1_y * dt;
vel_linear2_z = vel_linear1_z * decay_factor + acc_linear1_z * dt;
* x_acc, y_acc, z_acc)
*/
Omnidirectional3DStateCostFunction(double const dt, fuse_core::Matrix15d const& A);
Omnidirectional3DStateCostFunction(double const dt, fuse_core::Matrix15d const& A, double velocity_decay = 0.0);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants