FlashFusion: Real-time Globally Consistent Dense 3D Reconstruction using CPU Computing

系统结构

FlashFusion: Real-time Globally Consistent Dense 3D Reconstruction using CPU Computing
项目地址:http://www.luvision.net/FlashFusion/ (暂时还没有代码) 系统结构如上图所示,系统分为三个线程:1、跟踪线程。2、优化线程。3、Mesh生成线程。通过MILD闭环检测器来根据ORB特征点发现闭环。

  • 定位:如果当前帧和对应关键帧的特征平均视差大于阈值,当前帧被选为关键帧。在全局优化时,只优化关键帧的位姿,非关键帧的位姿随关键帧一起被优化。
  • 重建:体素块包含一定数量的体素,体素块使用动态Hash进行存储。TSDF会进行逐帧更新,而Mesh的更新只在新的关键帧进行。

相机定位

当前帧被选为关键帧之后,最小化到之前的所有关键帧的重投影误差之和。第i帧和第j帧之间的重投影误差为: Ei,j(Ti,jTi,jSE3)=k=0Ci,j1pikTi,jpjk2(1) E_{i, j}\left(T_{i, j} | T_{i, j} \in S E 3\right)=\sum_{k=0}^{\left|C_{i, j}\right|-1}\left\|\boldsymbol{p}_{i}^{k}-T_{i, j} \boldsymbol{p}_{j}^{k}\right\|^{2} \tag{1} 其中Ti,jT_{i,j}是关键帧之间的坐标变换 ,(pik,pjk)(\boldsymbol{p}_{i}^{k},\boldsymbol{p}_{j}^{k})是一对匹配的特征。全局的误差函数如下:E(ξ)=i=0N1jΦ(i)Ei,j=i=0N1jΦ(i)k=0Ci,j1pikTi,jpjk2(2)E(\boldsymbol{\xi})=\sum_{i=0}^{N-1} \sum_{j \in \Phi(i)} E_{i, j}=\sum_{i=0}^{N-1} \sum_{j \in \Phi(i)} \sum_{k=0}^{\left|C_{i, j}\right|-1}\left\|\boldsymbol{p}_{i}^{k}-T_{i, j} \boldsymbol{p}_{j}^{k}\right\|^{2} \tag{2} 其中Φ(i)\Phi(i)表示通过MILD算法找到的最相似的五个关键帧。通过FastGO来加速高斯牛顿法最小化(2)(2)的过程。

TSDF建图

有效体素块选择

首先通过hash表,找到在相机视野中的体素块,分层检查体素块的有效性。通过首先检查体素块的八个端点的方式,来加速有效体素块的选取。

基于关键帧的优化

将有效体素块存储在关键帧中,方便进行关键帧的去除和重组。同时改进了颜色的存储来加速优化。

Mesh创建

创建多边形

在加入了新的关键帧之后,用包含Mesh的体素的最大tsdfz值作为阈值,超过这个阈值的体素会被忽略。文章认为Mesh顶点一定在边缘上,只需要在边缘上计算权重就可以确定顶点的位置。

法线计算

法线通过如下方式计算: n=[δxδyδz]=[si+1,j,ksi1,j,ksi,j+1,ksi,j1,ksi,j,k+1si,j,k1](3)\mathbf{n}=\left[\begin{array}{l} \delta_{x} \\ \delta_{y} \\ \delta_{z} \end{array}\right]=\left[\begin{array}{l} s_{i+1, j, k}-s_{i-1, j, k} \\ s_{i, j+1, k}-s_{i, j-1, k} \\ s_{i, j, k+1}-s_{i, j, k-1} \end{array}\right] \tag{3} i,j,ki,j,k是最近的体素,这些体素在Mesh生成时已由算法确定。同时本文维护体素块的相邻体素块地址,降低体素块周围的Mesh生成时的计算量。

地图重组

在当前的地图选择策略下,每个关键帧对应的非关键帧最多为十个。