ORB-SLAM3整体流程详解

news2024/12/26 14:06:25

0. 简介

在之前,作者曾经转过一篇《一文详解ORB-SLAM3》的文章。那篇文章中提到了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 相关改进代码汇总(截止2023.1.30日)

这部分可以看一下作者的《使用ORBSLAM2进行kineticV2稠密建图,实时转octomap建图以及导航》这篇文章。这里来汇总一下2,3中常见的扩展,算是一个大全吧

  1. https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map
    高翔实现的添加稠密点云地图
    在这里插入图片描述
  2. https://github.com/xiaobainixi/ORB-SLAM2_RGBD_DENSE_MAP
    在这里插入图片描述
  3. https://github.com/gaoxiang12/ORB-YGZ-SLAM

使用SVO中直接法来跟踪代替耗时的特征点提取匹配,在保持同样精度的情况下,是原始ORB-SLAM2速度的3倍
在这里插入图片描述
4. https://github.com/gaoxiang12/ygz-stereo-inertial
双目VIO版本,加入了LK光流和滑动窗口BA优化
在这里插入图片描述
5. https://github.com/jingpang/LearnVIORB
VI-ORB-SLAM2
在这里插入图片描述
6. https://github.com/lsyads/fisheye-ORB-SLAM
添加了支持鱼眼
在这里插入图片描述
7. https://github.com/AlejandroSilvestri/osmap
添加保存和导入地图功能
在这里插入图片描述
8. https://github.com/Jiankai-Sun/ORB_SLAM2
添加保存和导入地图功能
在这里插入图片描述
9. https://github.com/AlejandroSilvestri/Osmap-viewer
添加了地图可视化
在这里插入图片描述
10. https://github.com/atlas-jj/ORB_Line_SLAM

添加了线特征
在这里插入图片描述
11. https://github.com/maxee1900/RGBD-PL-SLAM
添加了点线融合
在这里插入图片描述
12. https://github.com/ivalab/gf_orb_slam2
使用了一种更好的特征选择方法
在这里插入图片描述
13. https://github.com/Ewenwan/ORB_SLAM2_SSD_Semantic

动态语义SLAM 目标检测+VSLAM+光流/多视角几何动态物体检测+octomap地图+目标数据库
在这里插入图片描述
14. https://github.com/Eralien/TE-ORB_SLAM2
用YOLO v3的语义信息来增加跟踪性能
在这里插入图片描述
15. https://github.com/bijustin/YOLO-DynaSLAM

在这里插入图片描述
16. https://github.com/qixuxiang/orb-slam2_with_semantic_label

提出了一种构建3D密集语义图的方法,该方法同时利用YOLOv3[3]的2D图像标签和3D几何信息
在这里插入图片描述
17. https://github.com/VisionerTech/ORB_SLAM2_Unity
ORB-SLAM2在unity中仿真
在这里插入图片描述
18. https://github.com/thien94/ORB_SLAM2_CUDA

ORB-SLAM2使用CUDA加速
在这里插入图片描述
19. https://github.com/XinkeAE/Active-ORB-SLAM2
ORB-SLAM2加入距离最优路径规划器利用该模型来约束路径,使得每个姿势中相关联的地图点的数量高于阈值。
在这里插入图片描述

  1. https://github.com/xiefei2929/ORB_SLAM3-RGBD-Inertial
    增加了RGBD-IMU的运行模式和ROS接口,增加了单目IMU和双目IMU的ROS接口,替换了词典为二进制格式,加载速度更快。依据ORB_SLAM3重写了RGBD-IMU的ROS接口,避免出现队列拥塞,提供了Kinect for Azure的参数文件
    在这里插入图片描述

  2. https://github.com/TUMFTM/ORB_SLAM3_RGBL

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

在这里插入图片描述

  1. https://github.com/zhouyong1234/ORB-SLAM3-GRID-MAP

将ORB-SLAM3生成的稀疏地图转化为2D栅格地图,用于机器人导航
在这里插入图片描述
23. https://github.com/cpymaple/ORB-SLAM3-YOLOv3
在ORB-SLAM3中使用深度学习YOLOv3
在这里插入图片描述

  1. https://github.com/charbelias24/3dMapSLAM
    使用ORB-SLAM3创建周围环境的分段3D八进制图,可以在八进制图中删除或添加特定的分段对象
    在这里插入图片描述
  2. https://github.com/TUMFTM/ORB_SLAM3_RGBL
    一种基于RGB-D模式将3D激光雷达深度信息集成到现有ORBSLAM3中的新方法。我们提出并比较了两种深度图生成方法:传统的计算机视觉方法,即逆膨胀操作和基于监督深度学习的方法。通过添加直接读取激光雷达点云的所谓RGB-L(LiDAR)模式,将前者直接集成到ORB-SLAM3框架中。
    在这里插入图片描述

3. 主要结构

由于网上对ORB-SLAM3的内容很多了,这里打算换一个形式,如果这里大段重复别人的内容不是很好,这里换一种形式,即用简单的话语+链接的形式来完成整个ORB-SLAM3的介绍,这里的图是以单目融合IMU的文件(Mono_inertial_tum_vi.cc)为例的。但是我们需要注意的是我们一般会使用ros作为 warpper,所以我们会使用ros_mono_inertial.cc完成理解
在这里插入图片描述

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::System::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<sensor_msgs::ImageConstPtr> img0Buf;
    std::mutex mBufMutex;
   
    ORB_SLAM3::System* mpSLAM;
    ImuGrabber *mpImuGb;

    const bool mbClahe;
    cv::Ptr<cv::CLAHE> 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<ORB_SLAM3::IMU::Point> 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::IMU::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::this_thread::sleep_for(tSleep);
  }
}

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

上面一节展示了这幅图,我们也将第一列给讲述完毕了,当然是使用ROS的方式,这里也可以使用opencv等操作,避免使用ROS。下面我们将开始介绍TrackMonocular(im,tIm,vImuMeas);这部分的内容。
在这里插入图片描述
这部分主要完成的是将图像传到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完成多地图以及闭环检测

…详情请参照古月居

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/571885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件系统三基座之一:权限管理

软件系统三基座包含&#xff1a;权限管理、组织架构、用户管理。 何为基座&#xff0c;即是有了这些基础&#xff0c;任一相关的“建筑”就能逐步搭建起来。 万丈高楼平地起 一、为什么要权限管理 权限管理&#xff0c;一般指根据系统设置的安全规则或者安全策略&#xff0c;…

集成chatgpt4和midjourney的超强镜像站

昨天发现一个镜像站&#xff0c;和之前发的镜像站不一样&#xff0c;这个集成了midjourney和chatgpt&#xff0c;且免翻&#xff0c;相信给很多很多用户都提供了便利吧&#xff01; 先把网站贴出来&#xff0c;有兴趣的伙伴可以玩一玩 http://mtw.so/5EoyYy http://mtw.so/5E…

如何在上架App之前设置证书并上传应用

App上架教程 在上架App之前想要进行真机测试的同学&#xff0c;请查看《iOS- 最全的真机测试教程》&#xff0c;里面包含如何让多台电脑同时上架App和真机调试。 P12文件的使用详解 注意&#xff1a; 同样可以在Build Setting 的sign中设置证书&#xff0c;但是有点麻烦&…

浅析 Redis 中 String 数据类型及其底层编码

从 RedisObject 说起 在 Redis 中&#xff0c;任意数据类型的键和值都会被封装为一个 RedisObject &#xff0c;也叫做Redis对象&#xff0c;源码如下 c 复制代码 /*server.h*/ typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS;…

springboot+vue之java学习平台(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的java学习平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

档案库房太乱了怎么办?这个方法秒变高级!

全国有数以万计的大大小小的档案馆&#xff0c;其中有许多非常重要的机要档案&#xff0c;其历史和社会价值非常高&#xff0c;而档案保存的质量、档案的物理寿命、档案的防虫防霉都与库房的空气质量、温湿度息息相关。 解决档案高效管理及利用的安全问题越来越迫切&#xff0c…

在Ubuntu22.04上安装QQ~Linux

在Ubuntu22.04上安装QQ~Linux 0. 前言1. 下载deb安装包2. 使用dpkg安装deb包3. 安装完成&#xff0c;启动QQ3.1 点击图标打开3.2 使用命令行的方式打开 0. 前言 换Ubuntu当主力生产力了&#xff0c;并不是太喜欢vmware&#xff0c;所以我直接装到了硬盘里边&#xff0c;需要移…

SSM 如何使用 Kafka 实现消息队列?

SSM 如何使用 Kafka 实现消息队列&#xff1f; Kafka 是一个高性能、可扩展、分布式的消息队列系统&#xff0c;它支持多种数据格式和多种操作&#xff0c;可以用于实现数据传输、消息通信、日志处理等场景。在 SSM&#xff08;Spring Spring MVC MyBatis&#xff09;开发中…

iOS-最全的App上架教程

App上架教程 在上架App之前想要进行真机测试的同学&#xff0c;请查看《iOS- 最全的真机测试教程》&#xff0c;里面包含如何让多台电脑同时上架App和真机调试。 P12文件的使用详解 注意&#xff1a; 同样可以在Build Setting 的sign中设置证书&#xff0c;但是有点麻烦&…

软件开发项目成本控制的4大策略

1、构建责权利相结合的成本控制机制 需要对每个部门与个人的工作范围和工作职业有明确的界定&#xff0c;并赋予相应的权利以充分履行职责。在责任支配下高效完成工作进度时&#xff0c;需要给予一定的物质奖励。通过这样层层落实&#xff0c;逐级负责&#xff0c;从而做到责权…

VanillaNet:深度学习极简主义的力量

摘要 基础模型的核心是“更多不同”的理念&#xff0c;计算机视觉和自然语言处理方面的出色表现就是例证。然而&#xff0c;Transformer模型的优化和固有复杂性的挑战要求范式向简单性转变。在本文中&#xff0c;我们介绍了VanillaNET&#xff0c;这是一种设计优雅的神经网络架…

学会提问,ChatGPT可以帮你写出高质量论文

前言 ChatGPT 很火&#xff0c;火到大家以为他可以上天入地&#xff0c;上到天文&#xff0c;下到地理无所不能&#xff0c;但实际使用大家是不是会遇到如下的情况。 写论文步骤 今天&#xff0c;我们来探讨下怎样问ChatGPT&#xff0c;才能帮你写出一篇优秀的论文&#xff0c;…

【Java-Crawler】爬取动态页面(HtmlUnit、WebMagic)

爬取动态页面&#xff08;WebMagic、HtmlUnit&#xff09; 一、HtmlUnit的基本使用引入依赖一般使用步骤WebClient 的一些配置&#xff08;上述一般步骤中的第二步&#xff09; 二、案例&#xff08;爬取CSDN首页&#xff09;测试&#xff08;WebMagicHtmlUnit&#xff09;三、…

人机交互技术在车管所的应用探索

车管所作为交通管理的重要机构&#xff0c;承担着车辆登记、驾驶证办理、年检等重要职责&#xff0c;其工作效率和服务质量对于保障道路交通安全和畅通至关重要。而人机交互技术作为一种新兴的技术手段&#xff0c;可以为车管所提供更加高效、便捷的服务。因此&#xff0c;本文…

ESD防静电监控系统后台实时掌控现场静电防护情况

当静电积累到一定程度时&#xff0c;它可能会产生电击&#xff0c;从而对工人造成伤害。因此&#xff0c;工厂应该采取必要的预防措施&#xff0c;如提供防静电鞋和衣服&#xff0c;以保护工人免受静电伤害。 ESD防静电监控系统实现工业4.0技术要求&#xff0c;ESD物联技术稳定…

chatgpt赋能python:Python编程:接口程序的SEO优化方法

Python编程&#xff1a;接口程序的SEO优化方法 简介 接口程序是现代软件开发不可或缺的一部分&#xff0c;为应用程序提供外部数据访问和交互的方式。Python是一种功能强大的编程语言&#xff0c;在接口开发中也得到了广泛应用。本文将介绍如何使用Python编写有效的接口程序并…

新形式下安科瑞智能配网监控系统的应用研究

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;随着经济和科技水平的快速发展&#xff0c;大型建筑变电所、配电房数量较多&#xff0c;分布区域广&#xff0c;配电运维部门人员对配电房的运维管理基本停留在传统的定期巡视、周期性检修、故障抢修…

对于质量保障,前端职能该做些什么?

目录 前言 1. 背景 2. 分析 2.1 前端自动化测试工具 2.1.1 针对工程代码的静态检查 2.1.2 针对部署产物的检查 2.1.3 性能测试 2.1.4 错误检测 2.1.5 容灾&#xff08;白屏&#xff09;检测 2.2 devOps 流程关联 2.2.1 提测卡点 2.2.2 发布卡点 3. 总结 3.1 严选…

RabbitMQ消息持久化机制

上一篇说到生产者消息确认机制&#xff0c;它可以确保消息投递到RabbitMQ的队列中&#xff0c;但是消息发送到RabbitMQ以后&#xff0c;如果MQ宕机&#xff0c;也可能导致消息丢失&#xff0c;所以提出了消息持久化。持久化的主要机制就是将信息写入磁盘&#xff0c;当RabbtiMQ…

机械师曙光16电脑开机自动蓝屏怎么解决?

机械师曙光16电脑开机自动蓝屏怎么解决&#xff1f;有的用户在使用机械师曙光16电脑的时候&#xff0c;遇到了一些系统问题&#xff0c;导致自己无法正常的开机使用电脑。因为电脑总会变成蓝屏&#xff0c;无法进行任何操作。那么这个情况怎么去进行问题的解决呢&#xff1f;来…