Real Time Large Scale 3D Reconstruction Onboard a Mobile Device using Spatially-Hashed Signed Distance Fields
[C HISEL](移动设备的实时房屋规模TSDF 3D重建系统)
相关资料及实验视频地址
github
C HISEL的重建分辨率远低于通常要求亚厘米分辨率的最新TSDF映射技术。特别是,Nießner等。 [2]通过使用商品GPU硬件和动态空间哈希图,可以生成4mm分辨率的地图,其大小与我们自己的尺寸相当或更大。最终,随着功能更强大的移动GPU的出现,以这些分辨率进行的重构将在移动设备上变得可行。
C HISEL无法保证全局地图的一致性,并且会随时间推移而漂移。许多以前的工作[38,39]结合了稀疏关键点映射,视觉里程表和密集重建来减少姿势漂移。未来的研究必须使SLAM技术与视觉惯性测距法,稀疏的地标定位和密集的3D重建相结合,其效率必须足以在移动设备上进行实时重新定位和闭环。已经为台式机平台实现了C HISEL的基于ROS的开源参考实现(省略了双盲链接)。
摘要
Abstract—我们描述了C HISEL:这是一种通过使用动态空间散列的经截断的有符号距离场进行映射和视觉惯性测距法,在Google Tango移动设备上进行实时房屋规模(300平方米或更多)密集3D重建的系统用于本地化。通过主动剔除不包含表面的场景部分,我们避免了不必要的计算和浪费的内存。即使在非常嘈杂的条件下,我们也可以通过使用空间雕刻来进行高质量的重建。我们能够在移动设备上实时地以2-3 cm的分辨率重建和渲染非常大的场景,而无需使用GPU计算。用户能够通过直观的界面实时查看重建内容并与之交互。我们在公开可用的RGB-D数据集[3]以及从两个设备实时收集的数据集上提供定性和定量结果。
1 Instruction
手机制造商已开始向手机和平板电脑添加高质量的深度和惯性传感器。我们在这项工作中使用的设备,即Google的Tango手机和平板电脑,具有非常小的有源红外投影深度传感器,高性能IMU和宽视场摄像头(第IV-A节)。其他设备,例如Occiptal Inc.结构传感器[4],也具有类似的功能。这些设备为3D映射和定位提供了板载,完全集成的传感平台,其应用范围从移动机器人到手持式无线增强现实。
实时3D重建是计算机视觉和机器人技术中的一个众所周知的问题[5]。任务是从一系列嘈杂的传感器读数在线中提取真实场景的真实3D几何形状。该问题的解决方案对于导航,映射,对象扫描等很有用。该问题可分为两个部分:定位(即估计传感器的姿势和轨迹)和映射(即重建场景的几何形状和纹理)。
考虑类似Tango的设备上的房屋规模(300平方米)实时3D映射和本地化。用户(或机器人)在建筑物周围移动,扫描场景。在房屋规模上,我们只关心分辨率约为2-3厘米的功能(墙壁,地板,家具,电器等)。为了方便扫描,设备屏幕上会向用户提供实时反馈。用户可以导出结果的3D扫描而不会丢失任何数据。图1显示了这种用法的一个示例。(b)以2cm的体素分辨率重建的公寓场景。图1:在Google的Tango设备上运行的C HISEL。案(第三节)。
房屋规模的地图绘制要求3D重建算法完全在机上运行;并且足够快以允许实时交互。重要的是,整个密集的3D重建必须适合设备的有限(2-4GB)内存(第IV-A节)。由于某些移动设备缺少足够强大的离散图形处理单元(GPU),因此我们选择不依赖通用GPU计算来使问题在创建或渲染3D重建时易于处理。对于小规模的移动电话,已经存在涉及占用栅格[6],关键点映射[7]或点云[8-10]的3D映射算法。但是大多数现有方法都需要离线后处理或云计算来以我们感兴趣的规模创建高质量的3D重建。
对于小规模的移动电话,已经存在涉及占用栅格[6],关键点映射[7]或点云[8-10]的3D映射算法。 但是大多数现有方法都需要离线后处理或云计算来以我们感兴趣的规模创建高质量的3D重建。
许多最先进的实时3D重建算法[2,11–14]计算场景的截断有符号距离场(TSDF)[15]。 TSDF存储到场景中最近表面的距离的离散估计。 TSDF可以进行非常高质量的重建,但它占用大量内存。先前的工作[12,13]通过存储移动的体素化并逐步丢弃数据而将TSDF扩展到了更大的场景-但是我们有兴趣保留体积数据以备后用。重建整个房屋所需的TSDF的大小可能在几GB的数量级(第IV-D节),并且所生成的重建网格具有大约1百万个顶点。
在这项工作中,我们详细介绍了用于移动设备的实时房屋规模TSDF 3D重建系统(称为CHISEL)。通过实验,我们发现典型场景中的大部分空间(约93%)实际上是空的(表I)。为了重建和渲染而在空白空间上进行迭代会浪费计算时间;而存储它浪费了内存。因此,C HISEL利用了Nießner等人介绍的数据结构。 [2],动态空间散列[16] TSDF(第III-F节),将距离场数据存储为两级结构,其中根据场景的观察动态分配静态3D体素块。由于数据结构具有O(1)访问性能,因此我们能够快速确定应渲染,更新或删除场景的哪些部分。这使我们可以最大程度地减少每次深度扫描所花费的时间,并使重建在设备上实时运行(表9e)。
对于本地化,C HISEL结合使用了视觉惯性测距法[17,18]和基于稀疏2D关键点的映射[19]作为黑匣子输入(第III-J节),并结合了增量扫描到模型的ICP [ 20]校正漂移。我们提供了公开的RGB-D数据集[3]以及从两种设备实时收集的数据集的定性和定量结果(第四部分)。我们在内存效率,速度和重建质量方面比较了用于创建(第IV-C节)和存储(第IV-D节)TSDF的不同方法。 C HISEL能够在移动设备上实时生成室外和室内场景的高质量,大规模3D重建。
2 相关工作
映射范例通常分为两类之一:基于地标的(或稀疏的)映射和高分辨率的密集映射。 稀疏映射根据环境中的关键特征生成度量标准的地标一致的地图时,密集映射将所有传感器数据全局注册为高分辨率数据结构。 在这项工作中,我们主要关注密集映射,这对于高质量3D重建至关重要。
由于移动电话通常没有深度传感器,因此先前针对移动电话进行密集重建的工作已经花了很多时间从一系列已注册的单眼相机图像中提取深度。由于我们的工作集中在具有集成深度传感器的移动设备(例如Google Tango设备)上,因此我们不需要执行昂贵的单眼立体声作为密集重建的前提。这使我们可以节省3D重建本身的内存和CPU预算。密集3D映射的最简单方法之一是存储多个注册点云。这些基于点的方法自然会将深度数据转换为投影的3D点。简单来说,点云无法捕获局部场景结构,嘈杂且无法捕获有关场景的负(非表面)信息。这些信息对于在高噪声下的场景重建至关重要。 Elfes引入了“占用网格映射”,该功能将世界划分为包含占用概率的体素网格。占用网格保留本地结构,并优雅地处理冗余和丢失的数据。占用栅格虽然比点云更健壮,但会产生锯齿,并且缺少有关表面法线和障碍物内部/外部的信息。占用网格映射已显示为使用Octree表示在Tango [1]设备上实时执行。
Curless和Levoy创建了一个占用栅格的替代方法,称为截断符号距离场(TSDF),用于存储场景的符号距离场的体素化。 TSDF在内部障碍物中是负面的,而在外部障碍物中是正面的。该表面被隐式地表示为TSDF的零等高线。虽然使用的内存多于占用栅格,但TSDF通过保留局部结构来创建更高质量的表面重建。在机器人技术中,距离字段用于运动计划,映射和场景理解中。距离字段为机器人提供了有用的信息:到最近障碍物的距离,以及使它们远离障碍物的坡度方向。 Wagner等人的最新著作。探索将TSDF直接用于机器人手臂运动计划;利用隐式存储在TSDF中的梯度信息来局部优化机器人轨迹。我们对直接使用TSDF数据为自动飞行机器人类似地规划轨迹感兴趣。使用占用栅格的飞行机器人已经实现了实时机载3D映射,导航和里程表。 C HISEL是这项工作的补充。
Kinect Fusion使用TSDF来同时实时提取移动深度相机的姿势和场景几何。充分利用GPU进行扫描融合和渲染,Fusion能够在小范围内创建极高质量,高分辨率的表面重建。但是,像占用栅格映射一样,该算法依赖于单个固定大小的3D体素栅格,因此由于内存限制,因此不适合用于重建非常大的场景。此限制引起了将TSDF融合扩展到更大场景的兴趣。
移动窗口方法(例如Kintinuous [12])通过在GPU中存储移动的体素网格,将Kinect Fusion扩展到更大的场景。当摄像机移出网格之外时,不再可见的区域将转换为表面表示。因此,距离场数据被过早丢弃以节省内存。由于我们要保存距离场数据,因此以后可以将其用于后处理,运动计划和图。 2:C HISEL系统图在其他应用中,采用移动窗口方式是不合适的。
最近的工作集中在通过压缩距离场来避免将TSDF融合扩展到更大的场景,从而避免在空的空间上存储和迭代。许多人使用分层数据结构(如八叉树或KD树)来存储TSDF [30,31]。但是,这些结构具有高度的复杂性和并行性的复杂性。
Nießner等人的方法。 [2]使用两层分层数据结构,该结构使用空间哈希[16]存储TSDF数据。这种方法避免了拥有O(1)查询的其他分层数据结构的不必要的复杂性,并避免了存储或更新远离表面的空白空间。
C HISEL适应了Nießner等人的空间哈希数据结构。 [2]用于Tango设备。通过仔细考虑在每个时间步长应将空间的哪些部分转换为距离场,我们避免了在远离传感器的区域进行不必要的计算(表II)和内存分配(图5a)。与[2]不同,我们不使用任何通用的GPU计算。所有TSDF融合都是在移动处理器上执行的,体数据结构存储在CPU上。除了通过光线投射渲染场景外,我们仅为场景中需要渲染的部分逐步生成多边形网格。由于Tango设备上的深度传感器比其他商用深度传感器的噪声要大得多,因此我们将空间雕刻从占用栅格映射(第III-E节)和动态截断(第III-D节)引入到TSDF融合算法中,以改善重建效果高噪音条件下的画质。空间雕刻和截断算法由使用Nguyen等人的方法为传感器训练的参数噪声模型提供。 [32],[2]也使用。
3 系统实施
A 初步措施
考虑理想针孔深度传感器的几何形状,光线从传感器的原点发出到场景。图3a是射线从照相机射到表面以及射线穿过的体素的图。
调用rayo的起点和射线x的端点。射线的长度由z = ||o-x||给出。射线的方向由r̂ = (o-x)/z给出。每条射线的端点表示表面上的一个点。我们还可以使用插值参数u通过射线的方向和端点对其进行参数化:
(1)
在每个时间步长t处都有一组射线Zt。在实践中,射线被噪声破坏。称d为从传感器原点到沿射线表面的真实距离。然后,z实际上是从一个依赖于d的分布中得出的随机变量,称为命中概率(图3b)。
假设命中概率是高斯,我们有:
(2)
其中σd是真实深度d的深度噪声的标准偏差。我们使用Nguyen等人的方法训练该模型。
由于深度传感器并不理想,因此实际的深度读数对应于穿过场景的许多可能光线。因此,每个深度读数代表一个圆锥体,而不是射线。穿过圆锥体中心的光线在传感器附近使其非常接近,但距离越远,其近似性越差。
B.截断的符号距离场(TSDF)
我们将世界建模为体积有符号距离场Φ:R3→R。对于世界上的任何点x,*Φ(x)*都是到最近表面的距离,如果该点在障碍物之外,则为正号。否则为负面。因此,零等高线(Φ= 0)对场景的表面进行编码。
由于我们主要对重建曲面感兴趣,因此我们使用了截断符号距离场(TSDF):
(3)
其中τ∈R是截断距离。 Curless和Levoy指出,在深度射线的端点附近,TSDF沿射线到最近观测点的距离非常近似。
Alg.1中概述了在[15]中使用给定深度扫描更新TSDF的算法。对于场景中的每个体素,我们存储一个有符号的距离值,以及权重W:R 3→R +,表示距离测量的可信度。 Curless和Levoy表明,通过对时间测得的距离进行加权平均,TSDF的零等值面将到所有射线端点的和平方距离最小化。
我们将TSDF初始化为权重为0的未定义值,然后对于每次深度扫描,更新截断距离τ内沿每条射线的所有点的权重和TSDF值。根据尺度不变加权函数*ατ(u):[-τ,τ]→R +*更新权重。
可以直接根据传感器的命中概率(2)计算加权函数ατ;但是为了获得更好的性能,可以使用ατ的线性,指数和常数近似值。我们使用常数1。这导致比方法高的表面近似ατ(u)=2τ的重建质量更接近传感器的命中概率。
C 着色
与[12,14]中一样,我们通过直接将颜色存储为体积数据来创建有色表面重建。颜色的更新方式与TSDF完全相同。我们假设每个深度射线也对应于RGB空间中的一种颜色。我们从u∈[-τ,τ]沿着光线步进,并更新每个体素的颜色及其权重:
其中v = x − ur̂,c∈R 3+是射线在颜色空间中的颜色,而αc是颜色加权函数。如[14]中所示,为简单起见,我们选择了RGB颜色空间,但要以照明变化的颜色一致性为代价。
D 动态截断距离
像在[2,32]中一样,我们使用基于传感器噪声模型的动态截断距离而不是固定的截断距离来解决远离传感器的嘈杂数据。截短距离是深度的函数,T(z)=βσz,其中σz是深度读数z(2)时噪声的标准偏差,β是表示参数数量的缩放参数。我们愿意考虑的噪声的标准偏差。算法1第5行显示了如何使用它。
E 空间雕刻
当深度数据非常嘈杂且稀疏时,负数据(即有关场景的哪些部分不包含曲面的信息)的相对重要性要高于正数据[6,23]。可以将射线视为对距离场的可能值的约束。穿过空白空间的光线将距离场沿光线约束为正值。距离字段可能是非正数仅在射线的端点附近。
我们使用空间雕刻约束来扩充TSDF算法。图3b显示了射线P的命中概率(z-d = u),通过概率P(z-d <u),vs的假想图。 u,其中z是传感器的测量值,d是传感器到表面的真实距离。当通过概率比特定体素中的命中概率高得多时,很可能无人使用。命中积分区域在[-τ,τ]内部,而比τ+更靠近摄影机的区域在空间雕刻区域中。沿着空间雕刻区域中的每条射线,我们消除具有正存储SDF的数据。算法1(第8行)显示了如何实现。
空间雕刻给我们带来了两个好处:首先,它极大地改善了噪声极高的区域(特别是在物体边缘附近的表面重建:参见图9);其次,它消除了由于移动物体和定位误差而引起的一些不一致性。例如,在传感器前行走的人只会在被空间雕刻移除之前短暂影响TSDF。
F.动态空间散列的TSDF
每个体素均包含带符号距离场的估计值和关联的权重。在我们的实现中,它们打包成单个32位整数。前16位是定点有符号距离值,后16位是无符号整数权重。颜色类似地存储为32位整数,每个颜色通道具有8位,权重为8位。 [2、11、12、14]中使用了类似的方法来存储TSDF。作为基准,我们可以考虑将所有必需的体素简单地存储在一块内存中。不幸的是,这种类型的固定网格所需的内存存储量随着O(N 3)的增长而增加,其中N是3D体素阵列每侧的体素数量。另外,如果事先不知道场景的大小,则必须调整存储块的大小。
对于大规模重建,需要较少的内存占用和更多的动态方法。一些作品要么使用八叉树[24、30、31],要么使用移动体积[12]。这些方法都不适合我们的应用。虽然八位字节最大程度地提高了内存效率,但在访问和遍历体数据方面却存在重大缺陷[2,33]。与[2]相似,我们发现使用八叉树存储TSDF数据,与固定网格相比,可将迭代性能降低一个数量级。
HISEL使用Nießner等人介绍的混合数据结构,而不是使用八进制,移动量或固定网格。 [2]。我们将世界分为两级树。在第一层中,我们有大块体素(图4a)。块在空间上被哈希[16]到动态哈希图中。每个块均由N v 3体素的固定网格组成,这些网格存储在整体存储块中。随着数据的添加,块将从不断增长的堆内存池中动态分配,并根据其整数坐标在空间3D哈希图中进行索引。与[2,16]中一样,我们使用哈希函数:hash(x,y,z)= p 1 x ⊕p 2 y ⊕p 3 z mod n,其中x,y,z是块的3D整数坐标,p 1,p 2,p 3是任意大素数,⊕是异或运算符,n是哈希图的最大尺寸。
由于块的大小是固定的,因此从块TSDF中查询数据涉及将世界坐标舍入(或移位,如果N v是2的幂),则将世界坐标舍入为块和体素坐标,然后进行哈希映射查找,然后进行数组查找。因此,查询为O(1)[2]。此外,由于块内的体素彼此相邻地存储在存储器中,因此在迭代它们时提高了缓存性能。通过仔细选择块的大小以使其对应于τ,我们仅在零等值面附近分配体积数据,而不会在空的或未知的体素上浪费过多的内存。
G.视锥体裁剪和垃圾收集
为了确定应分配,通过深度扫描更新和绘制的块,我们使用视锥剔除(计算机图形学中的一种众所周知的技术)。我们创建了一个视锥台,它在相机的最大深度读数处具有一个远平面,而在相机的最小深度处具有一个近平面。然后,我们获取摄像机视锥的轴向对齐的边界框,并检查坐标视边界框内的每个块是否与摄像机视锥相交。只有那些与平截头体相交的对象才会被更新。块首先与相机视锥相交时分配。
由于平截头体是可以通过深度扫描更新的空间的保守近似值,所以平截头体可见的一些块将没有与之关联的深度数据。图6显示了所有与深度相机视锥相交的TSDF块,它们在命中的τ内为绿色立方体。接收新数据时,仅更新这些块。深度扫描期间未更新的块将被收集(从哈希图中删除)。由于摄像机视锥的大小在固定范围内,因此垃圾回收过程的性能为O(1)。 Niessner等。 [2]使用类似的方法来决定应使用光线投射而非几何平截头体剔除来更新哪些体素块。我们发现在移动CPU上平截锥体比射线投射更快。
H.深度扫描融合
要将深度扫描融合到TSDF(Alg.1)中,有必要考虑每次扫描中的每个深度读数,并更新与视锥相交的每个体素。大多数工作使用穿过圆锥中心的光线来近似深度圆锥[2,11],并使用快速栅格化算法来确定哪些体素与光线相交[34]。我们将其称为“射线投射”方法。其性能由O(N射线×l射线)表示,其中N射线是扫描中的射线数,l射线与要积分的射线的长度成比例。如果我们使用固定大小的截断距离并且不执行空间雕刻,则l ray =τ。但是,通过空间雕刻(第III-E节),被集成的射线的长度可能不受限制。
光线投射的有用替代方法是投影贴图。在[11、14、23、32]中使用的投影映射通过将每个体素的可视外壳投射到深度图像上,并将深度值与从体素到相机平面的几何范围进行比较来进行工作。Alg.2描述了投影映射。而不是遍历每个射线,投影映射遍历每个体素。与大多数其他作品一样,我们将每个体素的视觉船体以单个点近似于体素中心。投影贴图的性能受O(N v)限制,其中N v是受深度扫描影响的体素数。该值几乎是恒定的加班时间,并且取决于TSDF的分辨率,可能大大小于扫描中的射线数量。但是,投影映射会遭受与分辨率有关的混叠误差,因为到体素中心的距离可能与穿过体素的射线的真实长度相差最多为体素对角线长度的一半。此外,通过忽略体素的视觉外壳并仅投影其中心,我们忽略了在每次扫描过程中多个深度锥可能与体素相交的事实。 IV-C节比较了这些方法的性能和质量。
I.渲染
大多数其他TSDF融合方法[2,11]通过直接在GPU上进行光线追踪来渲染场景。这具有渲染时间与重建大小无关的优点,但是需要将TSDf数据存储在GPU上。由于我们所有的计算都是在CPU上执行的,因此我们改用计算机图形学中的一种方法,使用渐进的Marching Cubes [36]渲染大地形[35]。对于每个块,我们存储一个三角形网格段(图4a)。网格划分是通过深度扫描融合异步完成的,并且是懒惰地执行的(即仅在需要渲染块时)。只要通过深度扫描更新了块,则TSDF的零等值面就会生成三角形网格。与[12,14]中一样,通过三线性插值为每个顶点计算颜色。在块的边界处,顶点被复制。仅那些对虚拟相机视锥被渲染。距离相机很远的网格被渲染为彩色边界框。一旦分配的网格数量超过某个阈值,就会破坏远离用户的网格。以此方式,在每一帧中仅极少量的网格段被更新和/或发送到GPU。
J.在线姿势估计
首先从机载视觉惯性测距(VIO)系统估计姿态数据,该系统使用2D特征跟踪和扩展卡尔曼滤波器将广角相机,惯性测量单元和陀螺仪以60 Hz的频率融合数据。可以在[17,18]中找到对该系统的更详细的讨论。我们将VIO系统视为黑匣子,并且不会将任何数据反馈回去。与大多数其他TSDF融合方法[2,11,12,14]不同,我们无法直接使用深度数据估计传感器的姿态并扫描以建模迭代最近点(ICP)[20],因为深度数据在硬件上仅限于3-6Hz,这太慢了,无法直接估计姿态。取而代之的是,我们通过注册每次新的深度扫描来逐步调整VIO姿态估计,以逐步建立模型。给定传感器在时间t的姿势估计值H t,我们可以定义姿势的成本函数并扫描Z t:
此成本函数意味着扫描中的每个数据点都与重建表面Φτ(其距离为0)上的最近点相关联。这类似于ICP成本函数,在该函数中,相应点由有符号距离函数隐式描述。使用带符号距离场的一阶泰勒近似,我们可以通过查看带符号距离函数的梯度,然后沿梯度方向步进一次以直接最小化距离,来估计曲面上与z i的最近点:
然后,为了使当前深度扫描与全局模型对齐,我们使用这种一阶近似作为模型来注册点云。 TSDF的梯度在ICP的每个步骤中使用中心有限差分进行重新计算,该中心差分具有O(1)性能。然后,我们迭代直到c最小化。每次深度扫描到达时,都会累积校正变换。
通过将每次新的深度扫描注册到全局模型,我们可以在较小的区域中校正系统漂移中较小的逐帧误差。但是,随着轨迹变长,系统仍然会遇到漂移。图7显示了由手持设备的用户重建的约175米长的走廊的俯视图。左图显示仅通过视觉测距法和密集对齐即可完成的重建,走廊尽头有约5米的漂移。右图显示了通过线束调整对轨迹进行离线全局全局优化后的重建,覆盖在平面图上建筑的。