其他分享
首页 > 其他分享> > dso后端

dso后端

作者:互联网

3.2 FullSystem::makeNonKeyFrame

非关键帧处理,更新窗口中关键帧immaturePoints的逆深度

3.2.1 traceNewCoarse(fh)

遍历所有活动帧(关键帧frameHessians!!!)中,对于主导帧中的未成熟点,在极线上追踪这些未成熟点(调用ImmaturePoint::traceOn)

3.2.1.1 ImmaturePoint::traceOn

先进行极线搜索,搜索到一个较好的位置,然后使用高斯牛顿优化,最后更新idepth_min\idepth_max,ImmaturePoint没有确切的idepth

1、确定极线范围
 将未成熟的点根据相对位姿和之前的逆深度范围idepth_min、idepth_max投影到当前帧上得到[uMin, vMin], [uMax, vMax],确定极线方向,搜索步长step

2、离散搜索

按照8点进行搜索,找到光度误差最小的点,作为一个比较好的值

3、最小误差优化对步长进行高斯牛顿优化

进行高斯牛顿优化,在最小误差位置,优化变量为步长,然后对投影位置进行更新

4、更新idepth_min\idepth_max

3.3、FullSystem::makeKeyFrame
关键帧处理,包括如下步骤:

1、同非关键帧一样对前面关键帧的未成熟点对逆深度的范围进行更新FullSystem::traceNewCoarse

2、标记后面需要边缘化的帧,边缘化决策FullSystem::flagFramesForMarginalization

3、将当前帧加入到滑动窗口(active frames)中,并计算该窗口中其它帧与当前帧的一些参数,相对光度、距离setPrecalcValues()

4、对于窗口旧帧中成熟点,可以在除了主导帧之外的任意一帧进行投影,形成一残差项,记录在PointHessian::residuals中

5、激活窗口中之前所有符合条件的未成熟点,选出待激活点,进行高斯牛顿优化并激活activatePointsMT()

6、利用高斯牛顿法对滑动窗口中所有变量进行优化optimize

7、去除外点removeOutliers

8、边缘化点;先标志边缘化的点flagPointsForRemoval(),再边缘化不需要的点,变为先验信息ef->marginalizePointsF

9、在新关键帧中提取未成熟点makeNewTraces

10、边缘化不需要的帧marginalizeFrame

3.3.1、FullSystem::flagFramesForMarginalization

边缘化策略1:成熟点与未成熟点数量比例小于阈值5% 或者 和当前帧的相对光度光度较大;

边缘化策略2:如果通过前面的策略,数量仍超阈值,则从全部帧中找出除最近两帧外(年龄)离当前帧最远的一帧(距离)

3.3.2、FullSystem::activatePointsMT

遍历最新关键帧除外的活跃帧,遍历帧中的未成熟点,激活条件为极线长度<8,次最小误差比最小误差>3;

将逆深度设为最大最小的平均,投影到当前帧,考虑重投影点在距离图上的值,若该值足够大,可认为该点附近没有成熟点,将其加入待优化序列toOptimize;

对待优化未成熟点优化(逆深度)并激活为成熟点activatePointsMT_Reductor(转到FullSystem::optimizeImmaturePoint:)

 

标签:关键帧,后端,边缘化,FullSystem,dso,未成熟,idepth,优化
来源: https://blog.csdn.net/a1059682127/article/details/100146724