介绍
本次讲述的地面点云分割方法来自 2018 ITSC的会议论文:
A Slope-robust Cascaded Ground Segmentation in 3D Point Cloud for Autonomous Vehicles [pdf] [Python code]
原论文已提供Python版本代码,我将其迁移至了C++版本,速度整体有提升,但仍然达不到实时性能,可以进一步在C++基础上做一些多线程、GPU等改进以实现实时地面点云分割,代码链接放在最后。
方法描述
地面点云的分割方法大多分为三种方法:
基于几何特征、基于机器学习、基于深度学习。
1.基于几何方法的地面点云分割主要依赖于点云打在地面与物体上时存在较为明显且不同的几何特征,如法向量、点云高度、邻接点云间的关系等。
2.基于机器学习的方法主要代表就是高斯线性回归方法(GPR),能够将点云按一次扫描进行拟合得到地面与非地面的分割结果。
3.基于深度学习的方法本质就是点云分割、实例分割等方法,没有区别,主要是将点云投影成各项视图再放入网络进行训练最终得到分割结果。
机器学习与深度学习的不太利于应用的点在于不能够有效获得较多数量的、多场景下的、较为精确的训练数据集,但这仍然是今后的一个发展方向,其最终效果与泛化性也是要优于基于几何特征的方法。
本篇论文所采用的则是基于几何特征的地面点云分割方法,整体流程分为两部分,一部分是基于扫描线间的几何特征,第二部分则在此基础上进一步多平面拟合实现最终地面分割:
一、扫描线特征分割主要依赖于点云扫描时的相邻扫描线间的几何关系:
1.两扫描线间相邻点间的夹角在打到物体上时会很大
2.两扫面线见相邻点的距离在大到物体上时会很小
如下图所示,当激光雷达正装在车上时,扫描线扫到物体与扫到斜坡或地面时相邻扫描线点之间的特征存在较为明显差异,当两点间距离小于一个阈值时,就判断两点属于障碍物
那么阈值怎么设定呢?作者利用几何特征给出如下设计:
当点云打在水平面时,两线束点间的距离关系如下
当打在坡道上如下:
其中 h \ h h是传感器安装高度, θ \theta θ是由激光雷达各线束内参角度推出的激光雷达射线与水平地面间的夹角, β \beta β是车辆最大能够行驶过的坡度角度,也就是坡度阈值,最终通过几何关系推出两线束点间距离的阈值,注意这里是每一线束对应一个阈值。

最后依据这个阈值设计逻辑判断实现初步分割:
二、多平面分割则是利用上一步分割出的点云进行连续平面分割并用RANSAC进行平面拟合,在平面交界处并设计阈值判断平面是否连续:
平面分割如图:
多平面拟合及连续性判断:
连续性判断就是判断两平面的夹角及交界处的高度差进行判断,如果不满足连续性,则当前平面参数采用上一块平面的参数。
伪代码:
代码实现与链接
原论文给出了相关代码Python的版本,这里用C++进行了复现,效果与原代码相同;
这里指出在复现过程中发现的问题:
- 单纯基于线束的分割效果并不理想
- RANSAC平面分割不仅仅用了欧式坐标,还使用了点云的法向量
- 平面区域划分与论文存在一定的出入
代码主要流程为:
1.将点云转为深度图以提供扫描顺续:
2. 扫描线束分割
3. 区域划分
4.最终分割效果
链接:https://github.com/wangx1996/Cascaded-Lidar-Ground-Segmentation