文章:Fast Range Image-Based Segmentation of Sparse 3D Laser Scans for Online Operation
代码:https://github.com/PRBonn/depth_clustering
1)摘要
提取场景中单个对象的能力对于大量自主导航系统(如移动机器人或自动驾驶汽车)至关重要。在动态环境中导航的此类系统需要注意可能发生变化或移动的对象。在大多数感知线索中,将当前图像或激光扫描预先分割成单个对象是执行进一步分析之前的第一个处理步骤。在本文中,作者提出了一种基于深度图的地面滤波算法。
2)创新点
①:利用深度图进行邻居搜索,计算坡度;
②:采用Savitsky-Golay滤波器进行角度滤波,既保留了对象边缘特征,同时对异常值进行了平滑处理。
3)算法结构
A 深度图构建
一般的地面移除方法只是丢弃所有低于车辆的 3D 点(假设我们知道传感器在移动底座/机器人上的安装位置)。虽然这种方法在简单场景中可能有效,但如果俯仰角或滚动角不等于零,或者地面不是完美的平面,则此方法会失败。使用基于 RANSAC 的平面拟合可能会改善这种情况,但即使使用这种方法,非零曲率可能仍然是一个挑战,并且操作可能很耗时。因此,作者采取了不同的方法。大多数激光测距扫描仪以每束激光的单独测距读数的形式提供原始数据,并带有时间戳和光束方向。这允许直接将数据转换为范围图像。图像中的行数由垂直方向的光束数定义,即 Velodyne 扫描仪的 16、32 或 64。列数由激光器每 360◦ 转的距离读数给出。这种虚拟图像的每个像素都存储了从传感器到物体的测量距离。为了加快计算速度,如果需要,甚至可以考虑将水平方向的多个读数合并为一个像素。
B 假设设置
为了识别接地层,作者做了三个假设。
①假设传感器大致水平安装在移动底座/机器人上。
②假设地面的曲率很低。
③假设机器人至少在距离图像最低行的某些像素中观察到接地平面(对应于靠近机器人的地面的激光束扫描)。
C 角度图获取
基于上述假设,首先将距离图像 R 的每一列 c 转换为一堆的角度α,其中每个角度都代表连接两点 A 和 B 的线的倾斜角,如上图所示。知道垂直连续的单个激光束的两个距离读数后,可以使用三角法则计算角度α:
其中 ξa 和 ξb 是对应于第 r − 1 行和 r行 的激光束的垂直角。
通过上述处理,便将深度图转换为角度图。
D 角度图平滑处理
不幸的是, LIDAR 传感器在距离测量中会产生大量异常值,LEONARD 等人(2008 年)的工作中有更详细的讨论,这会影响角度α的计算。因此,需要一种方法来消除这些异常值。WEINMANN & JUTZI (2015) 通过计算距离图像的每个像素局部邻域的特征来解决这个问题,以检测读数是否可以被视为可靠。这种方法会过滤掉不可靠的读数,但也会过滤掉对象边界上的点。由于这些点对于执行分割很重要,因此作者改为根据所有可用数据点计算相应的角度,然后对计算出的角度进行平滑处理。为了实现这种平滑,作者将 Savitsky-Golay 滤波器应用于角度图的每一列。此筛选器执行最小二乘优化,以将给定窗口大小的局部多项式拟合到数据。
E 地面分割
在将 Savitsky-Golay 滤波器应用于角度图像的列后,从期望属于 ground 的行开始,并使用广度优先搜索将相似的成分一起标记,然后对角度图进行地面标记。广度优先搜索 (BFS) 是一种流行的图形搜索或遍历算法。它从图的给定节点开始,首先探索直接相邻的节点,然后移动到下一级别的相邻节点。在文中的方法中,考虑了网格上 N=4 邻域上α计算角度的差异,以决定是否应该通过广度优先搜索将角度图像的两个相邻元素标记在一起。为此,我们选择一个阈值 ∆a,在文中的实验中设置为 5 ◦。设集合 G 是第一行中我们标记为 ground 的所有列索引的集合。对于每个 c ∈ G,我们使用 BFS开始标记连接的分量为地面。下图显示了一个示例点云,其中我们的算法检测到的地面标记为浅蓝色。
4)实验
(A) 来自 Velodyne 的点云,仅用于说明目的。(B) 构建一个距离图像,不考虑位于地平面上的点,并且 (C) 直接在距离图像中执行分割。(D) 这使我们能够为不同的部分提供单独的小点云。不同的对象以随机颜色显示。范围和标签图像会进行缩放以提高可见性。
5)结论
该文章提出了一种快速且易于实现的 3D 激光距离数据分割方法,实现地面分割。该方法快速而简单,并且利用距离图解决了因点云稀疏引起的邻域大小难以确定的问题,并通过类似于坡度的特征,实现了低曲率地面的提取。但该算法对于存在灰尘的矿山数据难以适用,同时,依赖于第一行存在地面点。