系统结构

项目地址:http://www.luvision.net/FlashFusion/ (暂时还没有代码) 系统结构如上图所示,系统分为三个线程:1、跟踪线程。2、优化线程。3、Mesh生成线程。通过MILD闭环检测器来根据ORB特征点发现闭环。
- 定位:如果当前帧和对应关键帧的特征平均视差大于阈值,当前帧被选为关键帧。在全局优化时,只优化关键帧的位姿,非关键帧的位姿随关键帧一起被优化。
- 重建:体素块包含一定数量的体素,体素块使用动态Hash进行存储。TSDF会进行逐帧更新,而Mesh的更新只在新的关键帧进行。
相机定位
当前帧被选为关键帧之后,最小化到之前的所有关键帧的重投影误差之和。第i帧和第j帧之间的重投影误差为: Ei,j(Ti,j∣Ti,j∈SE3)=k=0∑∣Ci,j∣−1∥∥pik−Ti,jpjk∥∥2(1) 其中Ti,j是关键帧之间的坐标变换 ,(pik,pjk)是一对匹配的特征。全局的误差函数如下:E(ξ)=i=0∑N−1j∈Φ(i)∑Ei,j=i=0∑N−1j∈Φ(i)∑k=0∑∣Ci,j∣−1∥∥pik−Ti,jpjk∥∥2(2) 其中Φ(i)表示通过MILD算法找到的最相似的五个关键帧。通过FastGO来加速高斯牛顿法最小化(2)的过程。
TSDF建图
有效体素块选择
首先通过hash表,找到在相机视野中的体素块,分层检查体素块的有效性。通过首先检查体素块的八个端点的方式,来加速有效体素块的选取。
基于关键帧的优化
将有效体素块存储在关键帧中,方便进行关键帧的去除和重组。同时改进了颜色的存储来加速优化。
Mesh创建
创建多边形
在加入了新的关键帧之后,用包含Mesh的体素的最大tsdfz值作为阈值,超过这个阈值的体素会被忽略。文章认为Mesh顶点一定在边缘上,只需要在边缘上计算权重就可以确定顶点的位置。
法线计算
法线通过如下方式计算: n=⎣⎡δxδyδz⎦⎤=⎣⎡si+1,j,k−si−1,j,ksi,j+1,k−si,j−1,ksi,j,k+1−si,j,k−1⎦⎤(3) i,j,k是最近的体素,这些体素在Mesh生成时已由算法确定。同时本文维护体素块的相邻体素块地址,降低体素块周围的Mesh生成时的计算量。
地图重组
在当前的地图选择策略下,每个关键帧对应的非关键帧最多为十个。