Direct Sparse Odometry(DSO)

  1. 概览:

这是一种利用稀疏直接法进行单目视觉测程的SLAM算法,也是目前(2017)唯一联合优化所有模型参数(相机位姿、内参矩阵、几何参数、逆深度值)的直接法模型,并在优化过程中用滑动窗口对旧的相机位姿以及离开相机视野的点进行边缘化。本算法的优点在于鲁棒性和实时性。

2.直接稀疏法模型:

直接稀疏测程方法主要基于对包含最近帧的滑动窗口内的光度误差(期间利用的是考虑用了光度校准的图像形成模型)进行持续优化。与之前的直接发不同的是,DSO联合优化了所有的相机参数(包含相机内参、相机外参、和逆深度值),并且在窗口内的稀疏BA优化中有效地执行photometric equivalent。在表述过程中,将3D点在参考帧中表述为一个逆深度(一维)。

2.1校准:

在采用DSO模型时首先要对每一帧进行光度矫正:

DSO初探

DSO初探

2.2模型方程:

我们将在目标帧IjDSO初探中观察到的参考帧IiDSO初探中的点p的光度误差定义为在小的像素邻域上的加权SSD(寻找在该点周围以略微扩展的模式排列的八个像素):

DSO初探

其中点的投影方程为:

DSO初探

转移矩阵为:

DSO初探

为了在曝光时间未知的情况下依旧能进行光度误差测量,所以在之前的光度误差函数中引入了一个仿射传递函数:

DSO初探

同时为了使用鲁棒的核函数,DSO同时还引入了梯度依赖加权项ωpDSO初探使具有高梯度的像素降权:

DSO初探

综上,光度误差函数的建立主要依赖于以下变量:(1)点的逆深度dpDSO初探(2)相机内参c(3)所涉及的相机帧位姿Ti,TjDSO初探(4)它们(i,j)的亮度传递函数参数ai,aj,bi,bjDSO初探

所有帧内点的总光度误差为:

DSO初探

DSO的因子图如图所示(注意到点的参数仅有逆深度):

DSO初探

每一个关键帧的状态为8维:六自由度运动位姿加上两个描述光度的参数;每一个地标点状态变量为一维,即该点在host帧里的逆深度。与经典重投影误差的唯一区别在于每个残差对host帧姿态的附加依赖,每个项取决于两个帧而不是仅一个帧。

如果我们已知曝光时间,DSO会增加一个先验值将仿射亮度转移方程拉到零:

DSO初探

如果没有可用的光度校准,我们设置ti=1DSO初探并且λa=λb=0DSO初探.

2.3窗口优化:

DSO在滑动窗口中使用高斯牛顿算法优化整体误差(EphotoDSO初探)。高斯牛顿系统的解算方程为:

DSO初探

以一个残差为例,在优化过程中(同时也在边缘化过程中),残差经常在最近的状态估计中被解算:

DSO初探

其中对x增量的雅可比阵为:

DSO初探

雅可比阵可以被分解为:

DSO初探

JphotoDSO初探:图像雅可比,即图像梯度

JgeoDSO初探:几何雅可比,描述各状态量相对几何量(旋转,平移)的变化率

JIDSO初探: 光度雅可比,描述各个量相对光度参数的变化率

其中的JgeoDSO初探JphotoDSO初探都在x=0时(增量为零,迭代开始时)进行估算,在x的当前值对JIDSO初探进行估算(即随着迭代进行更新),在整数坐标处使用中心差值计算图像的导数,之后对这个导数进行双线性插值。对同一点的所有残差,JgeoDSO初探被假设为相同的值,并且仅在中心像素进行评估。

在一个线性系统中,增量计算为δ=H-1bDSO初探并被加入当前状态:

DSO初探(δ相当于∆xDSO初探

在每一更次新后,DSO更新位姿ζ0DSO初探中的未被边缘化的变量,其中ζ0new←x⨁ζ0DSO初探,并且令x0DSO初探(之后在新的位姿处再次计算xnew←δ+xDSO初探).每当有新的关键帧增加,我们使用六次高斯牛顿法,并在δDSO初探足够小时提前breaking。

边缘化:当需要被处理的变量过多,使用Schur补集通过边缘化去除旧变量。在边缘化帧i时,首先将所有PiDSO初探中的点以及未在最后两帧中被观测到的点进行边缘化,从系统中删除对帧i中可用点的剩余观测。

边缘化流程:令E‘DSO初探表示包含依赖于被边缘化状态变量的所有残差的能量。首先在当前状态估计ζ=x⨁ζoDSO初探处对E‘DSO初探进行高斯牛顿近似:

DSO初探

这是一个关于x的二次方程,我们可以用舒尔补(即高斯消元)来边缘化变量子集(利用舒尔补,用矩阵的一部分去消元另一部分),写成一个线性系统:

DSO初探

其中β代表要被边缘化的变量块α代表要保留的变量块,应用舒尔补产生Hααxα=bα'DSO初探

其中:

DSO初探

DSO初探处的残差能量可以被写为:

DSO初探

3.视觉测程前端:

前端的工作主要有:(1)决定被用到的点和帧,以及点在帧中是否可见(移除外点和遮挡点)(2)用于优化能量方程的新参数的初始化(3)决定点\帧是否被边缘化

3.1帧管理:

始终维持一个最多含有7个关键帧的窗口。对帧的操作主要有三个:(1)相对于参考帧完成新帧的跟踪和初始化(2)选择新帧要被丢弃何时被作为新的关键帧(3)一旦新帧以及相关的点被创建,整体光度误差EphotoDSO初探会被优化,并对帧进行边缘化

初始化帧跟踪:当一个新帧新帧被创建时,所有活动点(窗口内的点)都被投影到帧上,并slightly dilated,并创建一个半稠密深度图。使用传统的两帧直接图像对齐对新帧进行跟踪,用多尺度图像金字塔和恒定运动模型对其进行初始化。如果此帧的RMSE(??)是之前帧的两倍,我们就认为图像对齐失败,并尝试对该帧在不同方向上最多27次不同的小旋转进行初始化来恢复。

创建关键帧:相同于ORB-SLAM,DSO的策略是初始化大量关键帧之后通过边缘化掉冗余帧将关键帧变的稀疏,判断关键帧的三种情况为:(1)视角转变时创建关键帧,主要通过在初始化粗略跟踪阶段测量均方光流(f≔(1ni=1np-p'2)12DSO初探)判断是否转向(2)在导致遮挡和减少遮挡处,这里主要通过没有旋转的平均光流进行计算(ft(1ni=1np-pt'2)12DSO初探),其中ptDSO初探为warped点(即同一个点投影在不同帧中的位置)(3)相机曝光时间变化明显时,这主要通过两帧之间的相对亮度因子来测量:a≔log⁡(eaj-aitjti-1)DSO初探

当一个帧满足ωff+ωftft+ωaa>TKfDSO初探时,即被设置为关键帧

关键帧边缘化:令I1InDSO初探为窗户内的活动帧I1DSO初探最新InDSO初探最旧边缘化策略为:(1)最新两个关键帧一定保留(I1I2DSO初探)(2)在仅有少于5%的点于I1DSO初探中可见的帧被边缘化(3)当多于阈值的帧在活动(在窗口中),边缘化掉sIi=d(i,1)j∈[3,n]{i}(di,1+ϵ)-1DSO初探最大的点,其中d(i,j)为两关键帧I1I2DSO初探间的欧式距离,ϵDSO初探为小常数,这可以使活动关键帧在3D空间中保持良好分布,使更多关键帧接近最近的关键帧。

一个关键帧被边缘化时,首先将将帧内的全部点边缘化掉,之后再用2.3中的方式将帧边缘化掉。

3.2点管理:

DSO对数据进行子采样,以便在在联合优化时达到对数据的实时处理。点管理的目的是确保活动点的数量不超过阈值(Np=2000DSO初探),并且在优化过程中均匀地分布在空间中和活动帧中,主要进行三步操作:(1)在每个关键帧中定义NpDSO初探个候选点(2)候选点在之后的序列帧中被单独跟踪,产生粗略的深度值并用于初始化(3)当有新的点被加入到优化过程中,选择一部分候选点(来自于窗口中的所有帧)加入优化过程(注意到每帧都会选择NpDSO初探个候选点,可以保证有足够多的点可用)

候选点选择:候选点的选择策略旨在使被选择的点(1)在图像中分布均匀(2)相对于它们的周围环境具有足够高的图像梯度幅度.

首先将图像分为32*32个块并获得每个块的区域自适应梯度阈值(g+gthDSO初探, gDSO初探为区域内像素的梯度中位数绝对值,gthDSO初探为全局常数),在每一个区域中选择具有最大梯度且超过自适应梯度阈值的像素点。否则就不在该区域选择像素点。同时为了从没有高梯度点的区域中选择一些具有较弱梯度的一些点,将之前的分区域选择方式再重复两次,并在分割(32*d)*(32*d)个区域后(下一次d的取值依照本帧提取点的数量决定,点多d大,点少d小)选择点。

候选点跟踪:候选点在后续帧中对候选点沿极线进行离散搜索,并计算最小化光度误差。对于每一个最佳匹配计算出一个深度值和一个协方差用于约束后续帧的搜索间隔。本次计算出的深度尽在**点时用于初始化。

候选点**:在一组点被边缘化之后,新的候选点被**并代替被边缘化的点。为了保证点在图像中的稀疏分布,首先将所有的**点投影到当前关键帧中,之后**距已有点距离最大的候选点。

外点以及遮挡探测:在候选点跟踪的极限搜索过程中,首先永久性地丢弃最小化光度误差不够小的点,从而大大减少重复区域中的错误匹配的数量,其次点的观测的光度误差大于阈值的被移除。阈值相对于相应帧中的中值残差不断地被调整(在运动模糊的帧中阈值大,在观测较好的帧中阈值小)。

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-20
  • 2021-12-18
  • 2022-01-25
  • 2022-12-23
  • 2021-10-28
猜你喜欢
  • 2021-10-24
  • 2021-08-26
  • 2022-12-23
  • 2021-06-15
  • 2022-01-20
  • 2021-11-23
  • 2021-09-29
相关资源
相似解决方案