ORB-SLAM
编译环境
win10+CMake+Visual Studio2017
- 使用vcpkg下载Eigen3,OpenCV,Pangolin包
- 下载ORB-SLAM.zip,解压,并用cmake编译
运行ORB-SLAM
- 下载数据集
- 在windows命令行执行.\mono_euroc
摄像机校准
每个摄像机有一下投影参数:
- longueurs focales焦距(fx,fy)(单位:像素pixels)
- centre optique (cx,cy)
- paramètres de distorsions radiale 辐射失真参数(k1,k2,[k3])
- paramètres de distorsions tangentielle 切向失真参数(p1,p2)
用于校准照相机
校准需要比较已知3D点坐标((les points de la mire : le damier qui vous est fourni,视点,棋盘坐标)和一系列由此棋盘得到的照片上对应的点
步骤:
- 解压缩OpenCV_Calibration文件夹,cmake编译
- 使用棋盘来校准,此棋盘格的横向包含8个内部角(双曲线点),纵向包含6个角(如果需要,反之亦然)。 每个棋盘格盒宽30毫米。
- 运行calibration程序,不加任何参数,来获得参考文件/用help()也行
- 然后,使用计划要在工作空间中散布的至少10张照片来校准相机。 在“良好”校准期间,您的重新投影误差应小于0.5像素。 如果不是这种情况,请重复校准。
- 通过calibration程序,您可以将相机矩阵(包含相机的固有参数(以像素为单位的焦距(fx,fy)和主要点(cx,cy))保存为.yml或.yaml类型的文件。
问答:
为什么对同样的数据执行ORB-SLAM从来不会得到同样的结果?
随机数和多线程
KeyFrames的作用是什么?包含了什么?
- Camera parameters
- Tiw:Camera extrinsics(Pose)
- [Camera intrinsics]
- Featurepoints (2D points + descriptors )
- 是否与Mappoint相关联(3D点)
- Bag of Wordsdes features
- 用于在失去跟踪器的情况下进行重定位和闭环
关键帧Ki (Key Frame) 存贮下列信息:
1, 相机的位姿 Tiw, 这是一个刚体转换, 用于转换世界坐标系中的点到相机坐标系。
2, 相机的内参, 包括焦距(focal length) 和主点 (principal point)
3, 帧中提取的ORB特征, 与一个地图点关联或者不关联, 如果畸变模型提供的话, 这个地图点的坐标是经过矫正没有畸变的。- Camera parameters
ORB-SLAM的地图包含KeyFrames和MapPoints。解释在什么条件下:
- 一个新的KeyFrame会被创建
Spawn new Keyframe if: More than 20 frames have passed and local mapping is idle and current frames tracks at least 50 points and current frame tracks less than 90% point of kref 当超过20帧已经通过且local mapping是闲置状态且当前帧已经追踪到至少50个点且当前帧追踪少于kref中90%的点,则产生新的关键帧
一个KeyFrame会被销毁
Local Keyframes culling 关键帧删减
- Discard keyframes in Kc whose 90% points are seen in 3 other keyframes 丢弃掉在其他三个关键帧中90%的点都可见的关键帧
- 一个新的MapPoint会被创建
New map points creation 生成新的map points
- Triangulate Ki matched ORBs from connected Keyframes (Kc) in visibility graph 从可见图中相连的关键帧中对应上ORB的点做三角化处理
- Match ki unmatched ORBs in kc with epipolar constraint and triangulate them
一个MapPoint会被删除
Recent map points culling 最近map points删减
- ~ Prune map points not visible in more than 3 connected keyframes in visibility graph 删除可见图中3个以上相连的关键帧中不可见的map points
- 此外,KeyFrames和MapPoints是否真的被销毁?
ORB-SLAM的Essential Graph(关键图)是什么?它的作用是什么?
Essential Graph:基于位置优化的实时闭环控制。它通过生成树构建,生成树由系统、闭环控制链接和视图内容关联强边缘进行维护。
Essential Graph
- 生成树“按权重链接“可见性图”的节点(nb映射公共点)
- 和与基本图的关键帧相关的词袋。
什么时候,是出于什么原因以及在哪些数据上进行ORB-SLAM中的光束调整les ajustements de faisceaux?
Bundle Adjustment(BA):光束平差法,就是利用非线性最小二乘法来求取相机位姿,三维点坐标。在仅给定相机内部矩阵的条件下,对四周物体进行高精度重建。
Bundle Adjustment 可以将所观测的图像位置和预测的图像位置点进行最小 error 的映射(匹配),由很多非线性函数的平方和表示(error)。因此,最小化 error 由非线性最小二乘法实现。
在闭环过程中,由于哪种算法确定了当前镜头的姿势,我们确定了哪个KeyFrame最接近摄像机所看到的姿势。
Essential graph optimization 基本图优化
- Pose graph optimization on the Essential graph to distribute the loop closing error along the graph 对基本图进行位姿图优化,使闭环误差沿图分布
相关文章
ORB是怎么工作的?https://www.jianshu.com/p/9ee6b2145eaa
ORB-SLAM中的ORB特征 https://zhuanlan.zhihu.com/p/61738607
Bag-of-words:词袋算法 ,它是主要用来判断同一个地点是不是被重新访问过,它的算式在实现的原理上可以认为是对每一帧或者叫每一幅图用了很多单词来进行描述。
在实际应用中在这个词袋中使用的单词量会非常大,并且这些词在现实中并没有一个非常明确的物理含义;词袋方案现在主流所采取的方案之一,它做得最好的一方案叫 DBOW2,也是一个开源的方案。
Bundle Adjustment(BA):光束平差法,就是利用非线性最小二乘法来求取相机位姿,三维点坐标。在仅给定相机内部矩阵的条件下,对四周物体进行高精度重建。
Bundle Adjustment 可以将所观测的图像位置和预测的图像位置点进行最小 error 的映射(匹配),由很多非线性函数的平方和表示(error)。因此,最小化 error 由非线性最小二乘法实现。
Essential Graph:基于位置优化的实时闭环控制。它通过生成树构建,生成树由系统、闭环控制链接和视图内容关联强边缘进行维护。
重要概念:https://blog.csdn.net/fang_liu_yang/article/details/53488765
原文翻译1:https://blog.csdn.net/u011344545/article/details/78836717#commentBox
原文翻译2:https://blog.csdn.net/u012525173/article/details/70332125
ORB_SLAM PATH_TO_VOCABULARY:是一种树型数据结构模型,ORB-SLAM
里面主要用来做回访(loop-closure)
检 测,对于不同数据集严格来说需要离线单独处理生成,但一般成像条件都差不多所以对于不同图像数据集可以使用相同的词汇数据文件(相当于一个数据库文件,方 便快速保存和查询视觉特征信息)。虽然是TXT文件,打开就是许多数字而已。
http://blog.leanote.com/post/gaunthan/ORB-SLAM-A-Versatile-and-Accurate-Monocular-SLAM-System-2
https://blog.csdn.net/fuxingyin/article/details/53511439