点云处理库pcl中有个配准算法ndt (NormalDistributionsTransform),在某些版本的pcl中运行很慢,除了通过pclomp并行计算提速,还可能是调试模式的坑。
版本pcl-1.12 (2019)
一、编译模式
如果按照官网操作编译,这个版本编译完后,处理约5万点云的点云配准需要1分钟。
(这里不提硬件平台,也不提为什么不降采样,就当我们需要处理这个规模。初值距离真值大概0.8米远,旋转3度,大概9~10次迭代,大家可参照此对比时间)
于是寻找了下文 (二)中的ndt_omp 通过并行计算加速,同样规模的处理耗时3~4秒,貌似可用哈。而并行计算占用很多cpu资源使得对实用性产生怀疑,但ndt论文中的几个例子(相似数量级别的规模)速度快于icp等配准算法。使用matlab自带的ndt算法,大概耗时0.4秒,pcl-1.12这是怎么了?
其实是此版本pcl的一个坑,原代码留了不少调试功能,在 CMakeLists.txt 中加入:
SET(CMAKE_BUILD_TYPE "Release")
删除build文件夹后重新编译,此时原版pcl的ndt算法耗时0.5秒,使用omp_ndt并行计算耗时0.06s,达到可实时运行的水平。
二、并行计算参考
SLAM前端之ndt_omp使用_年少的梦007的博客-CSDN博客
后记,ndt 是无序点云相对速度和性能排前的算法(至少在2020年前出现的算法对比),不过想要实现论文中所有优点,很多并行计算或近似法对新人并不友好。如果你使用有序点云(按照扫描线排列的点云),有很多优秀算法,不需要ndt。而普通xyz的3维 ndt 扩展成 包括intensity和RGB颜色的点云进行ndt配准,算法改动很小,这些地方是ndt的优势。