简介
ElasticFusion是一种基于RGB-D相机的实时密集视觉SLAM方法,不同于传统SLAM通过优化相机轨迹来提高位姿估计和重建的精度,该方法是通过不断优化重建的Map来提高精度而没有任何姿态图优化或任何后续步骤,从而构建出基于Surfel模型而不是TSDF模型的房间尺度环境的稠密地图。
Surfel模型
如下图所示。对于每个点存储了:点的位置信息;面片的半径;法向量;颜色信息;点的初始化时间戳;点的更新时间戳。使用Surfel模型可以方便的与OpenGL对接,从而进行模型投影以及点的融合与更新。
算法流程
1)首先将输入的一帧RGB和深度图转换为普通的RGB图像和点云;
2)(若为第一帧则跳过该步)然后进入Tracking部分,一方面,几何位姿估计:将该帧生成的点云与Surfel模型进行ICP配准,另一方面,光度位姿估计:利用直接法将该帧的RGB图与上一帧RGB图(通过OpenGL得到,后面叙述)配准,对ICP和直接法进行联合优化得到当前帧的相机位姿;
3)对当前帧进行回环检测,若存在回环,则根据回环建立的约束优化Deformation Graph变形图,并用优化后的变形图更新Map,若不存在回环,则根据当前帧的相机位姿将当前帧的RGB图像和点云融合到Surfel模型中,融合使用 openGL 的 shading language;
4)再利用OpenGL根据当前帧位姿从模型投影出当前视角下的深度图和RGB图像并判断投影出的RGB图是否加入关键帧;
5)最后输入下一帧并重复上述过程,实现基于RGB-D相机的实时密集视觉SLAM。
Tracking
ICP+直接法
ICP:将当前帧生成的点云与Surfel模型进行ICP配准;
直接法:利用直接法将当前帧的RGB图与上一帧RGB图配准;对ICP和直接法进行联合优化得到当前帧的相机位姿。
Deformation Graph变形图
变形图结构:如下图所示,其由一组Nodes和有向边连接而成。红色的点是从重建好的Surfel中均匀抽样得到的,称为Graph Nodes。黑色的点表示重建好的其他的点。对每一帧都会构造一个新的变形图,这比增量修改现有的变形图的计算量更小。
变形图建立连接:每个Nodes具有一个时间戳,Nodes会按照时间关系而不是空间关系来建立连接。除了Nodes之间有连接关系外,Nodes与Map 中其他点(黑色的点)也具有连接关系,Map中其他点会和Nodes先按照时间关系搜索最近的点,再在最近点周围按照空间关系找最近的Nodes相连接(对于模型中点每个点,在 Graph nodes 中时间最近的节点 c,找到时间上最相近的点后,和 Graph nodes c 前后 α 个节点计算距离,并且选取距离最近的 k 个节点相连接。建立连接后根据和每个 node 之间的距离关系计算更新模型点的权值。)。利用时间顺序建立连接的原因在于按时间比按空间关系建立连接在计算上更高效,但更重要的是防止表面的时间上不相关的区域相互影响(即活动区域和非活动区域)。
变形图优化:每个Nodes有待优化参数(仿射变换参数)GRn和Gtn,然后根据局部回环检测和全局回环检测建立的约束来优化变形图即优化Nodes中的这些参数,再根据Nodes与Map中其他点的连接关系将优化的参数作用于Map中所有的点,从而完成Map在具有回环时的更新。
局部回环检测
首先对于输入的每一帧,根据Tracking算法可以求解出当前帧的位姿,再根据位姿将点云融合;按照时间将重建好的点划分成ACTIVE和INACTIVE,ACTIVE点是最近被相机拍到的,INACTIVE点则是很久没有被拍到的;根据求解得到的位姿,从ACTIVE和INACTIVE分别投影得到两幅点云;配准两幅点云,如果可以配准上,则说明相机回到原来到过的地方了,即存在局部回环;然后由公式建立局部回环约束,将ACTIVE点对齐到INACTIVE点;最后根据约束优化变形图从而更新Map。
全局回环检测
由于相机移动距离较长时轨迹的漂移太大,导致ACTIVE和INACTIVE点投影得到的点云配准不上,这时局部回环检测不起作用,需采用全局回环检测。
全局回环检测用到了Fern编码,每幅图像有m个block编码,每个block有n个fern(n=4,是RGB-D的通道数),fern的值通过计算为0或1,那么图像的码值由m个4位二进制码组成。
输入一帧新的图像,首先计算每个block的编码,在存储有关键帧的block码值列表中进行索引,若该图像和某一关键帧的相同ID的block码值相同,则该图像和该关键帧的相似度加1,对该图像所有的block作上述运算,可得到该图像与所存储的所有关键帧的相似度。
通过相似度判断当前帧是否加入关键帧(和所有存储的关键帧相似度小于一定阈值);或者当前帧是否存在回环(和某一帧关键帧相似度大于一定阈值),若存在回环,则由公式建立全局回环约束,将当前帧点云对齐到回环的关键帧的点云,最后根据约束优化变形图从而更新Map。