这一篇文章的侧重点在:自己在编代码实践过程中,对框架和理论知识的感悟和理解。(用于查缺补漏,可跳过此节)
下文分析的代码为project 0.2
,两两帧间的视觉里程计。
- 程序从
run_vo.cpp
开始执行,首先将所有待处理RGB
图片和depth
图片信息准备好,然后进入一个for
循环,不断执行,直到所有图像都被处理完成。 - 在该
for
循环中,最重要的一句代码是调用对象vo
(其本身为VisualOdometry
类型)的一个成员函数addFrame
,其功能是,先将第i
帧图片装入Frame
类,然后结合上一帧i-1
图像(curr_
与ref_
),以估计位姿。 - 在该
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
0.4和0.3版本的差别较大,尤其是两种VO的工作原理。
- 程序同样从
run_vo.cpp
开始执行,首先将所有待处理RGB
图片和depth
图片信息准备好,然后进入一个for
循环,不断执行,直到所有图像都被处理完成。 - 在该
for
循环中,最重要的一句代码是调用对象vo
(其本身为VisualOdometry
类型)的一个成员函数addFrame
。但值得注意的是,该函数实现位姿估计是通过当前帧与地图之间的特征匹配关系,直接计算了Tcw
。 - 在该
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
加入到关键帧。