ORBSLAM2总结系列——初始化
该系列出现,是因为之前都是没成系统的总结相关slam系统,现在对很多工具,理论都有了相应熟悉了解后,希望日后可以回读该系列,即可快速记起该slam系统的细节。暂时来说比较零散,后面会不断迭代紧凑,并可能与其他经典联动或触类旁通,相互学习,最终熟悉了解后,可以自己写一个slam系统。
-
理论知识点
-
初始化流程
-
单目 Tracking::MonocularInitialization()
- 特征点大于100的帧才开始初始化(初始化初始化器)
-
ORBmatcher::SearchForInitialization()
- 匹配大于等于100才继续后续步骤
- 只寻找第0层图像,查找帧1特征点附近对应帧2的特征点
- 遍历上述所有的帧2特征点,找出最优特征描述子和次优特征描述子(汉明距离)
- 需要最优特征描述子与次优特征描述子,汉明距离的差别达到一定阈值,才把最优特征描述子当做匹配点
- 若于整张图片需要去除部分旋转方向不是很统一的特征点,则对所有特征点进行方向直方图分类,最多保留三组主要旋转方向,角度区间为30°(区分阈值大于一定值,则把数量低得取消)
-
Initializer::Initialize()
- 该部分涉及的基础部分算法需要好好复习一下。
- 生成RANSAC的点索引
- 分别求RANSAC中最好的H与F矩阵
- H矩阵:归一化,求H矩阵,根据评分(大概是重投影误差与阈值的关系,后续研究一下)得出最好的H矩阵
- F矩阵:与上类同
- RH = SH/(SH+SF),根据此打分选择对应的H与F
- 从对应的变换矩阵中解出R与t,并三角化出三维点与可否三角化的标志
-
Tracking::CreateInitialMapMonocular()
-
添加联系
- 把参考帧与当前帧对应生成为关键帧,并计算其词袋向量
- 把关键帧加入地图
- 创建地图点,关键帧关联地图点,地图点关联关键帧(关联共识关系)
- 计算该地图点的最优描述子(取中值中最优),并计算该地图点的平均观测方向(所有共视关键帧关于该地图点方向平均)和观测范围(根据参考帧的尺度对参考帧上该地图点距离进行最大最小范围确定)
- 给普通当前帧增加对应的地图点与外点标志
- 把地图点加入地图
- 上述就是主要是三个主体互相建立关系,关键帧,地图,地图点,附带一个普通帧。一开始建立关键帧与地图彼此关系,后面建立地图点与别的关系
-
更新边,全局优化
- KeyFrame::UpdateConnections()
- KFcounter存放与该关键帧有共视关系的其他关键帧,与对应权重(即看到同一个地图点次数)。
- 找出最大权重关键帧,把权重大于15的关键帧加入vPairs,并把建立另外的共视帧与该帧的联系(共视帧 -> 该帧);若果没有大于阈值的关键帧,则把最大权重帧进行同等操作
- 该帧自身,把共视的帧存入mConnectedKeyFrameWeights(好像没有15阈值限制),把阈值限制的共视帧根据权重顺序逆序存入mvpOrderedConnectedKeyFrames,对应权重存入mvOrderedWeights
- 若是第一次建立连接,则把权重最大的关键帧设为父关键帧(权重最大关键帧 < - >该关键帧,父子关系),把mbFirstConnection置为false
- Optimizer::GlobalBundleAdjustemnt()
- 单目仅考虑单帧投影的约束
- 双目与RGBD除了单帧投影的约束,还考虑mbf的约束
- KeyFrame::UpdateConnections()
-
尺度归一化,初始化两帧的t与地图点(以当前关键帧的所有地图点中值距离来归一)
-
把关键帧加入局部地图线程,更新状态(当前帧的位姿、参考关键帧,,更新上一关键帧id与本体,更新局部地图关键帧、地图点、参考帧)
-
-
-