本文已参与「新人创作礼」活动,一起开启掘金创作之路。
-
初始化完成之后,进行跟踪
-
使用函数 trackNewCoarse(fh)进行跟踪,传入参数FrameHessian相当于Frame,得到残差和光流信息tres
-
接下来判断是否插入关键帧,第一种策略是根据时间间隔,第二种是根据光流信息(平移、旋转、残差变化大),然后通过deliverTrackedFrame(fh, needToMakeKF)函发布关键帧。
-
deliverTrackedFrame函数通过参数needToMakeKF判断是否插入关键帧
若不插入该帧,则把该帧设置成非关键帧,把此帧信息用于更新深度为收敛的点,然后删除该帧。
无论是否插入关键帧,都调用traceNewCoarse函数更新深度为收敛的点,然后进入滑窗优化部分。
选择要边缘化掉的帧
对于关键帧的边缘化策略
- 活跃点只剩下5%的;
- 和最新关键帧曝光变化大于0.7;
- 距离最远的关键帧
遍历关键帧
通过保留的点和边缘化点的比例,以及光度变化比例判断是否要被边缘化。
如果剩下的关键帧依然大于设定窗口的最大值,利用帧间距离(保证良好的空间结构)继续筛选marg的帧。
加入到关键帧序列
setPrecalcValues()
构建之前关键帧与当前帧fh的残差(旧的)
激活所有关键帧上的部分未成熟点(构造新的残差)
激活一些具备条件的imagepoint,因为重新插入关键帧和点,因此需要重新计算一下ID号,方面后面计算正规方程。
对滑窗内的关键帧进行优化
optimize()
1.判断迭代次数
2.判断两帧之间点的残差,是否线性化,每次先验化完成之后,边缘化的点以及被抛弃,因此存下的都是未线性化的点,都会加入到activeResiduals
3.线性化、计算能量函数
此时传入linearizeAll的参数为false,若为true,会把状态进行更新,并挑选出一些不好的状态,残差比较大的点添加到remove中,但是此时为第一次线性化,并没有进行优化,所以没有剔除的过程。
linearizeAll() ==> linearizeAll_Reductor() ==> linearize()
主要函数linearize对不同的状态进行求导(位姿、光度参数、内参、逆深度)
4.迭代求解(类似高斯牛顿)
4.更新之后,重新线性化一次,此时参数仍是false,优化并未完成。
5.根据先验化完成之后的能量是否下降,判断是否接受这次更新,如果接受apply,不接受则加载之前备份的状态,继续进行线性化,以备下一次求解。
标记要移除点的状态, 边缘化or丢掉
生成新的点
边缘化掉关键帧
marginalizeFrame()把边缘化的帧挪到最右边, 最下边。并计算舒尔补。更新编号。