目录
效果展示,黄色点云是原始点云,红色点云是分割后的点云。


前言
上一篇文章提到了相机点云的地面分割及障碍物检测:
基于PCL的相机深度点云地面分割及障碍物检测算法-CSDN博客
做完之后马上就又接了多线雷达的点云地面分割及障碍物检测的开发需求。
其实搜索一下已经有很多博主都有类似的文章,这篇文章只是作为自己的一个开发笔记,记录下对开源项目linefit_ground_segmentation中的算法的理解。
开源项目链接:https://github.com/lorenwel/linefit_ground_segmentation
论文链接:https://ieeexplore.ieee.org/document/5548059/figures#figures
算法理解
博文推荐:
地面分割:Fast Segmentation of 3D Point Clouds for Ground Vehicles-CSDN博客
地面分割算法(一):linefit_ground_segmentation | Monicakaa
上方推荐的博文中皆有详细的linefit_ground_segmentation算法原理讲解,本博客则主要是以白话的形式表达的,希望通过这样的方式可以帮助读者对linefit_ground_segmentation有个快速的初步的了解。
算法的大体步骤分为:
- 点云划分与映射
- 地面线段拟合
- 地面点云分割(地面点与非地面点判断)
对于这三个步骤我尽量阐明我的理解,可能有错误的地方,欢迎大家反馈。
点云划分与映射:
将点云划分为多个扇区(Segment),一个扇区作为一个独立的处理单元,每个扇区再分成多个容器(Bin)。同时将点云从三维p(x,y,z)降到二维p(d, z),虽然点云的维度减少,但点云的有效信息是不减少的:
-
d = sqrt(x*x + y*y),相当于把笛卡尔坐标系转换到极坐标系。 -
保留
Z轴的信息,要基于z的高度信息判断是否该点是否为路面点。

地面线段拟合:
通过第一步的划分与映射,我们已经得到了许多的Segment和Bin。接下来获取每个Bin里的最低点MinZPoint,从近到远连接每个Bin里的MinZPoint,获取最近相连的两个MinZPoint之间的距离和误差,如果距离较小,允许的误差阈值也比较小,反之误差阈值比较大。如果两个MinZPoint之间的误差小于误差阈值,视这两个点为一个平面,将这两个点放入LocalLines,接着往远处迭代,直到没有点或者下一个点跟此前的其他点不在一个平面,这时候LocalLines里的点如果大于2,则将线发布到GroundLines,这样就得到了一条地面线。按照这样的逻辑一直迭代,直到所有MinZPoint都迭代过至少一次。
地面点云分割:
有了第二步得到的众多地面线,我们计算所有激光点到当前或者相邻的Segment中的地面线的投影误差,如果小于设置的max_dist_to_line阈值,则认为是地面点,否则为非地面点。
算法缺陷
基本逻辑已经清楚了,那么该算法有什么缺陷吗?
有的,经实测当雷达扫描到地面上比较小的物体时,可能会被认为是地面点。
原因是什么呢?
“我们计算所有激光点到当前或者相邻的Segment中的地面线的投影误差,如果小于设置的max_dist_to_line阈值,则认为是地面点,否则为非地面点。”
想象一下,当多线雷达的其中一根线扫到了及其低矮的障碍物时,在障碍物上面的点云与在地面上的点云的高度差是不是不会太大。那么这个障碍物就会被视为地面点。而如果障碍物比较大,可以被多根线扫到时,可能下面的一根线还是会被视为障碍物,但上面的线离地面线就比较远了,不会被视为障碍物了。

983

被折叠的 条评论
为什么被折叠?



