ORB-SLAM 笔记
来源:互联网 发布:js正则表达式校验邮箱 编辑:程序博客网 时间:2024/05/22 00:44
需要写个综述,又把 ORB-SLAM 复习了一下,做个笔记,不记忘得真快。。
Feature choice
orb 描述子具备旋转不变性,而且匹配比较快。
Tracking 线程
constant velocity motion model 跟踪
如果上一帧相机跟踪成功了,则用 constant velocity motion model 预测当前帧相机的位姿,并且用上一帧图像的地图点在当前帧图像中做 guided search,如果没有足够的匹配点(motion model is clearly violated),再将搜索半径扩大,再重新寻找匹配点,然后用 motion-only BA 得到的匹配点计算位姿。
motion-only BA:
已知匹配的 3D 特征点坐标,和 2D 特征图像坐标,计算当前帧 pose,3D-2D 投影误差构成优化的目标函数,优化的变量只有当前帧 pose。
如果速度为 0,或者刚做了重定位,这时和当前关键帧进行匹配,匹配用 vocabulary tree 的方式,而不是 guided search 的方式,匹配完后也用 motion-only BA 优化。
如果跟踪跟丢了,将当前帧转换成 bag of words,并且在 recognition database 中找 candidates,然后和 candidate 帧特征匹配,用 RANSAC 和 PnP 算法计算位姿,如果能得到足够的匹配点用 motion-only BA 优化位姿,并且根据优化的再用 guided match 寻找更多的匹配点,然后再用 motion-only BA 优化相机的位姿。如果能得到足够的匹配点,跟踪过程继续。
Track local map
如果通过上步可以得到初始的位姿估计,再将地图点投影到当前帧中获取更多的匹配点。投影到当前帧的地图点包括,和当前帧有共视
筛选
相机的位姿最终通过 motion-only BA 优化在上步得到的匹配点得到。
New Keyframe Decision
关键帧插入的越快越好:As there is a mechanism in the local mapping to cull redundant keyframes, we will try to insert keyframes as fast as possible, because that makes the tracking more robust to challenging camera movements, typically rotations.
关键帧插入时必须满足的条件:
1,上次重定位后已经过去 20 帧图像了(ensures a good relocalization and condition)。
2,Local mapping 线程是空闲的,或者从上次关键帧插入开始已经过去 20 帧了。
3,当前帧跟踪至少 50 个特征点(ensure a good tracking)。
4,Current frame tracks less than 90% points than
如果关键帧插入的时候 local mapping busy,这时已经过去 20 帧图像了,这时会发出信号停止掉 local bundle adjustment,以便可以尽快处理的新的关键帧。
local mapping 线程
local mapping 线程处理的是关键帧,关键帧是 local tracking 线程给的。
做 local BA 优化。
对于新的关键帧中未匹配的特征点,和根据 convisibility graph 找到的和新关键帧相连接的关键帧,找新的匹配点。
执行点的剔除保证只保留高质量点,执行关键帧的剔除去掉冗余的特征点。
Keyframe Insertion
更新 convisibility graph(插入新的节点,更新插入节点边的连接),
更新 spanning tree,
计算新关键帧 bags of words。
Recent map points culling
判断新创建的地图点有效的条件:
1) The tracking must find the point in more than the 25% of the frames in which it is predicted to be visible.
2) If more than one keyframe has passed from map point creation, it must be observed from at least three keyframes.
New Map Point Creation
新地图点通过当前处理的关键帧和当前处理的关键帧相连接的关键帧
local Bundle Ajustment
local BA:优化当前关键帧
优化的变量:当前帧的 pose,和当前帧相连的关键帧的 pose,当前帧,和当前帧相连的关键帧的地图点
优化的目标函数是
loop closing 线程
loop candidates detection
首先计算
单目的 SLAM 中,重建的地图在旋转,平移和尺度上都可以有漂移,所以在 close a loop 时,需要计算当前帧和回环帧之间的相似变换。首先计算当前帧和回环帧之间的匹配点,匹配点用 vocabulary tree 搜索,找到的匹配点是 3D-3D 的点,然后用 RANSAC 算法对这这些点计算一个相似变换,对于得到的相似变换如果能有足够的 inliers,则接受回环。
Loop Fusion
回环的地方,地图会被重建多次,所以在 loop fusion 时,需要把回环两端的地图融合在一起,并且回环两端的 convisibility graph 也需要添加新的边。
首先将计算的相似变换作用到当前帧,并且传播到和当前帧连接的关键帧,通过这样做回环两端的地图可以对齐。
然后回环帧,和回环帧相连的关键帧的所有地图点,向当前帧,和当前帧相连接的关键帧投影寻找匹配点,所有的这些匹配点和计算相似变换时的匹配点进行融合,融合会使得回环两端的关键帧建立新的共视点,从而需要 convisibility graph 中更新关键帧之间的边连接。
Essential Graph Optimization
Essential Graph /pose graph Optimization:To effectively close the loop, we perform a pose graph optimization over the Essential Graph,对于单目 SLAM 优化是针对相似变换做的,优化后地图点根据能观测到它的一帧关键帧进行位置的更新。
优化的参数:每个关键帧的 pose,优化参数 pose 是个相似变换,优化完后再作用到关键帧位姿,作用后,关键帧位姿仍然是个欧式变换,优化后也作用到地图点。
优化约束
这里的约束都是位姿约束,位姿约束指帧和帧之间的位姿变换。
约束有:
当前回环两端新建立的边(回环两端地图点融合产生连接回环两端新边)形成的位姿约束。
spanning tree 位姿约束。
每个关键帧的回环约束。
convisibility graph 中权值大于一定阈值的边约束。
Global BA
Global BA:优化地图中所有关键帧的 pose 和所有地图点的坐标。优化的变量包括所有关键帧 pose,所有特征点坐标,优化的约束是所有特征点所有观测的投影误差。
Map points, Keyframes and their Selection
每个 map point 存储的信息
在世界系下特征点的位置。
观测方向(特征点被观测的平均方向,方向指光心到特征点光线的方向)
特征描述子,特征可能被好多帧观测到,which is the associated ORB descriptor whose hamming distance is minimum with respect to all other associated descriptors in the keyframes in which the point is observed.
该特征可以被观测到的最小和最大距离,最小和最大距离根据 orb 特征尺度不变性的上限值计算得到,原文如下:The maximum d max and minimum d min distances at which the point can be observed, according to the scale invariance limits of the ORB features.
每个关键帧存储的信息
世界坐标系到该关键帧相机坐标系的转换矩阵。
相机内参。
该关键帧提取到的所有 ORB 特征,并且这些特征是否和 map point 关联起来的信息。
地图点和关键帧创建时 generous policy
地图点和关键帧在创建的时候要求不严格(generous policy),但是后续会有一个剔除操作,剔除操作负责检测冗余的关键帧,和错误匹配或者不能跟踪的地图点(wrongly matched or not trackable map points)。这样做好处:This permits a flexible map expansion during exploration, which boost tracking robustness under hard conditions (e.g. rotations, fast movements),
Convisibility graph and Essential graph
consistency graph 中节点由关键帧组成,如果两个 keyframe 至少有 15 个共同的观测特征点,则节点之间用无向边连接,边的权值设为两个关键帧共同观测的特征点的数目。
当检测到回环时,执行
pose graph 优化的 Essential graph 包含的边有:
1,spanning tree:incrementally build。每个关键帧在插入的时候,关键帧和共视点最多的关键帧相连接,关键帧在删除的时候,系统也会更新和删除关键帧相连的关键帧的连接。
2,权值大于 100 边
3,回环边
对于 pose graph 优化作者评价:
Bags of Words Place Recognition
DBoW2 系统创建了一个 invert index,对于 vocabulary 中的每个 visual word(不仅仅是最后一层的 word),保存了看以观测到这个 word 的关键帧,这样在回环检测寻找相似的关键帧时,可以提高效率。
在存在回环的地方,关键帧会有 overlap,也就说不会仅有一帧得分比较高,DBoW2 会把时间因素考虑进去,把时间上相近的关键帧的得分加在一起。但是这样做不能解决不同时间扫描同一区域问题,系统还会把 convisibility graph 相连的回环帧 group 到一起。
用 bag of word 在特征匹配的时候也有好处,当匹配两个集合内的 ORB 特征点时,可以不用 burte fouce 搜索,而仅仅搜索在 vocabulary tree 中属于相同节点的特征(这里系统选择第二层节点)。系统在寻找新的匹配点三角化新的特征点时,和在闭环检测和重定位时,使用这策略。
系统还用 orientation consistency test 再精炼匹配。
参考文献:
Mur-Artal R, Montiel J M M, Tardós J D. Orb-slam: a versatile and accurate monocular slam system[J]. IEEE Transactions on Robotics, 2015, 31(5): 1147-1163.
- ORB-SLAM 笔记
- ORB-SLAM:文献阅读笔记
- ORB-Slam
- ORB-SLAM
- ORB SLAM
- UBUNTU 1604 虚拟机 ORB SLAM 安装笔记
- ORB-SLAM代码理解及笔记
- SLAM学习笔记4: ORB-SLAM中BOW特征匹配
- orb-slam中的orb特征
- 运行ORB-SLAM笔记_编译篇(一)
- 运行ORB-SLAM笔记_使用篇(二)
- ORB-SLAM使用方法
- ORB-SLAM-2
- orb slam学习
- orb-slam资料汇总
- orb-slam评价
- ORB-SLAM基础
- ORB SLAM +kinect2 launch
- RNN代码解读之char-RNN with TensorFlow(model.py)
- libubox
- 设计模式之模板模式
- Remove Element
- 差分数组的总结
- ORB-SLAM 笔记
- 堆空间与栈空间的区别
- 2016 Multi-University Training Contest 10
- 基于Libtask进行协程浅析
- 查看当前手机单个应用所能使用的最大内存
- @RequestMapping 用法详解之地址映射(转)
- 在ubuntu中写python ,并完成文件的读写操作
- 美剧小爬虫
- 面向对象知识点整理