点云库PCL:NDT配准时出现容器出限的问题及解决

让人想犯罪 __ 提交于 2019-11-26 17:25:21

 

前言 

  在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出限。    

  

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!