slam学习 - 基本VO代码学习

本打算学习 orb -slam3 源码,但还是先把《slam 14》上的代码看完再说,至少把整个流程走一遍。

相关参考

https://blog.csdn.net/weixin_44684139/article/details/105305564
https://blog.csdn.net/qq_35590091/article/details/97111744

代码需求分析

按照书上的内容,把代码分为一下几个类别

  1. Camera类别【功能,工具人】
  2. frame类别【主要基本对象,机器人的相关东西】
  3. MapPoint类【主要被观测对象,现实世界的点】
  4. Map类【领导,上面的两个太多了,人员优化一下】
  5. VisualOdometry 类【公司或者说某个具体项目需求,可以理解为 main 函数】

在这里插入图片描述

代码流程

1. 两步前端

首先要知道他的目的是:一共有5步,求这5步拍摄的位置和方向(也就是求每一步的变换矩阵)。
方法:只依据当前和前一帧的信息计算变换矩阵。
步骤:(不包括异常处理等步骤)

步骤函数
提取关键点extractKeyPoints
特征匹配featureMatching
计算位姿poseEstimationPnP
得出第二针图像中某些点的3D位置,为下次pnp准备setRef3DPoints
将第二针插入map的数组中addkeyframe
2. 局部地图前端

大概的变换只在上述第四步: 以前是和前辈比较,现在是和人才库(局部地图)比较。
变化的目的是:维护一个局部地图。(这个版本好像没有全局地图的概念)
那显而易见,如果想要维护局部地图那就必须要有:

  1. 增加地图点
  2. 删除地图点
  3. 【?不知道slam14讲中0.4版本的代码里面有没优化地图点的】

删除比较容易,如何添加地图点呢?这个回答不错:

optimizeMap()这个函数实现了添加新点(嵌套着addMapPoints())。向地图中增加关键点的机制是:当前帧的关键点一旦和地图点匹配上了,那么就无视他。没有匹配上的关键点需要映射到世界坐标系中,增加局部地图点的规模。具体看函数:void Map_VisualOdometry::addMapPoints()

问题1 但这里什么叫匹配上了?什么叫没有匹配上呢?其实就是特征匹配,以前是两张图匹配,现在是 图-地图 模式。匹配好的点放在 match_3dpts_,match_2dkp_index_。具体加入三维地图点的机制:

  1. 先 图 - 地图 的特征点进行匹配(100个配对点 - > 阈值法筛选80个)
  2. 如果没有匹配上(可能是orb特征差距过大),但毕竟也是有深度的点,直接加入地图中。(适用于快速移动的时候)
  3. 这也是 optimizemap的作用:删除看不见的、边缘的,增加新的点

问题2 这个 addkeyframe 关键帧是指什么?即只要旋转或者平移超过一定距离就可以被认为是关键。

问题3 既然局部地图都有了,关键帧用来做什么的?这个时候又没有回环检测!这个我也没看到有什么大用处…

总结

在这里插入图片描述
学习这个主要是为了orbslam的学习铺垫,不然看天书了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值