droid-SLAM 简介
droid-SLAM,DORID(Differential Recurrent Optimized-Inspired Design)实现了端到端可微的SLAM系统,于21年发表在Advances in neural information processing systems,仅使用仿真数据集Tartan Air训练就达到了SOTA精度,同时说明算法的泛化性能很强。
运行速度及硬件要求:
根据论文,使用两台3090,一台用于前端,一台用于后端,将图像降采样并适当降低帧率,可以在Euroc、TUM-RGBD数据集上实时推理,如果仅适用前端,则可以在一台1080Ti上跑,但需注意内存可能不足。
流程及原理:
通过在光流估计模块(RAFT)后添加可微的DBA(Dense Bundle Adjusr)模块,实现了端到端可微的SLAM系统。在DBA模块通过RAFT的光流估计优化图像序列状态(包括位置姿态和深度估计),并根据现有图像序列的状态重新计算光流,再将新计算的光流传入RAFT中更新纠正,通过多次迭代更新,光流趋于真值,通过光流迭代更新的图像序列状态也得到高精度解算。
光流估计网络的loss使用了位姿和光流,通过DBA模块计算得到以上两个loss,即DBA模块也参与了后向传播(back propogation)过程,使得网络参数权重朝着使DBA模块残差降低的方向学习。在深度学习网络中融入了几何约束,实现了传统算法与深度学习算法的结合。
在论文的Appendix B中也补充说明了如果在训练过程中没有包含DBA模块,也即直接拼接RAFT和DBA,结果会不稳定并产生较大误差。
代码结构:
目前只看完了推理部分。训练部分大同小异。
主要结构:
depth_video: 存储视频序列各帧的状态,包括位姿、深度、内参等。同时包含了帧间距离计算以及BA函数,方便因子图时调用。
factor_graph: 根据radius(索引较近的边被直接连接)、nms(索引较近的边被抑制)、distance(低于该距离可以形成连接边)
前端:仅光流差异较大(超过filter_thresh)的帧会被传入前端。分为更新和初始化,初始化,积累够一定光流差异较大(超过filter_thresh)的帧数后(超过warmup阈值),进行初始化,进入更新函数调用。在更新并初步迭代后,若frame_distance较低,则删除该帧,继续跟踪直到距离大于keyframe_distance阈值。
后端:类似于前端的更新,因子图连接边数更多。
坐标系定义
原始tartanAir使用NED坐标系,即Z轴指向为向下,而相机一般为水平拍摄,不适用于相机的Z轴指向为前\后,因此将坐标系修改为如下。
参考:Question about the pose parsing in TartanAir dataset · Issue #14 · princeton-vl/DROID-SLAM · GitHub
X = right / left
Y = up / down
Z = forward / backward
This is the typical format used by most datasets I've encountered like ETH3D and TUM-RGBD.
The main reason for this conversion is that this is the format that I'm most comfortable working with. Also leads to simpler equations for projecting points between images.
回环检测原理
在后端部分通过光流计算图像之间的相似度构建边,如果图像较为相似则会被加入到因子图中。