ORB-SLAM2学习2 KeyFrame.h

1.公有函数:

1 KeyFrame(Frame &F, Map* pMap, KeyFrameDatabase* pKFDB);

构造函数:出入进来一帧,该帧作为关键帧,传入地图,关键帧的集合。

  2 void SetPose(const cv::Mat &Tcw);
    cv::Mat GetPose();
    cv::Mat GetPoseInverse();
    cv::Mat GetCameraCenter();
    cv::Mat GetStereoCenter();
    cv::Mat GetRotation();
    cv::Mat GetTranslation();

根据给的量设置公有变量,和获得公有量。

  3  void ComputeBoW();

计算词袋,mBowVec,mFeatVec。上一篇讲过了,只是注意mFeatVec指定了层数。

 4  void AddConnection(KeyFrame* pKF, const int &weight);

当前帧与传入的pKF(输入)有共视的时候,增加连接关系。weight(输入)。表示的是当前帧和pKF共同看到了多少个关键点。 这个函数改变的是公共变量:   std::map<KeyFrame*,int> mConnectedKeyFrameWeights;

5 void EraseConnection(KeyFrame* pKF);

删除当前帧与关键帧pKF的连接关系,也是操作这个公共变量std::map<KeyFrame*,int> mConnectedKeyFrameWeights;完了之后记得跟新下,UpdayeBestCovisible.

6 void UpdateConnections();

主要是跟新,该帧与其他关键帧的连接关系。第一步,找出这个关键帧里面的每一个地图点,并且找出其他同样也能看到这个地图点的关键帧们,跟新一下当前帧与其他关键帧的共视权重。直到找完当前帧的所有地图点。我们将结果放到一个容器里面   map<KeyFrame*,int> KFcounter;第一个表示当前帧与哪个关键帧有共视关系,第二个参数表示共视点的个数(权重)。第二步:挑选出那些共视权重大于等于15的那些,放入容器vector<pair<int,KeyFrame*> > vPairs; 然后把vPair从大小进行排序。第三步更新最小生成树(讲权重最大的那帧最为当前帧的父节点)

最后得到的结果:   得到公有变量mConnectedKeyFrameWeights,所有与当前帧有公视关系的关键帧及其权重。得到公共变量:mvpOrderedConnectedKeyFrames :权重大于15的关键帧 按权重排列vector向量。 得到公共变量:mvOrderedWeights :权重(大于15)从大到小排列的vector向量。 以及最小生成树的连接关系。(与当前帧有最大权重的最为该帧的父亲,该帧最为孩子)。

7 void UpdateBestCovisibles();

这个改变的是mvpOrderedConnectedKeyFrames,mvOrderedWeights容器里面的值顺序,就是保证这里的值是从大到小排列的。

 8  //得到与该关键帧有共视的关键帧set集合。
    std::set<KeyFrame *> GetConnectedKeyFrames();

    //得到与该关键帧有共视(    权重大于15)的关键帧的有序vector集合
    std::vector<KeyFrame* > GetVectorCovisibleKeyFrames();
9   //返回  最好的共视向量集合    有<=N个关键帧
    std::vector<KeyFrame*> GetBestCovisibilityKeyFrames(const int &N);
    //返回的是大于该权重w的 所有共视关键帧
    std::vector<KeyFrame*> GetCovisiblesByWeight(const int &w);
    //得到pKF与当前帧的权重
    int GetWeight(KeyFrame* pKF);
 10 // Spanning tree functions
    void AddChild(KeyFrame* pKF);
    void EraseChild(KeyFrame* pKF);
    void ChangeParent(KeyFrame* pKF);
    //得到最小生成树,该帧的所有孩子。
    std::set<KeyFrame*> GetChilds();
    KeyFrame* GetParent();
    bool hasChild(KeyFrame* pKF);

跟最小生成树有关系,都很简单。

 11 //可能检查到很多回环关键帧
    void AddLoopEdge(KeyFrame* pKF);
    //返回这些可能是回环的关键帧
    std::set<KeyFrame*> GetLoopEdges(); 

改变的是公共变量spLoopEdges;

12// MapPoint observation functions   都是对vector<MapPoint* > mvpMapPoints做的操作。
    //增加地图点,
    void AddMapPoint(MapPoint* pMP, const size_t &idx);
    void EraseMapPointMatch(const size_t &idx);
    void EraseMapPointMatch(MapPoint* pMP);
    void ReplaceMapPointMatch(const size_t &idx, MapPoint* pMP);

    //得到map point不是bad 的mappoint 集合
    std::set<MapPoint*> GetMapPoints();
    std::vector<MapPoint*> GetMapPointMatches();

    //返回该关键帧里面,被跟踪的关键点的个数
    int TrackedMapPoints(const int &minObs);
    MapPoint* GetMapPoint(const size_t &idx);

其他的函数也实现也十分简单,这里最后写下一个,很重要的函数。

13 void SetBadFlag();

该函数将该帧变成bad,mbToBeErased变成true,就是代表”删除了“。删除了该帧,第一要改变,该帧其连接帧的连接关系,删除该帧对地图点的额观测。第二改变最小生成树,改变最小生成树的具体实现:。具体实现看代码。主要思路:因为删除了当前帧,所有当前帧下面的孩子们(n个孩子)的父节点都要改变。我们就循环n次,重新为这n个孩子找父节点,父节点出现在与这些孩子节点有最多的共视权重的帧,并且在父节点候选容器(ParentCandidates)中里面的帧。选好了父亲点之后,把这个孩子节点加入剩下的孩子节点的父亲候选节点(sParentCandidates.insert(pC);),删除这个孩子节点(   mspChildrens.erase(pC);  )。

时间: 2024-10-01 06:30:47

ORB-SLAM2学习2 KeyFrame.h的相关文章

ORB SLAM2在Ubuntu 16.04上的运行配置

安装依赖 安装OpenGL 1. 安装opengl Library$sudo apt-get install libgl1-mesa-dev2. 安装opengl utility$sudo apt-get install libglu1-mesa-dev3. 安装opengl utility toolkit$sudo apt-get install freeglut3-dev 安装GLEW $sudo apt-get install libglew-dev 安装boost $sudo apt-g

Time, Delays, and Deferred Work &lt;LDD3&gt; 学习笔记 + jiffies.h 分析

Time, Delays, and Deferred Work Dealing with time involves the following tasks, in order of increasing complexity: ? Measuring time lapses and comparing times ? Knowing the current time ? Delaying operation for a specified amount of time ? Scheduling

ORB-SLAM2学习3 MapPoint.h Map.h KeyFrame.h

1.MapPoint.h 里面有个类MapPoint,其有两个构造函数.分别为,参考帧是关键帧和参入是普通帧的情况. 1 MapPoint(const cv::Mat &Pos, KeyFrame* pRefKF, Map* pMap); MapPoint(const cv::Mat &Pos, Map* pMap, Frame* pFrame, const int &idxF); [email protected] Pos,指的是该点的3D位置. 2 @pRefKF,参考关键帧.

ORB-SLAM2学习4 initializer.h

orb-slam2   Inlitializer.h  头文件的学习 a.预备知识,主要读取了作者的论文. 作者在论文中提到,这个头文件定义的东西全是用于单目的,双目和RGBD不需要初始化.地图初始化的目的就是得到两帧的相对运动,R  T,  然后根据 R T 和这两帧匹配好的关键点,三角化出初始的三 维地图.论文里面提到了一共有5步. 1.在当前帧与参考帧之间提取ORB特征,就行匹配. 2.开启两个同步线程,同时计算H矩阵和F矩阵,H=homography 用于特征点都是在同平面的情况,F=f

ORB-SLAM2学习5 Tracking.h

一.直接上图,清楚明了.(来自论文) 我们注意到TRACKING线程,很清楚明白的告诉了我们是如何跟踪的,第一,提取ORB特征:第二,进行地图初始化(如果没初始化的话).第三,初始位置估计(这里用3种模型,代码在这里经过了很多判断来选择这三种模型的其中一种)得到是一个很粗略的初始位姿:第四,跟踪局部地图:为了优化上一步得到的初始位姿态.第五,决定是不是插入关键帧. 二.解释跟踪里面使用的三种模型,这三种模型都是用来得到当前帧的位姿T的,我们根据需要选择一种. 1.TrackWithMotionM

【整理学习Hadoop】H D F S 一个分布式文件系统

Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.它和现有的分布式文件系统有很多共同点.但同时,它和其他的分布式文件系统的区别也是很明显的.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用.HDFS放宽了一部分POSIX约束,来实现流式读取文件系统数据的目的.HDFS在最开始是作为Apache Nutch搜索引擎项目的基础架构而开发的.HDFS是Apac

ORB SLAM2运行中出现(ORB-SLAM2: Current Frame:14370): GLib-GIO-CRITICAL...的n问题

在Ubuntu16.04上安装ORBSLAM2,参考文档:http://www.cnblogs.com/wongyi/p/8596084.html 执行代码: ./Examples/Monocular/mono_tum  Vocabulary/ORBvoc.txt  Examples/Monocular/TUM1.yaml  ../rgbd_dataset_freiburg1_xyz 然后它就正常执行了,但是不明白为什么中间输出的信息中含有大量的以下代码:(我是已经安装了OpenGL并且按照ht

Ubuntu14.04 使用本地摄像头跑ORB SLAM2

前面的准备: Ubuntu14.04安装 ROS 安装步骤和问题总结 Ubuntu14.04+ROS 启动本地摄像头 STEP1:第一个终端 roscore STEP2:第二个终端运行usb_cam roslaunch usb_cam usb_cam-test.launch STEP3: rosrun ORB_SLAM2 Mono /home/zc/Desktop/ORBvoc.txt  /home/zc/Desktop/Asus.yaml 我把 ./Vocabulary/ORBvoc.txt

UNIX/Linux下C语言的学习路线

一.工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工具. 1.操作系统    在UNIX或Linux系统中学习C很方便,所以在开始您的学习旅程前请先选择一个UNIX或Linux操作系统,目前可供个人免费使用的UNIX或Linux系统有FreeBSD.RedHat Linux.SUSE Linux等,而且在安装包中还提供很多实用的工具,如:gcc, make等. 如果您一直使用Window