Add degenercy-aware point-to-plane registeration method DCReg#6432
Open
JokerJohn wants to merge 1 commit intoPointCloudLibrary:masterfrom
Open
Add degenercy-aware point-to-plane registeration method DCReg#6432JokerJohn wants to merge 1 commit intoPointCloudLibrary:masterfrom
JokerJohn wants to merge 1 commit intoPointCloudLibrary:masterfrom
Conversation
|
Great job! |
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.
This PR integrates the core DCReg degeneracy-aware point-to-plane solver idea
into PCL's registration module.
Paper:
Registration
Reference implementation and project documentation:
DCReg targets degenerate LiDAR registration. Its core idea is to decouple
rotation and translation observability through 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 PR is not a direct import of the full standalone DCReg research system.
It ports the solver and diagnostic ideas into PCL's existing
pcl::registration::TransformationEstimationAPI:and registration pipelines.
TransformationEstimationPointToPlaneLLS.PointTargetis expected to providenormal_x,normal_y, andnormal_z,matching PCL's existing point-to-plane estimator convention.
visualization, benchmark scripts, and local-plane/local-frame compatibility
helpers are intentionally out of scope for this first PCL-native PR.
PCL integration summary
This PR adds:
pcl::registration::TransformationEstimationPointToPlaneDCRegpcl::registration::DCRegDegeneracyAnalysissetDegeneracyConditionThreshold()/getDegeneracyConditionThreshold()setKappaTarget()/getKappaTarget()setPcgTolerance()/getPcgTolerance()setPcgMaxIterations()/getPcgMaxIterations()getLastDegeneracyAnalysis()to inspect diagnostics from the most recentestimation call.
The estimator builds the same 6D point-to-plane normal equation as
TransformationEstimationPointToPlaneLLS, then replaces the solve with:systems
Diagnostics
DCRegDegeneracyAnalysisreports:Rank-deficient systems still report weak axes through eigensolver/block
fallback diagnostics.
Tests
Added
test_registration_dcreg.cppcovering:TransformationEstimationPointToPlaneLLSon awell-conditioned synthetic cube case
Validation
Local validation was run in
/home/xchu/CLionProjects/pcl.Configuration note: this machine has an old CUDA 10.1 compiler and a mismatched
system GTest installation, so local validation explicitly disabled CUDA and
nanoflann discovery and pointed PCL to a consistent
/usr/src/googletestsource/include pair.
cmake -S . -B build-dcreg \ -DCMAKE_BUILD_TYPE=Release \ -DWITH_CUDA=OFF \ -DCMAKE_DISABLE_FIND_PACKAGE_nanoflann=TRUE \ -DGTEST_SRC_DIR=/usr/src/googletest/googletest \ -DGTEST_INCLUDE_DIR=/usr/src/googletest/googletest/include \ -DBUILD_registration=ON \ -DBUILD_global_tests=ON \ -DBUILD_tests_registration=ON \ -DBUILD_apps=OFF \ -DBUILD_examples=OFF \ -DBUILD_tools=OFF \ -DBUILD_simulation=OFF cmake --build build-dcreg --target pcl_registration -j2 cmake --build build-dcreg --target test_registration_dcreg -j2 build-dcreg/test/registration/test_registration_dcreg ctest --test-dir build-dcreg/test -R registration_dcreg --output-on-failure clang-format --dry-run -Werror \ registration/include/pcl/registration/transformation_estimation_point_to_plane_dcreg.h \ registration/include/pcl/registration/impl/transformation_estimation_point_to_plane_dcreg.hpp \ registration/src/transformation_estimation_point_to_plane_dcreg.cpp \ test/registration/test_registration_dcreg.cpp git diff --checkResults:
pcl_registration: built successfullytest_registration_dcreg: built successfullyregistration_dcreg: passedgit diff --check: passedAdditional non-CI comparison
I also ran a local equivalence check against the standalone DCReg code on two
representative datasets:
The standalone DCReg examples use kNN local-plane correspondences and a local
SO(3) update convention, while this PCL estimator is a point-to-plane
TransformationEstimationcomponent. To make the comparison meaningful, Iconverted the standalone DCReg correspondences from each case into an equivalent
PCL point-to-plane estimation problem, so both implementations solved the same
6D normal equation.
Results:
0000010000015.30e-76 / 60001000001003.90e-86 / 6PCL diagnostic descriptions from the same check:
z,condition_number_translation = 26.805484784, solverpcgx,condition_number_translation = 14.485626824, solverpcgThese checks are intentionally not added as CI tests because they depend on
external/local datasets and on the standalone DCReg runner. The CI-facing tests
use small synthetic clouds with no external data dependency.