简介
在上一篇文章pcl学习系列之GroundSegmentation滤波(一)通过使用pcl库来回归拟合平面进行地面点提取,本篇博文介绍一篇2010年的快速地面点云分割算法,该论文链接:Fast segmentation of 3d point clouds for ground vehicles,当然,作者还是很赞的开源了代码,传送门Github。当然,我也调试作者的代码,同时进行一定的理解。通过简单的cmake编译即可运行,代码已经放在Github/FloorSegmentation上面,见末尾链接。说起该篇地面点提取的策略,主要还是通过对点云进行降维,同时采取不同的划分扇区点云策略,通过局部拟合直线来判断是否为地面点。具体细节步骤会在如下进行详细解释。
算法浅析
点云无序转有序策略
这篇论文地面点提取的思路首先将点云从无序变为有序的策略,将点云划分成为扇形区域(segment)和每个扇形区域继续划分的子区域(bins)。通过这两步划分,将所有的点云能够有续的存储与访问。下面简单说一下,是如何划分为segment以及每个segment进行bins的划分:
![](https://i-blog.csdnimg.cn/blog_migrate/53f62c6334ac9938423041fb567b154b.jpeg)
上图代表对点云进行segment的划分,代码中是设置一共划分多少个segments,然后通过360度除以就可以获取每个segment的扇形大小,这样就将 S 0 S_0 S0与 S 1 S_1 S1等划分出来。每一个扇形区域代表一个segment。
![](https://i-blog.csdnimg.cn/blog_migrate/44bd87f715f3aba908abafa3b283e4c1.jpeg)
划分完segment后,我们得到每个扇形区域都有一个编号 S i S_i Si,这样我们在对每个扇形区域 S i S_i Si进行划分Bins,以此进一步缩小点云的区域。划分扇形区域的Bins是依据点云的X-Y平面到中心点距离来进行划分的。即根据 r j m i n < ( x i 2 + y i 2 ) < r j ( m a x ) r_j^{min}<\sqrt{(x_i^2+y_i^2)}<r_j^{(max)} rjmin<(xi2+yi2)<rj(max)
这样划分完Bins之后,我们就可以通过将这个区域 b j s b_j^s bjs来代表第s个segment与j个bin来找到这个子区域。这样一来我们就可以将所有的点都通过这种映射方式把点云变为有序存储。
点云降维存储
点云按照上述进行有序存储时候,不可能存储所有的三维点云信息,该文章通过降维操作来进行存储点云压缩后的信息。那么它是如何进行压缩点云信息的呢?该文章将每个点云信息 ( x , y , z ) (x,y,z) (x,y,z)变成 ( d , z ) (d,z)