ORB-SLAM2双目开源框架 (1)

ORB-SLAM2主要由以下三个线程组成:
(1)跟踪(Tracking)线程: 计算每帧图像的ORB特征并进行匹配,利用Motion-Only BA估计相机初始位姿,跟踪局部地图,并判断当前图像帧是否为关键帧。当跟踪失败时,利用场景识别(Place Recognition)模块恢复对环境地图点的跟踪。
(2)局部建图(Local Mapping)线程: 获取跟踪线程的候选关键帧,管理局部地图中的关键帧局部地图点,执行局部BA,得到准确度更高的定位和建图精度,最后对候选关键帧进行筛选。
(3)闭环(Loop Closing)线程: 进行闭环检测,当检测成功时利用位姿图优化减小相机运动漂移。而后执行全局BA,得到全局一致性更好的环境地图和相机运动轨迹。

ORB-SLAM2适用于单目相机、双目相机和RGB-D传感器,本文仅介绍双目下算法的主要程序流程和重点函数。

在具体算法实现上,ORB-SLAM2主要包含以下类:

  1. 地图点类(MapPoint);
  2. 图像帧类(Frame);
  3. 关键帧类(KeyFrame);
  4. 特征提取类(ORBextractor);
  5. 特征匹配类(ORBmatcher);
  6. 跟踪类(Tracker);
  7. 局部建图类(LocalMapping);
  8. 闭环类(LoopClosing);
  9. 优化类(Optimizer);
  10. 系统类(System);

其中1-3 是ORB-SLAM2的数据基础; 4-5是特征处理相关类; 6-8是算法三个主要线程的实现类;9是非线性优化类,用于估计相机位姿和地图点位置;10是系统集成类,接收传感器数据,加载SLAM的三个线程。

一、数据基础

1.1 MapPoint类
地图点类是对环境中真实存在的点的描述,主要包含的类成员变量有:

  1. 地图点在绝对坐标系下的坐标 cv::Mat mWorldPos
  2. 观测量 std::map <KeyFrame *,size_t> mObservations, 其中键为观测到该地图点的关键帧指针,值为该地图点在该关键帧的索引;
  3. 描述子cv::Mat mDescriptor;
  4. int mnVisible 为理论上该地图被观测到的次数
  5. int mnFound 为实际该地图被观测到的次数

1.2 Frame类
帧是指一个时刻得到的图像信息及其附加信息。值得注意的是,不同的SLAM算法需要的附加信息不尽相同。

ORB-SLAM2中图像帧类Frame主要包含的类成员变量有:

  1. 该帧索引 long unsigned int mnID;
  2. 相机位姿 cv::Mat mTcw;
  3. 左右图像中的关键点 std::vector< cv::KeyPoint > mvKeys, mvKeysRight;
  4. 关联图像中特征点的地图点集合 std::vector<MapPoint *> mvpMapPoints;
  5. 左右图像中关键点的描述子 cv::Mat mDescriptors, mDescriptorsRight;
  6. 词袋向量 DBoW2::BowVector mBowVec;
  7. 外点标志位 std::vector< bool > mvbOutlier.

主要包含的类成员函数有:

  1. void ExtractORB(int flag,const cv::Mat &im); 提取图像ORB特征;
  2. void ComputeBoW():计算特征的词袋表示;
  3. void SetPose(cv::Mat Tcw): 设置帧的位姿mTcw;
  4. cv::Mat UnprojectStereo(const int &i): 获取第i个特征点在该帧坐标系下的3D坐标。

由于图像信息数据量大,保留所有的帧信息会对存储造成较大压力,因此通常的做法是选取具有代表性的信息作为关键帧。在ORB-SLAM2的程序实现中,关键帧类KeyFrame由Frame构造得到,包含的类成员变量类似。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gone_float

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值