前言
在PCL库中,精配准除了我们最常用的ICP算法以及相关的变形算法,如GICP算法外,另外还包含了NDT算法(正态分布变换),它不需要提供较好的初值,且速度比ICP算法更为快速。
当然,也会有着一定的缺陷:收敛域差、代价函数不连续等,NDT原理以及步骤等具体可查看 https://www.cnblogs.com/li-yao7758258/p/10705228.html,个人觉得,这篇文章写得比较详细具体。
版本
PCL1.8.0
问题
PCL在使用NDT(Normal Distribution Transform)对两个点云进行配准时会出现容器出限的错误。
解决方法
在设置参数时,将体素分辨率调大,从而能使每个体素中能有六个以上的点。
原因解析
从原理角度分析:体素分辨率太小,使得对目标点云分割时每个体素中达不到计算协方差矩阵的点数。
从代码角度分析:在ndt.h中有着一个变量为target_cells_,它的类型为VoxelGridCovariance,此类的作用为体素划分,且计算每个体素内点的协方差以及形心。
当我们分辨率设置过小时,每个体素内的点云数均无法达到设置的min_points_per_voxel_,从而使target_cells_为空,无法对其初始化,导致target_cells_中的维度变量Dim_为0。以至于在kdtree_flann.hpp中,vector容量初始化为0,在后来的将点云转换到vector时,vector出限。