OctoMap:An Efficient Probabilistic 3D Mapping Framework Based on Octrees
摘要
三维模型提供了空间的立体表示,这对于各种机器人应用包括飞行机器人和配备机械臂的机器人非常重要。在本文中,我们提出了一个开源框架来生成三维立体环境模型。我们的建图方法是基于八叉树和使用概率占据估计。它不仅明确地表示了被占据的空间,而且还表示了自由和未知的领域。此外,我们还提出了一种八叉树地图的压缩方法来保持三维模型的紧凑性。我们的框架是开放源码的C++库,已经成功地应用在多个机器人项目中。我们提出了一系列的实验结果处理了真实机器人和公开可用的真实世界的数据集。结果表明,我们的方法能够在保持最小内存需求的同时,有效地更新地图表示,并对数据进行一致性建模。
主要贡献
- 提出了一种基于八叉树的三维环境综合表示框架OctoMap
- 满足了大多数机器人应用对于地图的要求:概率表示,未建图区域的建模,高效性
- 可以在保持最小内存消耗的情况下高效地更新地图中的占据和自由区域
OctoMap建图框架
八叉树
八叉树是表示三维空间的层次数据结构。八叉树中的每个节点表示立方体积中包含的空间,通常称为体素。如图所示,在达到给定的最小体素大小之前,该体积被连续细分为八个子体积。
最小体素大小决定了八叉树的分辨率。由于八叉树是一种层次数据结构,如果内部节点的状态保持一致,则可以在任何层级对树进行剪枝以获得粗略的划分。下图展示了八叉树地图在不同分辨率等级下进行占据体素查询的结果。
在最基本的形式中,八叉树可以用来模拟一个对象的属性。在机器人建图的场景中,这通常是体积的占据与否。如果某个体素被测量为已占据,则八叉树中相应的节点将被初始化。任何未初始化的节点都可能是自由的或未知的。为了解决这个矛盾,我们在树中显式地表示自由体素。这些体素是在传感器和被测点之间的区域创建的,例如,沿着光激光发射方向,在传感器中心和激光击中点连线上的所有体素都被视为自由体素。未初始化的体素隐式的建模了未知区域。下图显示了一个八叉树,其中包含来自真实激光传感器数据的自由和占据节点。
使用布尔占据状态或离散标签允许八叉树进行更加紧凑的表示:如果一个节点的所有子节点具有相同的状态(占据或空闲)它们可以被修剪掉,这将大大减少树中需要维护的节点数。
在机器人系统中,人们通常必须应对传感器噪声和暂时或永久性的环境变化。在这种情况下,单独的占据标签将是不够的。相反,必须对占据状态进行概率建模(也就是占据概率),例如通过应用占据栅格地图(occupancy grid map)。然而,这种概率模型缺乏通过剪枝进行无损压缩的可能性(剪枝后无法无损地恢复子节点的状态)。
在数据访问复杂性方面,由于树结构的原因,与固定大小的三维网格相比,八叉树需要额外的开销。对包含n个节点,树深度为d的八叉树中的单个随机节点进行查询的复杂度为 O ( d ) = O ( l o g n ) O(d)=O(logn) O(d)=O(logn)。以深度优先的方式遍历完整树需要 O ( n ) O(n) O(n)的复杂性。请注意,在实践中,八叉树会被限制一个最大的深度 d m a x d_{max} dmax。这意味着在 d m a x d_{max} dmax为常数的情况下产生 O ( d m a x ) O(d_{max}) O(dmax)的随机节点查找复杂性。因此,对于固定的深度为 d m a x d_{max} dmax的八叉树,与相应的3D网格相比的额外开销是恒定的。
概率传感器信息融合
在坐着的框架中,传感器读数使用占据栅格地图的方式进行融合,给定传感器的测量值