DSO算法初探

笔者出于基于特征点的SLAM无法构建出让人看得懂的点云地图转而研究基于直接法的SLAM。

DSO(Direct Sparse Odometry)是慕尼黑工业大学Engel于2016年发布在arXiv上的一种基于直接法,构建稀疏点云地图的视觉里程计。

采用direct和sparse相结合的原因:

  1. 直接法中并不要求点特征需要识别它自己,从而可以允许更精细的几何表示。
  2. 可以对所有像素点进行均匀采样,构建更完善的模型,在少纹理特征区域更具鲁棒性。
  3. 增加几何先验信息的缺点是引入了几何参数之间的关联,造成Hessian矩阵不稀疏,如下图所示。
  4. 当前得到的先验信息复杂度有限,尽管局部更精确,视觉效果更好,但是作者发现先验信息会引入一个bias,降低系统在长时间、大尺度工作时的精度。

与其他直接法的不同:

  • 将光度模型、集合模型结合起来,对相机内参、相机姿态、像素点的深度等参数做联合估计
  • 由于引入了光度模型,算法忽略了其他直接法采用的对图像进行平滑的预处理,而是将相机看做一个传感器,对图像像素进行均匀采样,进行计算。
  • 提出的模型集成了完整的光度校准,考虑了曝光时间、透镜渐晕和非线性相应函数。
  • 通过实验验证,该算法在跟踪精度和鲁棒性方面性能超过了state-of-the-art的算法水平。

模型:

直接法对图像成像的过程进行了全面的建模,包含几何模型、光度模型。注意光度模型在直接法中很重要,直接法直接利用像素上的光强信息进行运算。而特征点法由于对光强改变有很好的鲁棒性,所以光度模型对基于特征点的SLAM系统用处不大。

几何相机标定(径向畸变在预处理时被矫正):

投影函数: ; 

反投影函数: 

光度相机标定:

非线性相应函数:

透镜衰减:

辐射度(irradiance):   

曝光时间:t

光度模型: 

光度校正:


光度误差:

定义参考帧  中的点  被帧  所观察到,其光度误差为(曝光时间未知):


其中, 是SSD算法中使用的像素集,对应的像素块如

 表示Huber norm,是为了防止误差能量函数随光度误差增长过快:


 表示图像帧之间的点的投影,公式中表示帧 i 中像素点对应的空间点P在帧 j 上的投影:

 

图像帧之间的转换关系如下:

  

作者有意识地将图像中梯度大的像素点对应的权值缩小。笔者的理解是作者希望最终的能量函数能够反映大多数像素点的光度误差,而不是个别梯度大的像素点的误差。

为了使算法可应用于曝光时间未知的图像序列,作者增加了仿射光度公式  , 笔者认为 b 类似于图像帧的基础亮度, 表示由外部光线造成的亮度差,系数设计为指数形式是为了保证系数永远为正,同时避免乘法(比如指数增加)漂移引发的数值问题(...暂时不懂...)。 作用类似与将光度归一化操作。误差函数整体仍是两帧对应点之间的加权光度误差。由公式可知, 取决于 a. 点的逆深度 ; b. 相机内参矩阵 ; c. 图像帧的姿态 ; d. 亮度传递函数参数 

在所有图像帧和点中对应的光度误差:


滑动窗口法优化:

使用  表示所有待优化的变量,包括相机姿态、仿射亮度参数、逆深度、相机内参。如文献Keyframe-based visual-inertial odometry using nonlinear optimization 所述,应当使用First-Estimate Jacobians进行参数迭代计算。DSO中的滑动窗口优化可以参考白巧克力亦唯心的文章DSO中的Windowed Optimization

Gauss-Newton优化:

非线性优化方法Gauss-Newton法的基本公示推导可参考博客。DSO中对Jacobian矩阵进行了加权处理,即


由于DSO对像素点采用了像素块的表达方式,每个点对应有8个光度残差。

第k个点对应的残差:


其中,   

Jacobian矩阵 :     分别对应图像雅各比、几何雅各比、光度雅各比。

DSO采用GN法迭代6次进行优化,是因为初始值选的很好的关系(如何选初始值?)。

注意:在计算Jacobian时,应当使用“First Estimate Jacobians”。

Marginalization会marg掉可能影响H矩阵稀疏性的残差项。以保证Hessian矩阵的稀疏性,保证矩阵维数维持在合理范围内。具体过程如下:

表示依赖于被marg量的残差项对应的能量函数:


利用Schur complement可以marg想消去的量,具体可以参考博客。marg消去的量的信息会作为先验信息加入未marg的量当中,会改变保留项的概率分布,如STATE ESTIMATION FOR ROBOTICS P18对应的内容。


视觉里程计前端:

整体思路同ORBSLAM很像,并没有太大的不同。

  1. 决定使用哪些点、图像帧,以及点和图像帧之间的关系。
  2. 提供初始值。

滑动窗口内包含7帧关键帧,帧1为最新的关键帧,帧7为最旧的关键帧。关键帧marg的策略如下:

  1. 始终保持最新的两帧。
  2. 若旧关键帧中的点不足5%为新关键帧观察到,则旧关键帧被marg。
  3. 若满足保留条件的关键帧多于7, 对除了最新两帧的关键帧计算"distance score",消去得分高的关键帧以保持所有关键帧在三维空间中有个较好的分布。

distance score(是帧i到帧1的几何距离; 是小常量):

 

备用点的选取:

直接法选取的点较特征点法有所不同,直接法允许在所有的可得数据中进行采样,包括弱纹理区域及重复区域。为了满足实时性的要求,DSO仅优化2000个地图点及7个关键帧,又出于备用点需足够的角度,在每一关键帧中选择2000个点作为备用。



猜你喜欢

转载自blog.csdn.net/weixin_38039051/article/details/80697340
DSO