文章目录
- 摘要
- 一、 介绍
- 二、相关工作
- A 基于NeRF的SLAM
- B 基于3DGS的SLAM
- 三、方法
- A 超原语
- B. 3D 高斯投影
- C. 关键帧管理
- D. 基于金字塔的训练
- E. 高斯映射
- 四、实验
摘要
文章:github
介绍:介绍
3D高斯溅射(3DGS)在快速渲染和高保真建图方面展现了其优势。本文提出了LVI-GS,一种紧密耦合的LiDAR-视觉-惯性建图框架,结合了3DGS技术,利用LiDAR与图像传感器的互补特性,捕捉三维场景的几何结构和视觉细节。为此,3D高斯点通过彩色化的LiDAR点云初始化,并通过可微渲染进行优化。为了实现高保真建图,我们提出了一种基于金字塔的训练方法,有效地学习多层次特征,并结合由LiDAR测量推导的深度损失,以增强几何特征感知。通过精心设计的高斯地图扩展、关键帧选择、线程管理和自定义CUDA加速策略,我们的框架实现了实时的照片级真实建图。通过数值实验评估,我们的方法在与最先进的3D重建系统的对比中展现出了优越的性能。
一、 介绍
同时定位与建图(SLAM)系统在多个领域中发挥着不可或缺的作用,包括机器人技术、增强现实和自主导航[1]。这些系统通过在构建地图的同时估计自身在环境中的位置,使设备能够理解并导航复杂的环境。有效的SLAM系统既需要精确的定位能力,也需要全面的场景重建能力。
传统的SLAM系统使用地标[2]、点云[3]、占用网格[4]、符号距离函数(SDF)体素网格[5]或网格[6]来表示环境。在这些方法中,点云作为一种直接的场景表示方式,能够通过传感器如相机和LiDAR轻松获取。基于点云的SLAM系统可以实现精确的定位,并构建稀疏或密集地图,尽管这些地图通常缺乏丰富的视觉细节。
神经辐射场(NeRF)的出现为高保真场景重建提供了一种新方法[7]。NeRF通过优化一个连续的体积场景函数,隐式地表示场景,且所需的内存最小化。一些基于NeRF的SLAM方法利用该框架的新型视图合成和高保真重建能力来建模场景。例如,iMAP[8]构建了一个隐式的3D占用和颜色模型,用于跟踪,而NICE-SLAM[9]则通过粗到细的方法表示较大的场景。像Vox-Fusion[10]、CoSLAM[11]和ES-SLAM[12]等增强型方法在一定程度上提升了SLAM系统的性能。然而,由于涉及大量的优化过程,这些系统难以实现实时性能。此外,使用多层感知器存储地图会面临灾难性遗忘和有限边界等问题,这可能妨碍场景重建。
3D高斯溅射(3DGS)提供了一种令人兴奋的替代方法,通过可微的3D高斯形状原始体素提供连续且可适应的3D场景建模表示[13][14]。作为一种半隐式建图方法,它在优化和渲染速度上有显著优势,尽管牺牲了一些新视图合成的能力。尽管基于优化,3DGS与点云和曲面云相似,因此继承了它们的高效性、局部性和适应性——这些特性有助于SLAM建图。3DGS的渲染速度可达到每秒200帧(1080p分辨率),且初始化时使用点云,使其能够利用传统SLAM系统生成的稀疏或密集点云来实现高保真图像[15]。
最近,一些将3D高斯整合到SLAM中的方法显示出了良好的效果。例如,SplaTAM[16]、MonoGS[15]、GS-SLAM[17]和Photo-SLAM[18]等方法利用RGB-D或RGB数据建立完整的SLAM系统。然而,这些技术在大规模、不可控的户外环境中遇到困难,尤其是在复杂的光照、复杂的背景和快速运动的挑战下。尽管LiDAR为3D高斯提供了高质量的几何初始化,并且在户外环境中通常比相机更为鲁棒,但将LiDAR整合进SLAM系统时也带来了独特的挑战。LIV-Gaussianmap[19]和LetsGo[20]利用LiDAR初始化3D高斯,而Gaussian-LIC[21]则结合LiDAR-惯性-相机系统进行全面的3D高斯构建。然而,像LIV-Gaussianmap[19]和LetsGo[20]这样的系统仅限于离线处理,Gaussian-LIC[21]则需要复杂的前端里程计和大量关键帧的维护。
总体而言,本研究的主要贡献可以概括如下:
- 我们开发并实现了一个复杂的实时LVI-GS系统,能够维护动态的超原始体素模块。该系统利用3D高斯溅射(3DGS)技术,在三维空间中进行高质量、实时渲染,确保对复杂环境的高效且准确的表示。
- 为了进一步提升系统的性能和可扩展性,我们采用了粗到细的地图构建方法。该方法结合了RGB图像金字塔和深度图像金字塔,逐步在不同层次的细节上精炼地图。此外,我们实施了先进的线程管理技术,以优化计算效率,确保在大数据集的情况下仍能顺利进行实时操作。
- 为了提高地图表示和渲染质量,我们设计了一个强大的关键帧管理策略,有效地选择和处理关键帧。通过在系统中加入深度损失,我们提升了3D高斯地图的精确度,进而实现了更加精准的重建和视觉上更优的渲染效果。
二、相关工作
A 基于NeRF的SLAM
经典的基于NeRF的SLAM系统完全依赖于多层感知器(MLP)。它们通过将环境编码到神经网络的权重中,在通过场景发射的光线沿途的不同点查询该函数,从而渲染出具有高视觉保真度和现实光照效果的新视图。作为第一个基于NeRF的SLAM系统,iMAP[8]通过联合优化光度和几何损失,确保接近帧率的相机跟踪。然而,受限于MLP的容量,它在较大的环境中容易遇到较为简单的重建问题,并且在处理大规模场景时可能遭遇灾难性遗忘。为了解决这个问题,后续的工作集中于结合隐式MLP和结构化特征的优势,显著提升场景的可扩展性和精度。例如,NICE-SLAM[9]采用分层策略,集成多级本地数据,有效解决了过度平滑的重建和大规模场景中的可扩展性限制问题。Vox-Fusion使用八叉树来管理体素,为场景提供了可扩展性。ESLAM[12]、Co-SLAM[11]、GO-SLAM[22]和Point-SLAM[23]引入了多尺度特征平面、组合平滑、细节编码、实时全局优化和动态神经点云表示等创新方法,在提高内存效率和可扩展性的同时,增强了场景重建、相机跟踪和地图保真度。OrbeezSLAM[24]、NeRF-SLAM[25]和NeRF-VO[26]则通过提高跟踪频率和姿态估计精度,改善了基于NeRF的SLAM方法在里程计中的表现。
B 基于3DGS的SLAM
与基于NeRF的SLAM相比,基于3DGS的方法通过密集损失提供了更快、更真实的渲染、更强的地图容量和更高效的优化。SplaTAM[16]采用简化的3D高斯体素进行准确的相机姿态估计和场景优化,从而提高了渲染效率和地图精度。与之相比,GS-SLAM[17]利用3D高斯、透明度和球面谐波表示场景,具有自适应高斯管理和强大的相机跟踪能力,但在大规模场景中面临深度数据质量和内存使用的挑战。MonoGS[15]是第一个使用单目相机实现3DGS SLAM的工作。GS-ICP[27] SLAM通过采用G-ICP[28]跟踪过程,利用3D高斯溅射的显式特性。Photo-SLAM[18]利用ORB-SLAM3[29]提供的精确姿态估计来重建混合高斯地图。一些方法还将LiDAR作为传感器进行整合。Gaussian-LIC[21]实现了一个实时的LiDAR-惯性-相机SLAM系统,依赖于紧耦合的LiDAR-惯性-相机里程计。MM-Gaussian[30]开发了一个重定位模块,用于在定位失败时纠正系统的轨迹。同时,MM3DGS-SLAM[31]采用视觉-惯性框架来优化相机姿态,并解决了单目深度估计中的尺度模糊问题。
三、方法
我们的框架通过两个并行线程实现完整的系统功能。一个线程处理里程计,而另一个线程执行3D高斯的实时优化。两个线程协同工作,共同维护一个共享的超原始模块。在这两个线程之间,数据如3D点云、相机姿态、相机图像和深度信息会进行交换。
A 超原语
我们维护一个超原语模块,包含3D点云、体素和3D高斯。为了高效访问3D点云进行3D高斯初始化,地图点被组织成固定大小的体素(例如,0.1 m x 0.1 m x 0.1 m)。体素的激活是通过最近添加的点的存在来确定的(例如,在过去的一秒钟内)。一个已激活的体素表示最近有更新,而一个去激活的体素则表示没有最近的更新。
此外,在视觉-惯性里程计(VIO)模块中,如果某个点的投影误差或光度误差超过指定阈值[32],该点会被移除。对于点云中的每个点,我们首先识别其在网格中的位置;如果该位置已经存在点,则该点会被丢弃。我们还会调节每个体素内的点的数量,以保持控制的密度。通过这一初步过滤过程,随着里程计的进行,所获得的点云避免了冗余地添加3D高斯。
B. 3D 高斯投影
我们的场景表示是3DGS,用一组各向异性高斯 G \mathcal{G} G 来映射它。每个高斯包括不透明度 o ∈ [ 0 , 1 ] o \in [0,1] o∈[0,1],中心位置 μ ∈ R 3 \mu \in \mathbb{R}^3 μ∈R3,RGB颜色 c,半径 r 和3D协方差矩阵 Σ ∈ R 3 × 3 \Sigma \in \mathbb{R}^{3 \times 3} Σ∈R3×3。给定一个中心位置 μ \mu μ 和3D协方差矩阵 Σ \Sigma Σ,高斯分布定义为
D ( x ) = exp ( − 1 2 ( x − μ ) Σ − 1 ( x − μ ) T ) ( 1 ) \mathcal{D}(x) = \exp\left(-\frac{1}{2}(x-\mu)\Sigma^{-1}(x-\mu)^T\right) \quad (1) D(x)=exp(−21(x−μ)Σ−1(x−μ)T)(1)
因为每个高斯形状都是一个椭球体,我们对3D高斯的协方差进行参数化如下:
Σ = R S S T R T ( 2 ) \Sigma = RSS^T R^T \qquad (2) Σ=RSSTRT(2)
其中 S ∈ R 3 S \in \mathbb{R}^3 S∈R3 是描述3D尺度的向量, R ∈ R 3 × 3 R \in \mathbb{R}^{3 \times 3} R∈R3×3 表示旋转矩阵。3DGS不是沿着相机光线遍历,而是通过对3D高斯的迭代进行光栅化,从而忽略了渲染过程中的空白空间。鉴于3DGS使用了体积渲染,没有必要直接推导出表面。而是通过将 N \mathcal{N} N 个3D高斯通过涂染和混合的方式合并,确定像素的颜色 C p \mathcal{C}_p Cp:
C p = ∑ i ∈ N c i α i ∏ j = 1 i − 1 ( 1 − α j ) ( 3 ) \mathcal{C}_p = \sum_{i \in \mathcal{N}} c_i \alpha_i \prod_{j=1}^{i-1} (1 - \alpha_j) \qquad (3) Cp=i∈N∑ciαij=1∏i−1(1−αj)(3)
类似地,使用相同的方法,我们也可以通过以下方式获得深度 D p \mathcal{D}_p Dp:
D p = ∑ i ∈ N d i α i ∏ j = 1 i − 1 ( 1 − α j ) ( 4 ) \mathcal{D}_p = \sum_{i \in \mathcal{N}} d_i \alpha_i \prod_{j=1}^{i-1} (1 - \alpha_j) \qquad (4) Dp=i∈N∑diαij=1∏i−1(1−αj)(4)
我们还渲染了一个可见性图像,它用于确定当前像素的可见性。
V p = ∑ i ∈ N α i ∏ j = 1 i − 1 ( 1 − α j ) ( 5 ) \mathcal{V}_p = \sum_{i \in \mathcal{N}} \alpha_i \prod_{j=1}^{i-1} (1 - \alpha_j) \qquad (5) Vp=i∈N∑αij=1∏i−1(1−αj)(5)
其中最终的不透明度 α i \alpha_i αi 是学习到的不透明度 o i o_i oi 和高斯的乘积:
α i = o i exp ( − 1 2 ( x ′ − μ ′ ) Σ ′ − 1 ( x ′ − μ ′ ) T ) ( 6 ) \alpha_i = o_i \exp\left(-\frac{1}{2} \left(x' - \mu'\right) \Sigma'^{-1} \left(x' - \mu'\right)^T\right) \qquad (6) αi=oiexp(−21(x′−μ′)Σ′−1(x′−μ′)T)(6)
其中坐标 x ′ x' x′ 和 μ ′ \mu' μ′ 都在投影空间中。
我们的最终目标是将3D高斯投影到2D平面上进行渲染以获得高保真图像,这个过程通常被称为“涂染”。当我们获得图像和传感器位置变换 [ Q i w , T i w ] \left[Q_{i w}, T_{i w}\right] [Qiw,Tiw] 时,因此,将3D高斯 ( μ W , Σ W ) \left(\mu_{W}, \Sigma_{W}\right) (μW,ΣW) 投影到2D高斯 ( μ I , Σ I ) \left(\mu_{I}, \Sigma_{I}\right) (μI,ΣI) 的函数是
μ I = [ Q i w , T i w ] ⋅ μ W , Σ I = J Q i w Σ W Q i w T J T ( 7 ) \mu_{I} = [Q_{iw}, T_{iw}] \cdot \mu_{W}, \quad \Sigma_{I} = JQ_{iw} \Sigma_{W} Q_{iw}^T J^T \qquad (7) μI=[Qiw,Tiw]⋅μW,ΣI=JQiwΣWQiwTJT(7)
其中 J 是投影变换的雅可比矩阵的线性近似。 Q i w Q_{iw} Qiw 和 T i w T_{iw} Tiw 分别是传感器姿态的旋转和平移分量。
C. 关键帧管理
我们通过超原语模块获得点云,将每 N l N_{l} Nl 个点以及相应的相机姿态和图像打包进一个单一帧中,以备后续选择。所有着色的LiDAR点都被用于初始化3D高斯。我们对图像进行关键帧选择,评估那些没有运动模糊的图像。表现出旋转或平移超过指定阈值的图像被添加到关键帧序列中:
∥ R i − R i − 1 ∥ > τ r 或 ∥ T i − T i − 1 ∥ > τ t ( 8 ) \left\|R_{i} - R_{i-1}\right\| > \tau_{r} \quad \text{或} \quad \left\| T_{i} - T_{i-1}\right\| > \tau_{t} \qquad (8) ∥Ri−Ri−1∥>τr或∥Ti−Ti−1∥>τt(8)
此外,对于每个新添加的关键帧,我们评估其与之前关键帧的视觉重叠。如果重叠超过指定阈值,表明高度相似,该帧被认为是多余的,不会被添加到序列中。此外,还对高斯添加应用了一个过滤标准。我们计算当前关键帧视点的累积不透明度,选择满足透明度要求的3D高斯。如果 V p ≤ τ α \mathcal{V}_{p} \leq \tau_{\alpha} Vp≤τα,则过滤掉该点。而且,在利用关键帧中的所有着色LiDAR点进行3D高斯初始化之前,我们引入了一个缓冲容器来延迟关键帧序列与地图的集成。这种延迟防止了由前一帧初始化的高斯的不透明度在能够从后续帧的视点观察到之前迅速降低到可修剪的阈值,从而确保3D高斯可以从多个视角用于训练。
D. 基于金字塔的训练
在我们大规模的3D高斯场景表示中,我们采用渐进式训练方法来优化训练3D高斯场的效率,同时保持渲染质量。通过在不同分辨率下使用彩色和深度图像,我们构建了彩色和深度图像的金字塔,通过逐步细化细节层次来改进训练过程。具体来说,我们将高斯图划分为多尺度表示,以捕捉不同层次的细节。输入的彩色和深度图像经过重复下采样,使我们能够从粗糙到精细分辨率逐步训练3D高斯。在训练过程中,我们优先考虑低分辨率数据以优化粗略级别的细节。经过一定次数的迭代后,我们逐步减少下采样的级别,最终使用原始输入分辨率完成训练。这种方法确保了高效的训练,同时在各个细节层次上保持了3D高斯场景的高质量表示。
l 0 : ( I r n , D r n , P n ( I g t ) , P n ( D g t ) ) l 1 : ( I r n − 1 , D r n − 1 , P n − 1 ( I g t ) , P n − 1 ( D g t ) ) ⋮ l n : ( I r 0 , D r 0 , P 0 ( I g t ) , P 0 ( D g t ) ) ( 9 ) \begin{align*}& l_{0}:(I_{r}^{n},D_{r}^{n},P^{n}(I_{gt}),P^{n}(D_{gt}))\\ & l_{1}:\left(I_{r}^{n-1},D_{r}^{n-1},P^{n-1}(I_{gt}),P^{n-1}(D_{gt})\right)\\ &\quad\vdots\\ & l_{n}:\left(I_{r}^{0},D_{r}^{0},P^{0}(I_{gt}),P^{0}(D_{gt})\right)\end{align*}\qquad(9) l0:(Irn,Drn,Pn(Igt),Pn(Dgt))l1:(Irn−1,Drn−1,Pn−1(Igt),Pn−1(Dgt))⋮ln:(Ir0,Dr0,P0(Igt),P0(Dgt))(9)
在这里,l表示金字塔的级别, I r I_{r} Ir 表示渲染的彩色图像, D r D_{r} Dr 表示渲染的深度图像。 P ( I gt ) P(I_{\text{gt}}) P(Igt) 表示彩色金字塔,而 P ( D gt ) P(D_{\text{gt}}) P(Dgt) 表示深度金字塔。
E. 高斯映射
在接收到每个关键帧后,我们初始化3D高斯。对于第一帧,我们处理整个点云,提取点的3D坐标作为3D高斯的中心。我们计算每个点到原点的平方欧几里得距离,确保最小值以防止零距离。不透明度参数使用逆Sigmoid函数进行初始化。对于颜色信息,我们从点云的颜色数据中提取特征,并存储在一个张量中,其中RGB通道对应于球谐系数。尽管我们使用了球谐函数(Spherical Harmonics, SH),但初始的SH阶数设置为0。随着优化迭代和关键帧的增加,SH阶数逐渐增加,以更好地适应多个视角,上限为3。
我们对每个接收到的关键帧进行一次优化,作为一个子图。随后,在管理关键帧序列时,接收到新帧后,我们随机打乱所有关键帧,然后随机选择一个帧进行优化。为确保每个关键帧的优化一致性并维持地图的完整性,我们为每个关键帧的优化迭代次数设定了一个上限。达到此限制的关键帧将从关键帧序列中移除。
我们通过最小化图像损失 L c \mathcal{L}_{c} Lc 和几何损失 L d \mathcal{L}_{d} Ld 来优化3D高斯的参数,包括旋转、缩放、密度和球谐系数(SH):
L = L c + λ d L d ( 10 ) \mathcal{L} = \mathcal{L}_c + \lambda_d \mathcal{L}_d \quad (10) L=Lc+λdLd(10)
图像损失由光照误差和两幅图像之间的结构相似性(SSIM)误差组成:
L c = ( 1 − λ ) L 1 ( I , C ( G , T c ) ) + λ L ssim ( 11 ) \mathcal{L}_c = (1 - \lambda) \mathcal{L}_1(I, \mathcal{C}(\mathcal{G}, T_c)) + \lambda \mathcal{L}_{\text{ssim}} \quad (11) Lc=(1−λ)L1(I,C(G,Tc))+λLssim(11)
几何损失定义为渲染深度 D \mathcal{D} D 和LiDAR测量深度 D lidar \mathcal{D}_{\text{lidar}} Dlidar 之间的 L 1 \mathcal{L}_{1} L1 损失:
L d = ∑ ∥ D − D lidar ∥ ( 12 ) \mathcal{L}_d = \sum \left\|\mathcal{D} - \mathcal{D}_{\text{lidar}}\right\| \quad (12) Ld=∑∥D−Dlidar∥(12)
四、实验
图 2:不同3DGS SLAM系统的定性性能比较。
图 3:来自hkust校园00(m2)序列[32]的四个帧的渲染示例和详细视图。红线代表运行轨迹,而(a)-(d)显示了在不同位置的四个选定的渲染图像,突出了玻璃表面、树枝和台阶等细节。红矩形内的区域被放大,以便与真实情况相比较。