DVO-SLAM的跟踪通过将当前帧与关键帧进行帧间匹配进而确定当前帧对应的相机位姿来实现,本文将从帧间匹配和关键帧选取这两部分解释DVO-SLAM跟踪的具体操作流程。
帧间匹配即计算两帧图像间的相机运动变换矩阵,DVO-SLAM中用并行计算的方式同时计算当前帧与前一帧及关键帧间的运动变换矩阵r_odometry、r_keyframe,相关代码在local_tracker.cpp中。
(1) 选取参考帧中灰度梯度及深度梯度值较明显的点作为参考点,这里的参考帧指当前帧的前一帧和当前帧对应的关键帧。
(2) 理想情况下,存在一个帧间运动变换量,使得参考点的灰度值、深度值与其投射到当前帧中的点的灰度值、深度值差为零。实际应用中,通过最小化残差函数来求帧间运动,DVO-SLAM中使用高斯牛顿法迭代求解这个问题。
(3) 将上一步求到的帧间运动变换矩阵、信息矩阵、似然估计值保存到结果当中,为之后的关键帧选取、闭环检测做准备。
高斯牛顿法求解帧间运动变换的具体流程如下图所示:
(1) 累积迭代增量,作为本次迭代的初始值。
(2) 计算各点的残差。
(3) DVO-SLAM中假设残差服从t分布,因此这里根据t分布计算个残差的权重。
(4) 计算t分布的方差参数。
(5) 计算残差的似然估计。
(6) 求本次迭代增量。
之所以将每帧图片与其关键帧进行匹配进而确定相机位姿,是因为这样一定程度上可以避免相邻帧匹配带来的误差累积。DVO-SLAM中的关键帧选取原则如下:
(1) r_Keyframe的后验概率估计反应了r_Keyframe的可信度,当可信度低于某一阈值时则重选关键帧。
(2) DVO-SLAM使用直接法进行帧间匹配,该方法基于灰度一致假设,所以r_Keyframe和r_odometry的位移不能过大,当位移超过某一阈值则重选关键帧。
(3) ValidConstraints / ValidPixels反应了落在当前帧中的参考点相对于参考点总数的比例,比例越高说明相机的位姿变换越小,越低说明位姿变换越大,当比值低于某一阈值则重选关键帧。