从点云中删除动态对象的稳健方法
摘要
提出了一种从3D点云地图中删除动态对象的可靠方法。给定一组已配准的3D点云,我们构建一个占据栅格地图,其中体素表示扩展时间段内空间量的占用状态。构建占用地图后,我们将其用作过滤器,以在将激光雷达扫描中的动态点添加到地图之前将其删除。此外,我们使用对象检测和新颖的体素遍历方法来加速构建占用地图的过程。一旦构建了占用图,就可以实时运行动态对象移除。我们的方法在交通停滞或移动的宽阔城市道路上效果很好,并且由于包含了来自同一场景的更多激光雷达扫描,因此占用地图变得更好。
介绍
算法的输入是一组已配准的3D点云,通常由3D激光扫描仪获取。首先,我们使用地平面检测和对象检测算法将点云中的点分为三类:对象点,地面点和未知点。接下来,我们对未知点和地面点执行体素遍历,并降低从传感器原点到端点的光线路径上所有体素的占用分数,但增加端点体素的占用分数。类似地,我们在对象点上执行体素遍历,但是不增加端点体素的占用率,而是降低其占用率,因为我们从对象检测中已经知道端点落在移动的对象上。我们还维护了一组与地面点相对应的地面体素,并防止在两个体素遍历步骤中将它们标记为空闲。我们对注册集中的所有点云重复此过程,并构建一个占用图。最后,我们将完整的占用地图覆盖在点云地图上,并删除空闲体素中的点(请参阅图2)。应当注意,随着时间的推移,随着更多点云的集成,占用图将变得更加稳定和准确。
具体贡献为:
- 提出了一种新的占用概率更新策略,该策略通过考虑体素的占用历史来构建持久的占用图。与我们的方法不同,[3]赞成快速更新体素的占用分数,赞成最新看到的占用状态
- 提供了一种可选方法,可通过使用对象检测方法对对象点进行分类来加速占用地图的构建过程,并提供一种使用这些点更新占用地图的策略。
- 提供了一种生成手工端点的独特方法,该终点用于更新体素的占用分数。
相关工作
在检测/移除激光扫描中的动态对象方面已经完成了大量工作,并且已经提出了解决该问题的不同方法。这些方法可以大致分为三类:
基于模型的无变化检测方法,该方法依赖于将当前激光扫描与之前或之前的一组扫描和将来的扫描进行比较[6],[7],[8],[9],[10]。
基于神经网络模型的方法,将动态对象对应的点分类[11],并在激光扫描[12],[13],[14]中在对象周围生成边界框并将这些边界框内的点分类为动态对象点。
基于地图的方法,其中使用贝叶斯规则[3]通过激光扫描构建全局占用图/体素网格,或者仅将激光扫描标识符存储在体素中[5],并且占用图用作过滤器以删除在自由空间中的点。本文提出的动态对象去除方法是基于神经网络模型和基于占用图的方法的混合。
算法介绍
- 在III-A节中,我们描述了为什么我们偏爱八叉树数据结构
- 在III-B节中,我们描述了如何使用对象检测来加快在地图中插入点云的过程
- 第III-D,III-E和III-F节讨论了使用自由计数器使占用图更倾向于持久性而不是易于更新的能力,以及如何使用自由计数器值修剪节点
- 第III-G节介绍了一种独特的过滤策略,以提高我们的入住地图的质量
占据八叉树
Octree是用于存储有关3D空间的信息的分层数据结构,八叉树中的每个节点代表一个空间容量,称为体素。我们使用log odds
表格来表示空间的占用信息。另外,我们还记录着每个节点没有被观测到的次数作为free counter
,后面会介绍使用free counter
来更新体素的占用率
常用来表示3D空间数据结构的有:体素网格,k-d树和八叉树,我们选择octree作为占用地图,因为octree的层次结构可以紧凑有效地表示空间,与体素网格相反,我们只需在当观测到occupancy information
时创建一个节点,在本文中,我们使用最大深度为16的八叉树和0.3米的叶节点体素大小 。
目标检测与体素遍历
对象检测可用于加快生成占用图的过程,并提高动态对象去除的精度和召回得分,我们的方法不依赖于任何特定的对象检测方法,但是在我们的实验中,我们使用了AVOD(聚合视图对象检测)[13]网络来获取边界框,目前,该网络已接受训练以检测小型和大型车辆。
但是,许多基于神经网络的对象检测方法有时都无法检测到对象。这些模型只能检测对其进行训练的对象类别。此外,边界框通常不会完全包围检测到的对象,如图(3)所示。因此,使用上述方法构建的点云图仍将具有一些动态点。
为了去除物体检测方法遗漏的动态物体,我们使用上述方法将点云中的点分为两类:
- 对象点(位于检测到的对象的边界框内的点)
- 非对象点(位于边界框外的点)
非对象点遍历
对于点云中的每个非对象点,我们执行体素遍历以找到从传感器原点到终点沿激光射线的所有体素,我们降低了除端点体素以外的所有这些体素的占用率,并增加了端点体素的占用率
对象点遍历
接下来,我们按照相同的步骤插入对象点,但是不增加端点体素的占用率外,而是降低其占用率,这是因为从对象检测中我们已经知道对象点对应于动态对象。
如前所述,有时,围绕对象生成的边界框不会完全包围对象。 我们通过在将非对象点插入到占用图中之后插入对象点来部分解决此问题。此顺序可确保在对对象点执行体素遍历时,将删除动态对象未被边界框包围的部分
地面点检测
如[3]中所述,对以浅角度扫过平面的激光进行体素遍历会导致不良的离散化效果,当遍历另一个附近的体素时,在体素遍历期间被测量为占用的体素可能会标记为空闲,这种影响通常发生在平坦的表面(例如地面和平坦的墙壁)上,并且该影响呈现为平坦表面上的孔,如图(4)所示。
就是体素网格大小导致的
此外,通过对象检测生成的边界框可能包括检测到的对象下方的地面点,并且将地面点错误地分类为动态对象点。 因此,某些地面体素可能仍被标记为空闲。
为了解决此问题,我们为每个地面体素维护一个计数器,该计数器指示将体素分类为地面体的次数,我们还将维护所有检测到的地面体素的集合,并为每次激光雷达扫描更新此集合。
只有地面体素集中那些计数器值大于某个阈值的体素才被视为真实地面体素,这些地面体素在射线遍历期间不会被标记为空闲体素。
我们使用[14],[18]中所述的基于RANSAC的接地平面检测
权重概率
Octomap [3]使用钳制策略允许占用八叉树图的易于更新性和可压缩性,钳位策略可确保节点的log-odds
值不低于下限阈值\(l_{min}\),并且不会超出最高值\(l_{max}\).
当一个节点的log-odds
值达到两个阈值中的任意一个时,就认为该节点是稳定的,并且具有较高的置信度。钳位策略可确保所有稳定的空闲和占用节点具有相同的对数奇数值,从而可以修剪具有相同log-odds
值的相邻节点,还确保了节点的占用状态很容易更新
举例:考虑一个机器人已经绘制了某个区域并观测到其前面几个节点是空闲状态的,现在,如果有人走在机器人前面并站在机器人的路径上,则机器人应该能够快速将节点更新为已占用
其中,\(L()\)表示计算log-odds
值
然而,[3]中的占用率更新策略倾向于体素的最新占用率状态 ,相反的,本文的目标是创建代表环境长期占用状态的区域的占用地图
,我们希望占用率更新算法对动态对象不那么敏感。
本文通过维持每个体素的空闲计数器并使用加权概率来实现此目的。每个体素的计数器用于记录该体素被观测为空闲状态的次数,每次在体素遍历期间,当被观测为空闲状态时,将其递增1;如果其值大于1,并且在体素遍历期间观测到体素被占用,则将其减1。
为了理解原理,考虑两个场景:
第一个情况是体素的空闲计数器值>1,并且插入当前帧点云时,观测到这个体素是占用状态,由于空闲计数器值>1,这表明这个体素先前被记录为空闲,因此该体素很有可能被当前帧点云中的动态对象所占用,因此,我们通过将体素的命中值概率除以空闲计数器值来减轻概率更新,如公式(2)所示,这个策略的动机是:其难以增加先前已经被观测为空闲的体素的占用概率。 体素的空闲计数器值越高,则增加体素的占用概率就越难。
第二种情况是由于对象检测方法的错误检测导致体素被错误地标记为已占用,在这种情况下,我们使用原始公式(1)。 这使得属于动态点的体素易于更新状态。