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

Posted pw123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了点云库PCL:NDT配准时出现容器出限的问题及解决相关的知识,希望对你有一定的参考价值。

 

前言 

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

  技术图片

 

以上是关于点云库PCL:NDT配准时出现容器出限的问题及解决的主要内容,如果未能解决你的问题,请参考以下文章

Pcl 点云有缩放怎么匹配

qt+pcl点云库

Ubuntu16.04下PCL点云库的安装及使用demo

PCL(点云库)中实时 kinect 数据的范围图像生成

PCL学习总结点云配准算法之NDT

使用 Makefile 将 PCL(点云库)添加到现有项目