Fix 3x3 covariance matrix rotation/transformation #1998
Merged
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.
The template specializations of
transform_static_frame()
andtransform_frame()
for the typeCovariance3d
improperly rotate the covariance matrix.Implementation details
Old (broken) implementation
The old implementation is wrong and returns an ill-conditioned covariance matrix, breaking symmetry and positive-semi-definitiveness.
Taking for example the following covariance matrix
P
and quaternionq
:The old implementation would return the matrix
P'
:which is clearly invalid (asymmetric and negative).
New (proper) implementation
The new implementation correctly rotates the 3x3 covariance matrix by left- and right-multiplying by the rotation quaternion (as done for the 6x6 and 9x9 cases):
which is a valid covariance matrix.
Useful resources
GodBolt example: link
Covariance matrix rotation derivation: https://robotics.stackexchange.com/questions/2556/how-to-rotate-covariance
Edit: Updated GodBolt link to use un-shortened version for posterity