![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
ORB_SLAM2源码理解
文章平均质量分 87
源码
嚣张的叉烧包
一个还没入门SLAM的小菜鸡。
展开
-
ORB_SLAM2概述
追踪线程灰度化处理。构建当前帧(提取每幅图像的特征点,并分配到网格中,这会极大的方便某一领域内的特征点的查找与匹配)。单目相机初始化操作:通过特征点匹配,使用RANSAC+DLC计算H矩阵,并根据对称转移误差计算H的评分。使用RANSAC+八点法计算E 矩阵,并根据极线约束估计F评分。选择H/E后通过SVD分解获得最优的R/t。随后进行三角化测距,全局BA优化,优化初始地图的相机位姿和路标点坐标。估计相机位姿并进行优化(位姿图优化)。追踪相机位姿的方法(主要的不同在于获得当前帧位姿的方式)包括:.原创 2021-03-23 22:33:36 · 1860 阅读 · 1 评论 -
ORB_SLAM2 Optimizer
ORB_SLAM2使用g2o库进行优化。(1)全局BA优化(GlobalBundleAdjustment)与局部BA优化(LocalBundleAdjustment)(2)位姿优化(只优化相机位姿,不优化路标点坐标)原创 2021-03-11 16:45:26 · 1395 阅读 · 0 评论 -
ORB_SLAM2 PnPSolver
EPNP:已知4组3D-2D匹配点,构建参考点,通过计算参考点的相机坐标,线性组合成路标点的相机坐标。然后使用ICP估计相机间的位姿变换。构造函数PnPsolver::PnPsolver(const Frame &F, const vector<MapPoint*> &vpMapPointMatches):(1)保存每一个路标点、特征点的信息。(2)设置相机内参(3)设置RANSAC参数。 设置RANSAC参数/** * @brief 设置RANSAC迭代的参原创 2021-03-08 22:25:18 · 637 阅读 · 0 评论 -
ORB_SLAM2中的Sim3变换
对于双目、RGB-D相机,可获得深度,因此不存在尺度问题,因此Sim3中的尺度s=1。(1)通过词袋加速算法实现当前帧、闭环帧的特征点的匹配,建立闭环帧的路标点和当前帧的特征点间的联系。(2)使用RANSAC法,随机采取3对点(根据特征点的索引,获得当前帧中的路标点(局部建图时获得)及对应的闭环帧中的路标点(步骤(1)中获得)),计算两帧间的Sim3变换。一共迭代5次,如果有一次,获得的内点数大于20,就认为成功。(3)根据Sim3变换,将闭环帧的路标点投影至当前帧中进行匹配。随后优化Sim3矩阵。原创 2021-03-03 22:48:43 · 1206 阅读 · 0 评论 -
ORB_SLAM2回环检测
词典是同一类特征点的描述子的集合在局部建图线程中,处理完一个关键帧后,会将其放入回环检测线程void LocalMapping::Run()............................................mpLoopCloser->InsertKeyFrame(mpCurrentKeyFrame); 检测回环 获得满足连续条件的闭环关键帧,插入到容器mvpEnoughConsistentCandidates中。 虽然使用关键帧数据库,可以获得当前帧的候原创 2021-03-02 22:55:23 · 2688 阅读 · 1 评论 -
ORB_SLAM2帧Frame
在追踪线程的一开始就会创建一个帧cv::Mat Tracking::GrabImageMonocular(const cv::Mat &im,const double ×tamp)构造函数在构造函数中,会对特征点进行提取。ExtractORB(0,imGray);特征点分配至网格将图像划分为48*64的网格,然后将特征点放入每个网格中。 if(mbInitialComputations) { // 计算去畸变后图像的边界 Co原创 2021-02-24 23:17:48 · 174 阅读 · 0 评论 -
ORB_SLAM2关键帧
(1)mConnectedKeyFrameWeights:map<KeyFrame*,int>。KeyFrame:当前关键帧的共视关键帧。int:两个关键帧间的权重(2)mvpOrderedConnectedKeyFrames:vector<KeyFrame*>。共视关键帧从大到小的排序。(3)mpParent:关键帧的父关键帧,即共视程度最高的关键帧。一个帧的父关键帧只能有一个,而子关键帧可以有很多个。 计算关键帧的词袋信息 在局部建图线程中,取出关键帧之后会计算该原创 2021-02-24 21:38:02 · 1125 阅读 · 0 评论 -
ORB_SLAM2关键帧数据库
关键帧数据库 注意区分词典和关键帧数据库的区别。词典:实现训练好的,用来计算关键帧的词袋信息。关键帧数据库:根据关键帧的词袋生成,在回环检测、重定位的时候使用,寻找与当前帧最相似的候选关键帧。 在局部建图(LocalMapping)线程的ProcessNewKeyFrame函数中,计算了每个关键帧的词袋信息:mpCurrentKeyFrame->ComputeBoW();关键帧数据库中存放着所有关键帧的单词信息。形式为:单词1:关键帧(1)(2)(3)单词2:关键帧(3)(4)原创 2021-02-23 23:19:50 · 602 阅读 · 0 评论 -
ORB_SLAM2局部建图线程
局部建图线程入口:可执行程序在初始化三个线程的时候,在System.cc的构造函数中进入局部建图线程 mpLocalMapper = new LocalMapping(mpMap, //指定使iomanip mSensor==MONOCULAR); // TODO 为什么这个要设置成为MONOCULAR??? //运行这个局部建图线程 mptLocalMapping = new thread(&ORB_SLAM2::LocalMappin原创 2021-02-22 22:08:17 · 742 阅读 · 0 评论 -
ORB_SLAM2单目初始化策略
基本流程 单目初始化程序存储在Initializer.cc中 需要注意,对于双目/RGB-D相机,初始化时,由于可以直接获得相机的深度信息,因此无需求H/F,直接作为关键帧插入就行。 构建初始化器nitializer::Initializer(const Frame &ReferenceFrame, float sigma, int iterations) 特征点坐标归一化处理 前辈发现计算单应矩阵时变换特征点的坐标会得到更好的效果,包括坐标的平移和尺度缩放,并且这原创 2021-02-21 17:22:52 · 852 阅读 · 0 评论 -
ORB_SLAM2中Tracking线程的三种追踪方式
1、参考关键帧追踪模式bool Tracking::TrackReferenceKeyFrame() 对参考关键帧中的路标点进行跟踪。在Tracking线程中,每传入一帧,都会进行位姿优化。(1)计算当前帧的词袋mCurrentFrame.ComputeBoW();(2)通过词袋加速算法,获得当前帧的特征点与参考帧的路标点间的联系。当匹配数小于15时,退出。 // Step 2:通过特征点的BoW加快当前帧与参考帧之间的特征点匹配 // 特征点的匹配关系由MapPoints进原创 2021-02-19 16:21:51 · 707 阅读 · 0 评论 -
ORB_SLAM2中Tracking线程
Tracking线程是ORB_SLAM2的主线程。在System.cc中,使用构造函数进行了初始化,开启了三个线程。可执行程序—>System构造函数(初始化三个线程)—>处理出入的帧(TrackMonocular)—>调用Tracking线程中的GrabImageMonocular函数(追踪线程的主要函数)。// 创建了System类的一个对象。ORB_SLAM2::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR原创 2021-02-20 00:04:13 · 869 阅读 · 1 评论 -
ORB_SLAM2程序入口(System.cc)
程序入口 ORB_SLAM2的程序入口为src/System.cc。在CMakeList.txt中可知,ORB_SLAM2的可执行程序为:Examples/Stereo/stereo_kitti.cc等。add_executable(stereo_kittiExamples/Stereo/stereo_kitti.cc)target_link_libraries(stereo_kitti ${PROJECT_NAME})add_executable(stereo_eurocExamples原创 2021-02-17 16:01:48 · 479 阅读 · 0 评论 -
ORB_SLAM2源码:ORBmatcher.cc
ORBmatcher.cc中的函数,主要实现(1)路标点和特征点的匹配(2D-3D点对)。(2)特征点和特征点的匹配(2D-2D点对)。SearchByProjection的函数重载看得我一脸懵逼。在这做一下笔记,以后可以参考参考。 每个路标点会有一个自己的最优描述子。个人理解,这个最优描述子的含义应该是:一个路标点会对应多个特征点,先获得所有特征点的描述子,然后计算描述子之间的两两距离,最好的描述子与其他描述子应该具有最小的距离中值。匹配策略 在匹配2D-2D点对,2D-3D点对时,常用的策原创 2021-02-16 00:25:31 · 566 阅读 · 1 评论 -
ORB_SLAM2特征点提取策略及描述子的计算
推荐一下计算机视觉life所发布的文件,里面包含了源码的详细注解、PPT等材料。下载链接如下:https://github.com/electech6/ORBSLAM2_detailed_commentsOpenCV自带的库函数与ORB_SLAM2特征点提取策略效果对比在提取特征点的时候,传统的ORB特征点提取策略会使得提取出的特征点扎堆出现,使得依据路标点建立的轨迹精度差,可靠性差。提取均匀分布的特征点,可提高ORB_SLAM2的精度。OpenCV库自带的函数处理效果可见提取的FAST特征点基本原创 2021-02-12 00:12:59 · 1839 阅读 · 3 评论