?|高翔博士SLAM十四讲(第四篇)

这一篇文章的侧重点在:自己在编代码实践过程中,对框架和理论知识的感悟和理解。(用于查缺补漏,可跳过此节)
下文分析的代码为project 0.2,两两帧间的视觉里程计。

  1. 程序从run_vo.cpp开始执行,首先将所有待处理RGB图片和depth图片信息准备好,然后进入一个for循环,不断执行,直到所有图像都被处理完成。
  2. 在该for循环中,最重要的一句代码是调用对象vo(其本身为VisualOdometry类型)的一个成员函数addFrame,其功能是,先将第i帧图片装入Frame类,然后结合上一帧i-1图像(curr_ref_),以估计位姿。
  3. 在该addFrame成员函数中,最主要的几步是:3.1提取ORB特征点的关键点(Oriented FAST);3.2计算与关键点对应的描述子(Rotated BRIEF);3.3特征点匹配(暴力匹配、汉明距离);3.4位姿估计(Perspective-n-Point,3D-2D )。最后,如果判定是一个好的估计,使用另一个成员函数addKeyFrame加入到关键帧。
整个简单的两两帧间的视觉里程计至此完成。
ch 9. project 0.3 0.3和0.2版本的差别不大,构建的框架run_vo.cpp保持原状。
不同之处在于addFrame成员函数(之前介绍的第3步)中的3.4位姿估计poseEstimationPnP(),我们以之前得到的 RANSAC PnP位姿估计结果作为初值,再调用 g2o 进行优化。得到更为精确的位姿估计结果。
ch 9. project 0.4 【?|高翔博士SLAM十四讲(第四篇)】0.4和0.3版本的差别较大,尤其是两种VO的工作原理。
  1. 程序同样从run_vo.cpp开始执行,首先将所有待处理RGB图片和depth图片信息准备好,然后进入一个for循环,不断执行,直到所有图像都被处理完成。
  2. 在该for循环中,最重要的一句代码是调用对象vo(其本身为VisualOdometry类型)的一个成员函数addFrame。但值得注意的是,该函数实现位姿估计是通过当前帧与地图之间的特征匹配关系,直接计算了Tcw
  3. 在该addFrame成员函数中,最主要的几步是:3.1提取ORB特征点的关键点(Oriented FAST);3.2计算与关键点对应的描述子(Rotated BRIEF);< 3.3>特征点匹配(这里要注意,之前我们是提取ref_curr_的特征点,进行这些特征点的匹配;此时,我们所做的匹配主要是在以下两种点集之间:从curr_提取的特征点 以及 从地图map中挑选的点);3.4位姿估计(Perspective-n-Point,3D-2D )。最后,如果判定是一个好的估计,首先使用成员函数optimizeMap()对地图进行优化,然后再使用另一个成员函数addKeyFrame加入到关键帧。

    推荐阅读