简介
该篇点云论文全称为Fast segmentation of 3D point clouds: A paradigm on LiDAR data for autonomous vehicle applications,文章标题不够。该篇点云论文主要分为两个阶段的创新:①点云地面点的提取(Ground Plane Fitting, GPF);②点云扫描聚类快速提取(Scan Line Run, SLR);本篇博文先讲解第一部分GPF,也就是地面点提取or分割。
GPF算法分析
说到地面点分割or提取,之前的几篇博文有过介绍几种方法:通过RANSAC回归估计地平面方式【pcl入门教程滤波系列】之GroundSegmentation滤波(一)与通过划分网格segments和bin来进行局部线拟合的方式【pcl入门教程滤波系列】之GroundSegmentation滤波(二)与借助已知地平面参数进行曲面拟合后地面估计方式【pcl入门教程滤波系列】之GroundSegmentation滤波(三)。现在我们介绍通过GPF进行地面点的提取or分割方式,GPF的思想有来自于第二篇博文中segments的思想,首先提取地面种子候选点集,再划分segments的基础上进行SVD分解求取法向量平面参数,最后迭代求取最佳法向量。下面我们通过算法伪代码来介绍一下该流程:完整代码链接将在文末贴出。
上图为GPF算法伪代码流程,下面进行简单拆解:
- 提取初始地面候选点集:
首先将所有点云进行高度排序,按照点云的z高度。然后获取排序后的 1 : N L P R 1:N_{LPR} 1:NLPR个候选点集,求取平均高度 L P R LPR LPR。然后遍历所有点云,将高度阈值小于 T h s e e d s + L P R . h e i g h t Th_{seeds}+LPR.height Thseeds+LPR.height作为初始筛选地面点集的高度。
void FloorSegment::extract_initial_seeds(const pcl::PointCloud<pcl::PointXYZI>& p_sorted)
{
// LPR is the mean of low point representative
double sum = 0;
int cnt = 0;
// Calculate the mean height value.
for(size_t i = 0; i < p_sorted.points.size() &&