Commit 9bebbd8
Add Normal Distributions Transform (NDT) registration (#7517)
NDT is a common LiDAR / point-cloud registration
method that optimizes a source-to-target rigid transform against voxelized
Gaussian target distributions instead of nearest-neighbor point
correspondences.
This PR adds a legacy CPU registration API:
NormalDistributionsTransformOption
RegistrationNDT
Python binding: open3d.pipelines.registration.registration_ndt
The implementation builds a target voxel Gaussian map once per registration
call, accepts either center-voxel or six-neighbor voxel residuals, regularizes
small covariance eigenvalues, rejects residuals by squared Mahalanobis distance,
and solves the rigid update using Open3D's existing Eigen SE(3) utilities.
The returned RegistrationResult includes fitness, Euclidean RMSE over the returned representative target-point correspondences, the estimated transform, and representative target-point
indices for accepted voxel residuals.
This implementation is based on the Normal Distributions Transform (NDT) registration algorithm originally proposed by Biber and Straßer [1]. The concrete implementation follows the open‑source reference code by Gao [2], while being adapted to Open3D's registration API and coding style.
[1] P. Biber and W. Straßer, "The Normal Distributions Transform: A New Approach to Laser Scan Matching," Proceedings of the 2003 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS 2003), vol. 3, pp. 2743–2748, IEEE, 2003.
[2] Xiang Gao, SLAM Technology in Autonomous Driving and Robotics: From Theory to Practice (in Chinese), Publishing House of Electronics Industry, 2023. Code available at: https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch7/ndt_3d.cc
Eigen based implementation, parallelized with TBB.
Fix main CI failures: SYCL Python version & Windows RPC port
---------
Co-authored-by: Sameer Sheorey <sameer.sheorey@intel.com>1 parent cf67052 commit 9bebbd8
19 files changed
Lines changed: 1411 additions & 27 deletions
File tree
- .github/workflows
- cpp
- open3d
- io/rpc
- pipelines
- registration
- pybind/pipelines/registration
- tests
- io/rpc
- pipelines
- registration
- docker
- docs/tutorial
- pipelines
- examples/python/pipelines
- python/test/pipelines
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
171 | 171 | | |
172 | 172 | | |
173 | 173 | | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
174 | 181 | | |
175 | 182 | | |
176 | 183 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
57 | 57 | | |
58 | 58 | | |
59 | 59 | | |
| 60 | + | |
60 | 61 | | |
61 | 62 | | |
62 | 63 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
| 66 | + | |
66 | 67 | | |
67 | 68 | | |
68 | 69 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
95 | 100 | | |
96 | 101 | | |
97 | 102 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
60 | 60 | | |
61 | 61 | | |
62 | 62 | | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
63 | 67 | | |
64 | 68 | | |
65 | 69 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| |||
0 commit comments