DSO源码解析学习笔记(滑窗优化)

选择要边缘化掉的帧

在这里插入图片描述
对于关键帧的边缘化策略

  1. 活跃点只剩下5%的;
  2. 和最新关键帧曝光变化大于0.7;
  3. 距离最远的关键帧

遍历关键帧
通过保留的点和边缘化点的比例,以及光度变化比例判断是否要被边缘化。
DSO源码解析学习笔记(滑窗优化)_第1张图片如果剩下的关键帧依然大于设定窗口的最大值,利用帧间距离(保证良好的空间结构)继续筛选marg的帧。
DSO源码解析学习笔记(滑窗优化)_第2张图片

加入到关键帧序列

DSO源码解析学习笔记(滑窗优化)_第3张图片setPrecalcValues()
DSO源码解析学习笔记(滑窗优化)_第4张图片

构建之前关键帧与当前帧fh的残差(旧的)

DSO源码解析学习笔记(滑窗优化)_第5张图片

激活所有关键帧上的部分未成熟点(构造新的残差)

在这里插入图片描述激活一些具备条件的imagepoint,因为重新插入关键帧和点,因此需要重新计算一下ID号,方面后面计算正规方程。

对滑窗内的关键帧进行优化

DSO源码解析学习笔记(滑窗优化)_第6张图片optimize()
1.判断迭代次数
在这里插入图片描述2.判断两帧之间点的残差,是否线性化,每次先验化完成之后,边缘化的点以及被抛弃,因此存下的都是未线性化的点,都会加入到activeResiduals
DSO源码解析学习笔记(滑窗优化)_第7张图片3.线性化、计算能量函数
DSO源码解析学习笔记(滑窗优化)_第8张图片此时传入linearizeAll的参数为false,若为true,会把状态进行更新,并挑选出一些不好的状态,残差比较大的点添加到remove中,但是此时为第一次线性化,并没有进行优化,所以没有剔除的过程。
DSO源码解析学习笔记(滑窗优化)_第9张图片
linearizeAll() ==> linearizeAll_Reductor() ==> linearize()
主要函数linearize对不同的状态进行求导(位姿、光度参数、内参、逆深度)
4.迭代求解(类似高斯牛顿)
DSO源码解析学习笔记(滑窗优化)_第10张图片4.更新之后,重新线性化一次,此时参数仍是false,优化并未完成。
DSO源码解析学习笔记(滑窗优化)_第11张图片
5.根据先验化完成之后的能量是否下降,判断是否接受这次更新,如果接受apply,不接受则加载之前备份的状态,继续进行线性化,以备下一次求解。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200411205813432.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjY2MDY1,size_16,color_FFFFFF,t_70

6.把最新帧的位姿设为线性化点
DSO源码解析学习笔记(滑窗优化)_第12张图片优化完成之后,此时linearizeAll参数为true。
7.把优化的结果, 给每个帧的shell, 注意这里其他帧的线性点是不更新的
DSO源码解析学习笔记(滑窗优化)_第13张图片

去除外点, 把最新帧设置为参考帧

DSO源码解析学习笔记(滑窗优化)_第14张图片

标记删除和边缘化的点, 并删除&边缘化

DSO源码解析学习笔记(滑窗优化)_第15张图片flagPointsForRemoval()标记要移除点的状态, 边缘化or丢掉
DSO源码解析学习笔记(滑窗优化)_第16张图片
DSO源码解析学习笔记(滑窗优化)_第17张图片

生成新的点

DSO源码解析学习笔记(滑窗优化)_第18张图片

边缘化掉关键帧

DSO源码解析学习笔记(滑窗优化)_第19张图片marginalizeFrame()把边缘化的帧挪到最右边, 最下边。并计算舒尔补。更新编号。

你可能感兴趣的:(SLAM)