本打算学习 orb -slam3 源码,但还是先把《slam 14》上的代码看完再说,至少把整个流程走一遍。
相关参考
https://blog.csdn.net/weixin_44684139/article/details/105305564
https://blog.csdn.net/qq_35590091/article/details/97111744
代码需求分析
按照书上的内容,把代码分为一下几个类别
- Camera类别【功能,工具人】
- frame类别【主要基本对象,机器人的相关东西】
- MapPoint类【主要被观测对象,现实世界的点】
- Map类【领导,上面的两个太多了,人员优化一下】
- VisualOdometry 类【公司或者说某个具体项目需求,可以理解为 main 函数】
代码流程
1. 两步前端
首先要知道他的目的是:一共有5步,求这5步拍摄的位置和方向(也就是求每一步的变换矩阵)。
方法:只依据当前和前一帧的信息计算变换矩阵。
步骤:(不包括异常处理等步骤)
步骤 | 函数 |
---|---|
提取关键点 | extractKeyPoints |
特征匹配 | featureMatching |
计算位姿 | poseEstimationPnP |
得出第二针图像中某些点的3D位置,为下次pnp准备 | setRef3DPoints |
将第二针插入map的数组中 | addkeyframe |
2. 局部地图前端
大概的变换只在上述第四步: 以前是和前辈比较,现在是和人才库(局部地图)比较。
变化的目的是:维护一个局部地图。(这个版本好像没有全局地图的概念)
那显而易见,如果想要维护局部地图那就必须要有:
- 增加地图点
- 删除地图点
- 【?不知道slam14讲中0.4版本的代码里面有没优化地图点的】
删除比较容易,如何添加地图点呢?这个回答不错:
optimizeMap()这个函数实现了添加新点(嵌套着addMapPoints())。向地图中增加关键点的机制是:当前帧的关键点一旦和地图点匹配上了,那么就无视他。没有匹配上的关键点需要映射到世界坐标系中,增加局部地图点的规模。具体看函数:void Map_VisualOdometry::addMapPoints()
问题1 但这里什么叫匹配上了?什么叫没有匹配上呢?其实就是特征匹配,以前是两张图匹配,现在是 图-地图 模式。匹配好的点放在 match_3dpts_,match_2dkp_index_。具体加入三维地图点的机制:
- 先 图 - 地图 的特征点进行匹配(100个配对点 - > 阈值法筛选80个)
- 如果没有匹配上(可能是orb特征差距过大),但毕竟也是有深度的点,直接加入地图中。(适用于快速移动的时候)
- 这也是 optimizemap的作用:删除看不见的、边缘的,增加新的点
问题2 这个 addkeyframe 关键帧是指什么?即只要旋转或者平移超过一定距离就可以被认为是关键。
问题3 既然局部地图都有了,关键帧用来做什么的?这个时候又没有回环检测!这个我也没看到有什么大用处…
总结
学习这个主要是为了orbslam的学习铺垫,不然看天书了。