@
转载自,防止链接失效做个备份:https://zhuanlan.zhihu.com/p/48853182
1. pcl ndt
简介:
pcl官方提供的ndt。
环境需求:
- 需要编译安装pcl-1.8.1或以上版本。
使用方法:
参照官方样例程序 Point Cloud Library (PCL)
参数设置:
普通参数配置
resolution=1.0 // ndt网格大小为1立方米
epsilon=0.01 // 精度为1厘米
maxIterations=100 // 最大迭代次数
stepSize=0.1 // 步长
测试数据:
2帧点云,降采样后都是1万个点。
测试结果:
配准时间:3.98秒。
2. ndt_omp
简介:
koide3/ndt_omp。继承自pcl ndt,并做了多线程等优化。参考:koide3/ndt_omp
环境需求:
- 需要编译安装pcl-1.8.1或以上版本。因为ndt_omp是继承自pcl ndt的。
使用方法:
-
将include/pclomp目录复制到你的include目录下,将src/pclomp目录复制到你的src目录下。
-
在CMakeLists.txt中需要有支持PCL的代码(同pcl ndt),并需增加以下代码
find_package(OpenMP)
if (OPENMP_FOUND)
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()
include_directories(include)
add_library(ndt_omp src/pclomp/voxel_grid_covariance_omp.cpp src/pclomp/ndt_omp.cpp src/pclomp/gicp_omp.cpp)
add_dependencies(align ndt_omp) #这里的align改成你的app
target_link_libraries(align ${PCL_LIBRARIES} ndt_omp) #这里的align改成你的app
- 在.cpp文件中需要有支持PCL ndt的头文件包含(同pcl ndt),并需增加以下头文件包含
#include <pclomp/ndt_omp.h>
- 声明ndt_omp对象,并用它来执行align(),具体可参照官方样例程序align.cpp。
pclomp::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ>::Ptr ndt_omp(new pclomp::NormalDistributionsTransform<pcl::PointXYZ, pcl::PointXYZ>());
参数设置:
普通参数配置 resolution epsilon maxIterations stepSize都和pcl ndt相同。
注意:stepSize=0.1不要变它。改成0.4会在直线行驶时加快匹配速度,但在转弯时容易匹配错误。
独特参数配置
sear_methods=pclomp::DIRECT7 // 这个最快最好(其他的参数都是有特殊场景的用途)
setNumTreads(omp_get_max_threads()) // 使用能使用到的最多的线程(线程越多越快)
测试数据:
同pcl ndt。
测试结果:
配准时间:112毫秒。
3. ndt_gpu
简介:
CPFL/Autoware中间的一个独立子模块。参考:CPFL/Autoware
环境需求:
- 需要编译安装cuda9.0
注意,用下列方法检测自己安装的是否正确:
查看GPU型号 lspci | grep -i nvidia
查看NVIDIA驱动版本 sudo dpkg --list | grep nvidia-*
产看CUDA版本号 nvcc --version 得到9.0
使用方法:
-
先下载Autoware,并将ndt_gpu这个独立模块编译通过(注意要编译release的版本)。得到lib_ndt_gpu.so(release版本1.1MB)。
-
将ndt_gpu/inlude目录复制到你的include目录下,将lib_ndt_gpu.so复制到你的lib目录下。
-
在CMakeLists.txt中增加以下代码
f
ind_package(CUDA)
if (CUDA_FOUND)
add_definitions(-DCUDA_FOUND)
include_directories(include)
link_directories(lib)
endif ()
...
if (CUDA_FOUND)
target_link_libraries(align ndt_gpu) #这里的align改成你的app
endif ()
- 在.cpp文件中增加以下头文件包含
#ifdef CUDA_FOUND
#include <ndt_gpu/NormalDistributionsTransform.h>
#endif
- 声明gpu_ndt对象,并用它来执行align(),具体可参照样例程序 CPFL/Autoware
参数设置:
普通参数配置 resolution epsilon maxIterations stepSize都和pcl ndt相同。
测试数据:
同pcl ndt。
测试结果:
配准时间:190毫秒。