Add DCReg registration method (degenercy handling)#7482
Open
JokerJohn wants to merge 2 commits intoisl-org:mainfrom
Open
Add DCReg registration method (degenercy handling)#7482JokerJohn wants to merge 2 commits intoisl-org:mainfrom
JokerJohn wants to merge 2 commits intoisl-org:mainfrom
Conversation
|
Thanks for submitting this pull request! The maintainers of this repository would appreciate if you could update the CHANGELOG.md based on your changes. |
Author
I have added the requested CHANGELOG.md entry in commit 39fe627. Could a maintainer approve the workflows when convenient? |
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.
Paper and reference implementation
This PR integrates ideas from DCReg into Open3D's legacy CPU registration module.
Paper: DCReg: Decoupled Characterization for Efficient Degenerate LiDAR Registration
Reference implementation and project documentation:
mainbranch of the reference repository contains the full public DCReg implementation, including standalone runners, example-specific preprocessing, logging, visualization, and benchmark-oriented code.DCReg targets degenerate LiDAR registration. Its core idea is to decouple rotation and translation observability with Schur complements, characterize weak physical motion axes by aligning eigenspaces to coordinate axes, and stabilize weak directions through targeted eigenvalue clamping and preconditioned solving.
This Open3D PR is not a direct import of the standalone DCReg project. Instead, it ports the solver and diagnostic ideas into Open3D's existing
open3d.pipelines.registrationstructure:RegistrationResult.Open3D integration summary
The main Open3D-native API is
TransformationEstimationPointToPlaneDCReg, which can be passed to the existingregistration_icploop in the same way asTransformationEstimationPointToPlane. It keeps the existing ICP API andRegistrationResultbehavior unchanged while replacing the 6D point-to-plane linear solve with DCReg-style Schur-complement degeneracy detection, eigenvalue clamping in the preconditioner, PCG, and robust fallback solves.This PR also adds explicit degeneracy diagnostic APIs and a separate standalone-compatible local-plane ICP helper for reproducing the original DCReg examples without changing Open3D's standard ICP perturbation convention.
What changed
DCRegOptionfor solver and local-plane compatibility options.DCRegDegeneracyAnalysisfor structured degeneracy diagnostics.TransformationEstimationPointToPlaneDCRegfor Open3D-nativepoint-to-plane ICP.
compute_dcreg_degeneracy_analysisfor one point-to-plane ICP linearization.registration_icp_dcreg_localandcompute_dcreg_local_degeneracy_analysisfor standalone-compatible kNN local-plane residuals and local body-frame SO(3) updates.repr, properties, and docstrings for the new APIs.Implementation notes
The Open3D-native estimator intentionally follows the existing legacy ICP convention:
registration_icptransforms the source point cloud before each estimator call.The standalone DCReg examples use a different path: kNN local-plane residuals and a local body-frame update of the form
R <- R Exp(omega), t <- t + R v. That behavior cannot be reproduced inside a normalTransformationEstimationcallback because the callback does not own the original source points and evolving pose state. For that reason the standalone-compatible behavior is exposed as the separateregistration_icp_dcreg_localhelper.The tutorial documents this distinction explicitly so users do not compare weak-axis diagnostics from the Open3D point-to-plane normal equation against standalone DCReg parking-lot logs that use a different residual and coordinate frame.
Degeneracy diagnostics
The diagnostic result exposes:
Rank-deficient systems use eigensolver/minimum-norm fallback diagnostics so weak axes and eigenvalues are still available even when a Schur block is singular.
Scope
This PR targets the legacy CPU registration API only. It does not add tensor/CUDA support, dataset runners, YAML presets, benchmark scripts, parking-lot-specific preprocessing, or the full standalone DCReg experiment system.
Validation
Local checks run in your own computer :
cmake --build build-dcreg --target tests pybind python-package -j2 build-dcreg/bin/tests --gtest_filter='TransformationEstimation.DCReg*:TransformationEstimation.PointToPlaneDCReg*:TransformationEstimation.DCRegLocal*' PYTHONPATH=/home/xchu/CLionProjects/Open3D/build-dcreg/lib/python_package python3 -m pytest -q python/test/test_registration_dcreg.py python3 util/check_style.py git diff --checkResults:
tests,pybind, andpython-package: passedI also ran non-CI comparison logs against the standalone DCReg shifted-cylinder and parking-lot examples. The Open3D local-compatible path matches the standalone SO(3)/parking-lot behavior, while the Open3D-native point-to-plane path intentionally reports diagnostics in Open3D's target/world left-multiplied SE(3) frame.