DSO属于稀疏直接法,它是视觉里程计,不包括地图复用和回环检测。本篇文章重点梳理它的代码的文件结构和工作流程。在网上查资料的时候,高翔博士的解读清晰明了,提供了很大的帮助,本系列文章也会从其中借鉴部分内容,所以在这里给出他的文章连接

我们先看DSO的整体框架,这张图来自高翔博士的文章

可以看出,代码共包括四个主要部分:

1)src/FullSystem:系统与各算法

2)src/OptimizationBackend:后端优化位于

3)src/utils:去畸变等一些零散功能

4)src/IOWrapper:数据集读写和可视化UI代码

其最核心的数据结构就是FrameHessian以及它所包含的各类Point,FrameHessian具体包含的内容如下:

1)PointHessian:所有活跃点的信息。所谓活跃点,是指它们在相机的视野中,其残差项仍在参与优化部分的计算

2)pointHessiansMarginalized:已经边缘化的地图点

3)pointHessiansOut:判断为外点的地图点

4)immaturePoints:未成熟的地图点

这些数据结构,贯穿于系统的整个工作流程中,具体流程是:

1)工作过程中,系统会维护5到7个关键帧组成的滑动窗口,每个关键帧对应一个FrameHessian

2)新来一帧图像时,会产生新的地图点,但此时地图点深度是未知的,它就成为immaturePoints(未成熟的地图点),随着后面接收到的图像越来越多,地图点会不断被观测,如果最终收敛,它就会变成已知准确深度的地图点,即PointHessian(活跃点)

3)为了构建优化问题,每个关键帧中的PointHessian可以往其他帧投影,投影会形成残差项,放在PointHessian::residuals中,所有残差项相加即构成损失函数,可以进行优化求解

4)如果由于遮挡等导致PointHessian无法完成投影,那么他就属于外点,即PointHessiansOut(判断为外点的地图点)

5)随着系统的运行,滑动窗口需要不断添加新的帧,移除老的帧,在移除老的帧的时候需要进行边缘化,即把删掉的关键帧中的PointHessian转成先验的地图点,即pointHessiansMarginalized(已经边缘化的地图点)

6)后端优化部分和前段具有相同的数据结构,通过互相持有对方指针和前端通信