0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ORB-SLAM3整体流程详解

新机器视觉 来源:古月居 2023-06-19 09:28 次阅读

0. 简介

那篇文章中提到了ORB-SLAM3是一个支持视觉、视觉加惯导、混合地图的SLAM系统,可以在单目,双目和RGB-D相机上利用针孔或者鱼眼模型运行。

与ORB-SLAM2相比,ORB-SLAM3在处理大视差和长时间未观测到的场景时效果更好。它还提供了更准确的帧间运动估计和更快的处理速度。

此外,ORB-SLAM3还支持更多的传感器,包括RGB-D摄像头和车载LIDAR。ORB-SLAM3的代码结构也比ORB-SLAM2更加简洁,使得它更容易理解和扩展。

1. 主要贡献

个单目和双目的视觉惯导SLAM系统:全部依赖于MAP(最后后验概率估计),即使是在IMU初始化的时候。

高召回率的场景重识别算法:DBoW2需要匹配三个连续的关键帧,太慢了。

作者的方法是:候选的关键帧第一次就进行几何一致性检测,然后利用三个共视的关键帧进行局部的一致性检验,这种策略提升了召回率,并简化了数据关联,从而提高了地图准确性,但计算成本变高。

第一个可以解决纯视觉或者视觉惯导的完整的混合地图的SLAM系统。

在单目或者双目的系统中,Atlas代表的是一系列不连续的地图,而且可以把他们应用到所有的建图过程中:场景重识别、相机重定位、闭环检测和精确的地图融合。

这就允许地图是在不同的时间构建的(增量的SLAM系统),纯视觉的Atlas是参考的2019年IROS的一篇文章:ORBSLAM-atlas: a robust and accurate multi-map system,本文又添加了视觉惯导的混合地图系统来实现场景重识别。

抽象的相机表示:使SLAM系统与所使用的相机模型无关。并允许通过提供其投影,非投影和Jacobian函数来添加新模型我们提供了针孔和鱼眼模型的实现。

2. ORB-SLAM2 和 ORB-SLAM3 改进代码

这部分可以看一下作者的《使用ORBSLAM2进行kineticV2稠密建图,实时转octomap建图以及导航》这篇文章。

这里来汇总一下2,3中常见的扩展,算是一个大全吧

1.高翔实现的添加稠密点云地图

2b4f2fea-0e31-11ee-962d-dac502259ad0.png

2b5fba18-0e31-11ee-962d-dac502259ad0.png

3.使用SVO中直接法来跟踪代替耗时的特征点提取匹配,在保持同样精度的情况下,是原始ORB-SLAM2速度的3倍

2b736842-0e31-11ee-962d-dac502259ad0.png

4.双目VIO版本,加入了LK光流和滑动窗口BA优化

2b928a4c-0e31-11ee-962d-dac502259ad0.png

5.VI-ORB-SLAM2

2ba36042-0e31-11ee-962d-dac502259ad0.png

6.添加了支持鱼眼

2bb4f1ae-0e31-11ee-962d-dac502259ad0.png

7.添加保存和导入地图功能

2bc88d36-0e31-11ee-962d-dac502259ad0.png

8.添加保存和导入地图功能

2be03f08-0e31-11ee-962d-dac502259ad0.png

9.添加了地图可视化

2bea8ce2-0e31-11ee-962d-dac502259ad0.png

2bf4d710-0e31-11ee-962d-dac502259ad0.png

11.添加了点线融合

2c04c1ac-0e31-11ee-962d-dac502259ad0.png

12.使用了一种更好的特征选择方法

2c1b25d2-0e31-11ee-962d-dac502259ad0.png

13.动态语义SLAM 目标检测+VSLAM+光流/多视角几何动态物体检测+octomap地图+目标数据库

2c271ba8-0e31-11ee-962d-dac502259ad0.png

14.用YOLO v3的语义信息来增加跟踪性能

2c2ed596-0e31-11ee-962d-dac502259ad0.png

2c4439fe-0e31-11ee-962d-dac502259ad0.png

16.提出了一种构建3D密集语义图的方法,该方法同时利用YOLOv3[3]的2D图像标签和3D几何信息

2c5daf92-0e31-11ee-962d-dac502259ad0.png

17.ORB-SLAM2在unity中仿真

2c656e76-0e31-11ee-962d-dac502259ad0.png

18.ORB-SLAM2使用CUDA加速

2c70eb34-0e31-11ee-962d-dac502259ad0.png

19.ORB-SLAM2

加入距离最优路径规划器利用该模型来约束路径,使得每个姿势中相关联的地图点的数量高于阈值。

2c871684-0e31-11ee-962d-dac502259ad0.png

20.增加了RGBD-IMU的运行模式和ROS接口,增加了单目IMU和双目IMU的ROS接口,替换了词典为二进制格式,加载速度更快。

依据ORB_SLAM3重写了RGBD-IMU的ROS接口,避免出现队列拥塞,提供了Kinect for Azure的参数文件

2c9bb8c8-0e31-11ee-962d-dac502259ad0.png

21.将激光雷达数据集成到ORB-SLAM3中

2ca44362-0e31-11ee-962d-dac502259ad0.png

2cbb35ae-0e31-11ee-962d-dac502259ad0.png

23.在ORB-SLAM3中使用深度学习YOLOv3

2ccfc6fe-0e31-11ee-962d-dac502259ad0.png

24.使用ORB-SLAM3创建周围环境的分段3D八进制图,可以在八进制图中删除或添加特定的分段对象

2ce39774-0e31-11ee-962d-dac502259ad0.png

25.一种基于RGB-D模式将3D激光雷达深度信息集成到现有ORBSLAM3中的新方法。

我们提出并比较了两种深度图生成方法:传统的计算机视觉方法,即逆膨胀操作和基于监督深度学习的方法。

通过添加直接读取激光雷达点云的所谓RGB-L(LiDAR)模式,将前者直接集成到ORB-SLAM3框架中。

2cedb3bc-0e31-11ee-962d-dac502259ad0.png

3. 主要结构

由于网上对ORB-SLAM3的内容很多了,这里打算换一个形式,如果这里大段重复别人的内容不是很好,这里换一种形式,即用简单的话语+链接的形式来完成整个ORB-SLAM3的介绍。

这里的图是以单目融合IMU的文件(Mono_inertial_tum_vi.cc)为例的。但是我们需要注意的是我们一般会使用ros作为 warpper,所以我们会使用ros_mono_inertial.cc完成理解

2cf8dbc0-0e31-11ee-962d-dac502259ad0.png

4. 主函数main

(1)首先是ros系统的初始化,以及启动相关线程

ros::init(argc, argv, "Mono_Inertial");
ros::NodeHandle n("~");

(2)创建SLAM系统,system会初始化所有的系统进程,并且准备好生成帧,此处会调用system的构造函数System::System(),具体见System.cc

 // Create SLAM system. It initializes all system threads and gets ready to process frames.
 ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::IMU_MONOCULAR,true);

(3)准备捕获图像,并用SLAM类进行初始化

ImuGrabber imugb;
 ImageGrabber igb(&SLAM,&imugb,bEqual); // TODO


//ImageGrabber类如下
class ImageGrabber
{
public:
  ImageGrabber(ORB_SLAM3::System* pSLAM, ImuGrabber *pImuGb, const bool bClahe): mpSLAM(pSLAM), mpImuGb(pImuGb), mbClahe(bClahe){}//类的初始化


  void GrabImage(const sensor_msgs::ImageConstPtr& msg);//捕获图像,并进行跟踪
  cv::Mat GetImage(const sensor_msgs::ImageConstPtr &img_msg);
  void SyncWithImu();


  queue img0Buf;
  std::mutex mBufMutex;


  ORB_SLAM3::System* mpSLAM;
  ImuGrabber *mpImuGb;


  const bool mbClahe;
  cv::Ptr mClahe = cv::createCLAHE(3.0, cv::Size(8, 8));
};

(4)订阅话题,获取彩色图像,当接收到图像后便会运行此函数,调用ImageGrabber中的GrabImage函数。

如果运行程序时出现没有画面的情形,大概率是因为话题名称不对应,先使用rostopic list或者rviz查看发布的话题,然后更改下面代码中的话题名称。

 // Maximum delay, 5 seconds
 ros::Subscriber sub_imu = n.subscribe("/imu", 1000, &ImuGrabber::GrabImu, &imugb); 
 ros::Subscriber sub_img0 = n.subscribe("/camera/image_raw", 100, &ImageGrabber::GrabImage,&igb);

(5)在回调函数中的GrabImage函数作用是,将订阅获取的ros image message转换为矩阵类型,并将rgb图像以及时间戳参数压入img0Buf,并将其传递给System中的TrackStereo函数,进行跟踪。这里会完成和IMU传感器对齐。

void ImageGrabber::SyncWithImu()
{
 while(1)
 {
  cv::Mat im;
  double tIm = 0;
  if (!img0Buf.empty()&&!mpImuGb->imuBuf.empty())
  {
   tIm = img0Buf.front()->header.stamp.toSec();
   if(tIm>mpImuGb->imuBuf.back()->header.stamp.toSec())
     continue;
   {
   this->mBufMutex.lock();
   im = GetImage(img0Buf.front());
   img0Buf.pop();
   this->mBufMutex.unlock();
   }


   vector vImuMeas;
   mpImuGb->mBufMutex.lock();
   if(!mpImuGb->imuBuf.empty())
   {
    // Load imu measurements from buffer
    vImuMeas.clear();
    while(!mpImuGb->imuBuf.empty() && mpImuGb->imuBuf.front()->header.stamp.toSec()<=tIm)
        {
          double t = mpImuGb->imuBuf.front()->header.stamp.toSec();
     cv::Point3f acc(mpImuGb->imuBuf.front()->linear_acceleration.x, mpImuGb->imuBuf.front()->linear_acceleration.y, mpImuGb->imuBuf.front()->linear_acceleration.z);
     cv::Point3f gyr(mpImuGb->imuBuf.front()->angular_velocity.x, mpImuGb->imuBuf.front()->angular_velocity.y, mpImuGb->imuBuf.front()->angular_velocity.z);
     vImuMeas.push_back(ORB_SLAM3::Point(acc,gyr,t));
     mpImuGb->imuBuf.pop();
    }
   }
   mpImuGb->mBufMutex.unlock();
   if(mbClahe)
    mClahe->apply(im,im);


   mpSLAM->TrackMonocular(im,tIm,vImuMeas);
  }


  std::chrono::milliseconds tSleep(1);
  std::sleep_for(tSleep);
 }
}

5. 视觉SLAM图像输入以及初始地图构建

上面一节展示了这幅图,我们也将第一列给讲述完毕了,当然是使用ROS的方式,这里也可以使用opencv等操作,避免使用ROS。

下面我们将开始介绍

TrackMonocular(im,tIm,vImuMeas);这部分的内容。

2d12f5dc-0e31-11ee-962d-dac502259ad0.png

这部分主要完成的是将图像传到SLAM系统中并进行跟踪,具体可以参考ORB-SLAM3 细读单目初始化过程(上)和ORB_SLAM3原理源码解读系列(1)—— ORB特征点提取。

这一章节中主要介绍了Frame部分,主要完成工作是特征点提取,涉及到的知识点其实很多,包括图像金字塔、特征点均匀化、四叉树算法分发特征点、特征点方向计算等等。

然后超详细解读ORB-SLAM3单目初始化(下篇)和ORB_SLAM3原理源码解读系列(2)——单目初始化这一讲主要讲述了Tracking::Track()。

Tracking部分作用论文已提及,包含输入当前帧、初始化、相机位姿跟踪、局部地图跟踪、关键帧处理、姿态更新与保存等。

除此以外,单目SLAM系统需要设计专门的策略来生成初始化地图(局部建图),这也是为什么代码中单独设计一个CreateInitialMapMonocular()函数来实现单目初始化。

在文章ORB-SLAM3 单目地图初始化(终结篇)、ORB_SLAM3原理源码解读系列(3)——创建单目初始化地图和ORB-SLAM3源码阅读笔记1:Tracking、LocalMapping和LoopClosing三线程之间的关系里面有着详细的解释,这里作者建议参照着代码注释与文章来进行解析。

6. System完成多地图以及闭环检测

经过上一节的讲述,视觉SLAM图像输入以及初始地图构建部分也已经算是讲述完毕了,最后一部分就是

2d360ebe-0e31-11ee-962d-dac502259ad0.png

6.1 多地图系统

ORB-SLAM3中的地图,大致上采用了ORB-SLAM1/2和ORB-Atlas的方法完成了重定位、回环和地图融合。详细内容可以参考ORB-SLAM3多地图管理以及ORBSLAM-Altas:多地图SLAM

6.2 重定位

ORB-SLAM3在重定位的策略上做了一些改进。为了保证重定位不出错,重定位常常设置了严苛的条件,保证高精准率而识别率较低。

旧的方法(ORB-SLAM1/2)中当3个关键帧完全匹配上后才判定为重定位成功。然而作者发现,三个关键帧经过了很长的时间。

主要改进是,当当前关键帧与数据库的关键帧匹配上后,检测与当前关键帧具有共视关系的关键帧是否也能够匹配,如果可以则判定为重定位成功;

否则才继续使用接下来的关键帧进行判定。,具体文章可以参考【ORB-SLAM3】LoopClosing-回环检测与地图融合详述,以及ORB-SLAM3源码阅读笔记13:回环检测与重定位的实现与分析。

6.3 视觉地图融合

视觉地图融合方式与ORB-Atlas的大致相同,对融合的区域起了一个新的名字叫做“衔接窗口(welding window)”。

同时指明在衔接后进行完整位姿图融合时,衔接窗口的关键帧固定以保证不会出现gauge freedom。(十三)ORBSLAM3子地图融合优化

6.4 闭环

闭环检测部分与ORB-Atlas的基本相同。




审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2526

    文章

    48098

    浏览量

    740088
  • RGB
    RGB
    +关注

    关注

    4

    文章

    763

    浏览量

    57412
  • SLAM
    +关注

    关注

    22

    文章

    390

    浏览量

    31591
  • LiDAR芯片
    +关注

    关注

    1

    文章

    17

    浏览量

    3168
  • orb
    orb
    +关注

    关注

    0

    文章

    21

    浏览量

    9852

原文标题:ORB-SLAM3整体流程详解

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ORB_FPGA单层图像金字塔的ORB特征提取方案分析

    ORB特征是一种图像识别、追踪和匹配中常用的特征,大名鼎鼎的ORB-SLAM就是使用的这一特征。它提取FAST特征点,并通过特征点附近的窗口矩计算特征点的方向,含方向的FAST特征也被称为oFAST
    的头像 发表于 09-26 11:43 4847次阅读
    <b class='flag-5'>ORB</b>_FPGA单层图像金字塔的<b class='flag-5'>ORB</b>特征提取方案分析

    PCB工艺流程详解

    PCB工艺流程详解PCB工艺流程详解
    发表于 05-22 14:46

    请问用树莓派运行ORB-SLAM2算法可行吗?

    最近想用树莓派3B跑ORB-SLAM2,现在的问题就是Pangolin无法执行,每次执行都报错 Pangolin X11: Unable to retrieve framebuffer
    发表于 03-15 22:30

    视觉SLAM特征点法与直接法对比分析

    视觉SLAM——特征点法与直接法对比以及主流开源方案对比 ORB LSD SVO DSO
    发表于 06-02 16:56

    机器人SLAM实现

    针对复杂环境下机器人的同时定位与地图构建( SLAM)存在实时性与鲁棒性下降等问题,将一种基于ORB特征点的关键帧闭环检测匹配算法应用到定位与地图构建巾。研究并分析了特征点提取与描述符建立
    发表于 03-26 10:57 6次下载

    SLAM还是存在许多开放性的问题

    我看来,vslam得发展也就是从MonoSLAM->PTAM->图优化SLAM->ORB-SLAM为代表的现代slam,其中可能还有许多内容,不过这些开源SLAM一定程度上体现了
    的头像 发表于 06-18 10:40 1391次阅读
    <b class='flag-5'>SLAM</b>还是存在许多开放性的问题

    基于ORB特征的三维定位与地图构建算法

    SLAM框架上面我肯定自己写不了,这里研究了一下午,使用了ORB-SLAM
    的头像 发表于 08-16 10:57 959次阅读

    ORB SLAM中涉及的一些基础概念

    ORB-SLAM 3提供了多地图的存储和拼接功能,在跟踪丢失后可以尝试将现有地图和历史地图进行匹配、融合,并更新当前的活跃地图(Active Map)
    的头像 发表于 10-28 14:28 981次阅读

    ORB-SLAM3ORB-SLAM2相比有哪些优势呢?

    自主导航是机器人基础性和关键性技术,是机器人实现其他更高级任务的前提。视觉 SLAM (Simultaneous Localization And Mapping) 利用视觉传感器获取环境图像信息,基于多视图几何算法构建环境地图。
    的头像 发表于 01-16 10:58 2145次阅读

    OV2SLAM(高速视觉slam)简析

    视觉里程计最近几年越来越受到学术界以及工业界的认可,以ORB和VINS为代表的视觉SLAM已经可以满足绝大多数场景,而OV2SLAM在其他VSLAM中脱颖而出,其实时性以及具体的回环性能在测试中都得到了认可。
    的头像 发表于 03-21 17:16 882次阅读

    5G切换信令流程详解

    5G切换信令流程详解
    的头像 发表于 07-13 10:49 4685次阅读
    5G切换信令<b class='flag-5'>流程</b><b class='flag-5'>详解</b>

    基于英特尔开发套件使用ORB-SLAM3实现无人机实时定位

    工业建模对于精度有着高要求,这意味着无人机的 SLAM 算法要提供可靠的实时位姿估计。ORB-SLAM3 是目前融合双目视觉与 IMU 的优秀算法,其前端是针对实时性优化的 ORB 描述子与关键帧
    的头像 发表于 09-18 10:12 542次阅读
    基于英特尔开发套件使用<b class='flag-5'>ORB-SLAM3</b>实现无人机实时定位

    视觉SLAM开源算法ORB-SLAM3原理与代码解析

    地图点/路标点:将图像上被观察到的特征点通过三角化等方式进行深度恢复,我们就可以得到其对应的在三维空间的位置,同时包含帧的观测信息,这种点就被称为地图点或路标点。
    的头像 发表于 11-09 17:25 833次阅读
    视觉<b class='flag-5'>SLAM</b>开源算法<b class='flag-5'>ORB-SLAM3</b>原理与代码解析

    ORB-SLAM3整体结构框架分析

    处理传感器信息并实时计算当前帧在激活地图中的姿态。同时该模块也决定了是否将当前帧作为关键帧。在视觉-惯性模式下,通过在优化中加入惯性残差来估计刚体速度和 IMU 偏差。
    发表于 12-27 10:04 326次阅读
    <b class='flag-5'>ORB-SLAM3</b><b class='flag-5'>整体</b>结构框架分析

    工程实践中VINS与ORB-SLAM的优劣分析

    ORB-SLAM是一种基于特征的单目视觉SLAM系统,广泛用于实时三维地图构建和机器人定位。该系统使用ORB特征进行高效的视觉识别和地图重建,支持关键帧技术和回环检测来优化地图的准确性。
    的头像 发表于 04-08 10:17 375次阅读
    工程实践中VINS与<b class='flag-5'>ORB-SLAM</b>的优劣分析