Repository navigation
fix(fuse_constraints): wrap Euler angle residuals in absolute 3D pose and orientation priors - #38
Open
griswaldbrooks wants to merge 1 commit into
Open
griswaldbrooks wants to merge 1 commit into
griswaldbrooks wants to merge 1 commit into
Conversation
griswaldbrooks
force-pushed
the
fm/fuse-absolute-yaw-wrap-fix
branch
from
October 28, 2026 17:00
228faf1 to
f451503
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motivation
An absolute IMU orientation near ±pi can produce a roughly 2pi yaw residual for a 0.02-radian heading difference. This can cause incorrect heading corrections while a simulated robot faces west.
What changed
Wrap roll, pitch, and yaw differences before information weighting in
NormalPriorPose3DEuler, its AutoDiff functor, and the siblingNormalPriorOrientation3DEulerCostFunctor. Preserve the local Jacobians away from the pi-error cut. Add regressions throughAbsolutePose3DStampedEulerConstraint::costFunction()and the AutoDiff cost covering both yaw crossing directions, q/−q, ordinary yaw, nonzero roll/pitch, correlated weighting, and matching Jacobians.Cover the sibling fix through
AbsoluteOrientation3DStampedEulerConstraintwith both yaw directions and correlated weighting. No additional absolute Euler prior with this defect remains infuse_constraints.How it was tested
Using an existing ROS Jazzy image in a temporary network-isolated container:
colcon build --packages-select fuse_constraints --executor sequential --cmake-args -DBUILD_TESTING=ON -DCMAKE_BUILD_TYPE=Release colcon test --packages-select fuse_constraints --executor sequential --return-code-on-test-failure colcon test-result --verboseThe final package builds; all 115 tests pass, with no errors, failures, or skips. The pose and orientation constraint suites account for 16 of those tests. Before the fix, the three new regression tests produced 2 failures and 1 pass: both analytic and AutoDiff yaw residuals were ±6.263 instead of ∓0.02, and wrapping-before-weighting failed. The sibling yaw regression also fails before the fix. All four added tests pass with the fix; the ordinary-angle test passes before and after.
CI's rolling build currently fails in the covariance_geometry_ros dependency before fuse is built, so it is unrelated to this change; the Jazzy colcon build and tests above pass.