Xiangcheng Hu1 · Xieyuanli Chen2 · Mingkai Jia1 · Jin Wu3*
Ping Tan1 · Steven L. Waslander4†
1HKUST 2NUDT 3USTB 4University of Toronto
†Project lead *Corresponding author
DCReg (Decoupled Characterization for ill-conditioned Registration) is a principled framework for degenerate LiDAR registration. It decouples rotation and translation observability with Schur complements, maps eigenspaces into physical motion axes, and stabilizes only the weak directions through targeted preconditioning.
The main branch now contains the full public DCReg implementation. The earlier baseline-only public snapshot remains available on the separate baseline branch.
- Schur-complement-based spectral degeneracy detection that removes misleading rotation-translation coupling before observability analysis.
- Physical-axis characterization that maps weak modes to
roll/pitch/yawandx/y/z, with aligned eigenvalues and contribution ratios. - Targeted preconditioning that stabilizes only the weak directions instead of damping the full coupled system.
- Lightweight runtime stack:
Eigen + PCL, with optionalTBB/OpenMP.
- 2026/04/21: released the verified full DCReg implementation on
main. - 2026/03/31: updated the second arXiv version and corrected the theoretical issue in the structured preconditioner analysis.
- 2026/03/12: received a Conditional Acceptance and started the final clarification and revision cycle.
- 2025/10/30: completed a Major Revision focused on clarifying the logic and presentation of the paper.
- 2025/09/23: released baseline codes and data, including
ME-SR,ME-TSVD,ME-TReg,FCN-SR,O3D,XICP, andSuperLoc. - 2025/09/09: released the preprint on arXiv.
- Open-source a DCReg-based localization system to show how the method can be integrated into larger pipelines and adapted across different algorithms.
Tested on Ubuntu 20.04 with C++17.
| Category | Packages |
|---|---|
| Required | Eigen3, PCL |
| Optional | TBB, OpenMP |
| Not required by C++ core | Ceres, yaml-cpp, Open3D |
From the repository root:
cmake -S DCReg -B DCReg/build
cmake --build DCReg/build -j8./DCReg/build/dcreg_minimal_example
./DCReg/build/dcreg_runnerThe repository also includes a compact real-scene runner:
cmake --build DCReg/build -j8 --target dcreg_parking_lot_example
./DCReg/build/dcreg_parking_lot_exampleThis runner keeps the core DCReg dependency surface unchanged: the C++ code
still depends only on Eigen + PCL with optional TBB/OpenMP. The optional
Open3D visualizer is a separate Python script:
python3 -m pip install open3d numpy pillow
python3 scripts/visualize_parking_lot_example.pyThe visualization uses a black background, intensity-colored point clouds, a
compact diagnostic card, and the detected weak/degenerate physical axes.
For readability, the exported target map is a 100 m local crop of the prior
map around the final pose, downsampled at 0.5 m while preserving intensity.
In the bundled pk01-1976 frame, the current run converges in 5 iterations
from the provided prior pose and characterizes the weakest translational
direction along the physical x axis.
Small demo inputs are bundled under DCReg/data/ so the synthetic runner and
parking-lot source frame are easy to inspect. The complete data package,
including the large parking-lot prior map, is provided externally:
For the parking-lot demo, download prior_map.pcd from that link and place it
as:
DCReg/data/Parking-Lot-example/prior_map.pcd
dcreg_minimal_example: prints the three core DCReg modules and is the cleanest entry point for integrating the solver into another SLAM system.dcreg_runner: runs the verified synthetic registration pipeline and compares four parameterizations under the same implementation.dcreg_parking_lot_example: runs a real parking-lot single-frame-to-map registration case and exports visualization artifacts.
dcreg_minimal_example is a synthetic linear-system example for showing the
three DCReg modules. It does not run point-cloud registration, so it
intentionally does not print RMSE, fitness, or runtime metrics.
Synthetic DCReg example
[Module 1] Spectral degeneracy detection
cond_full: 1122.345689
cond_schur_rot: 36.087707
cond_schur_trans: 742.066396
[Module 2] Physical-axis degeneracy characterization
degenerate_mask: 001001
raw_lambda_rot: 1.001796 19.881966 36.152505
raw_lambda_trans: 0.032394 12.252030 24.038714
aligned_lambda_rpy: 36.152505 19.881966 1.001796
aligned_lambda_xyz: 24.038714 12.252030 0.032394
rot_axis_contribution_ratio(each r_i as physical-axis mixture):
r0 = 0.995659*roll + 0.000001*pitch + 0.004340*yaw
r1 = 0.000004*roll + 0.999791*pitch + 0.000205*yaw
r2 = 0.004337*roll + 0.000208*pitch + 0.995456*yaw
trans_axis_contribution_ratio(each t_i as physical-axis mixture):
t0 = 0.999989*x + 0.000000*y + 0.000011*z
t1 = 0.000000*x + 0.999834*y + 0.000166*z
t2 = 0.000011*x + 0.000166*y + 0.999823*z
clamped_lambda_rpy: 36.152505 19.881966 3.615250
clamped_lambda_xyz: 24.038714 12.252030 2.403871
[Module 3] Preconditioned linear solve
preconditioned_delta: 0.190398 -0.306306 -2.620922 0.095321 -0.515479 41.997563
pcg_iterations: 6
pcg_relative_residual: 0.000000
qr_fallback: 0
Registration metrics are emitted by dcreg_runner and
dcreg_parking_lot_example. Runtime depends on the machine and parallel
backend; the excerpt below shows the bundled parking-lot case on a local TBB
run:
[Registration] Full real-scene matching
Test case: parking_lot_pk01
Algorithm: DCReg | Parameterization: SO3 | Parallel: TBB
Status: converged in 5 iterations
RMSE: 0.053225 | Fitness: 0.060365 | Time(ms): 1.86
Pose error: unavailable (no ground-truth pose for this case)
DCReg solver: pcg_iterations=6, relative_residual=0.000000, qr_fallback=0
Observability: schur_rot=1.957423, schur_trans=12.714237, mask=000100
DCReg is organized around three core modules:
- Spectral degeneracy detection
Build Schur complements for rotation and translation and inspect their spectra. - Physical-axis degeneracy characterization
Align raw Schur eigenvectors toroll/pitch/yawandx/y/z, then quantify contribution ratios and weak directions. - Preconditioned linear solve
Clamp only the weak aligned eigenvalues and solve the normal equation with a targeted PCG update.
| Schur-Based Detection | Physical-Axis Mapping |
|---|---|
![]() |
![]() |
The default shifted_cylinder case was re-validated after the full public release sync:
| Parameterization | Iter | RMSE | Fitness | Translation Error (m) | Rotation Error (deg) | LinIt | QRfb |
|---|---|---|---|---|---|---|---|
| Euler | 9 | 0.0314988 | 0.116239 | 0.0258485 | 0.0516469 | 6 | 0 |
| SE3 | 10 | 0.0315708 | 0.116636 | 0.0271197 | 0.0507196 | 6 | 0 |
| SO3 | 10 | 0.0315708 | 0.116636 | 0.0271196 | 0.0507195 | 6 | 0 |
| Quaternion | 10 | 0.0315708 | 0.116636 | 0.0271196 | 0.0507195 | 6 | 0 |
The earlier baseline-oriented public release remains available on the separate baseline branch.
| Baseline Release Overview |
|---|
![]() |
| Dataset Context | Release Context |
|---|---|
![]() |
![]() |
| Overview |
|---|
![]() |
![]() |
| Error Trend | Convergence Trend |
|---|---|
![]() |
![]() |
| Localization | Mapping |
|---|---|
![]() |
![]() |
| Characterization |
|---|
![]() |
![]() |
| Detection Case A | Detection Case B |
|---|---|
![]() |
![]() |
| Ablation | Hybrid Analysis |
|---|---|
![]() |
![]() |
| Runtime | Runtime Detail |
|---|---|
![]() |
![]() |
Public-facing documentation lives on the GitHub Wiki.
@misc{hu2025dcreg,
title={DCReg: Decoupled Characterization for Efficient Degenerate LiDAR Registration},
author={Xiangcheng Hu and Xieyuanli Chen and Mingkai Jia and Jin Wu and Ping Tan and Steven L. Waslander},
year={2025},
eprint={2509.06285},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2509.06285}
}The authors gratefully acknowledge the valuable contributions that made this work possible.
- We extend special thanks to Dr. Binqian Jiang and Dr. Jianhao Jiao for their insightful discussions that helped refine the theoretical framework of this work.
- We also appreciate Mr. Turcan Tuna for his technical assistance with the baseline XICP implementation.










































