# ndt_omp **Repository Path**: T_O_P/ndt_omp ## Basic Information - **Project Name**: ndt_omp - **Description**: No description available - **Primary Language**: Unknown - **License**: BSD-2-Clause - **Default Branch**: tier4/main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-24 - **Last Updated**: 2025-12-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ndt_omp This package provides an OpenMP-boosted Normal Distributions Transform (and GICP) algorithm derived from pcl. The NDT algorithm is modified to be SSE-friendly and multi-threaded. It can run up to 10 times faster than its original version in pcl. # multigrid ndt_omp TIER IV has developed an extended version of `ndt_omp` for dynamic map loading functionality. The difference from the `ndt_omp` is as follows: - Instead of `setInputTarget` interface, `multigrid_ndt_omp` provides `addTarget` and `removeTarget` for more flexible target inputs. - Only `RadiusSearch` is supported as a search method (`getNeighborhoodAtPointX` methods are disabled). [![Build](https://github.com/koide3/ndt_omp/actions/workflows/build.yml/badge.svg)](https://github.com/koide3/ndt_omp/actions/workflows/build.yml) ### Benchmark (on Core i7-6700K) ``` $ roscd ndt_omp/data $ rosrun ndt_omp align 251370668.pcd 251371071.pcd --- pcl::NDT --- single : 282.222[msec] 10times: 2921.92[msec] fitness: 0.213937 --- pclomp::NDT (KDTREE, 1 threads) --- single : 207.697[msec] 10times: 2059.19[msec] fitness: 0.213937 --- pclomp::NDT (DIRECT7, 1 threads) --- single : 139.433[msec] 10times: 1356.79[msec] fitness: 0.214205 --- pclomp::NDT (DIRECT1, 1 threads) --- single : 34.6418[msec] 10times: 317.03[msec] fitness: 0.208511 --- pclomp::NDT (KDTREE, 8 threads) --- single : 54.9903[msec] 10times: 500.51[msec] fitness: 0.213937 --- pclomp::NDT (DIRECT7, 8 threads) --- single : 63.1442[msec] 10times: 343.336[msec] fitness: 0.214205 --- pclomp::NDT (DIRECT1, 8 threads) --- single : 17.2353[msec] 10times: 100.025[msec] fitness: 0.208511 ``` Several methods for neighbor voxel search are implemented. If you select pclomp::KDTREE, results will be completely same as the original pcl::NDT. We recommend to use pclomp::DIRECT7 which is faster and stable. If you need extremely fast registration, choose pclomp::DIRECT1, but it might be a bit unstable.
Red: target, Green: source, Blue: aligned ## Related packages - [ndt_omp](https://github.com/koide3/ndt_omp) - [fast_gicp](https://github.com/SMRT-AIST/fast_gicp) ## Regression Test ### Preparation You can use `script/convert_rosbag_to_test_data.py` to convert a rosbag to regression test data. The regression test data should be placed in `./regression_test_data/input` directory. A sample data is [here](https://drive.google.com/file/d/1E-_zj2nchmntioSJJgyoDQEYHtrs3o-C/view). The sample data is recorded by AWSIM, so the corresponding map is [nishishinjuku_autoware_map](https://github.com/tier4/AWSIM/releases/download/v1.1.0/nishishinjuku_autoware_map.zip). The directory structure should be like this: ```bash ./regression_test_data/ └── input ├── kinematic_state.csv ├── pointcloud_map.pcd # means map.pcd └── sensor_pcd ├── pointcloud_00000000.pcd ├── pointcloud_00000001.pcd ├── pointcloud_00000002.pcd ├── ... ├── pointcloud_00000817.pcd ├── pointcloud_00000818.pcd └── pointcloud_00000819.pcd ``` ### build ```bash mkdir build cd build cmake .. make -j ``` ### Run ```bash ./regression_test ../regression_test_data/input ../regression_test_data/output ``` ### Check ```bash python3 script/compare_regression_test_result.py ../regression_test_data/output ../regression_test_data/reference_output ```