ORB-SLAM(1) --- 让程序飞起来

2023-05-16

1. ORB SLAM简介

      ORBSLAM是15年出的比较完备的单目slam算法,orb指的是一种旋转不变性特征,整个算法均是基于orb特征实现的,不同于基于稠密或半稠密地图的slam,orbslam是一个基于特征点地图的slam。最新的orbslam的进展是基于orbslam的关键帧做了半稠密场景重建,新的研究成果可持续关注下面的项目主页:

  http://webdiis.unizar.es/~raulmur/orbslam/

  以下为英文介绍:

  ORB-SLAM is a versatile and accurate Monocular SLAM solution able to compute in real-time the camera trajectory and a sparse 3D reconstruction of the scene ina wide variety of environments, ranging from small hand-held sequences of a desk to a car driven around several city blocks. It is able toclose large loops and perform global relocalisation in real-time andfrom wide baselines. It includes an automatic and robust initialization fromplanar and non-planar scenes. See the related publication [1] for moredetails. Demostrating videos, code and related publications are shown below.

2. 准备工作

2.1 源码下载

      orbslam是基于ros运行的,故先得准备好ubuntu和ros环境,这里就不再赘述了,本文介绍的是基于ubuntu 14.04和ros indigo环境下的orbslam运行事例!

     首先在项目主页上找到下载链接,将orbslam工程下载至本地

   https://github.com/raulmur/ORB_SLAM

       打开文件夹,可以看到以下内容:

  

  首先我们应该关注它的README.txt,里边关于orbslam怎么编译,怎么运行讲得已经很清楚了。当然对于熟悉ros的人很容易啦,但是对于ros小白们可能还是有点费劲的,所以这里会把具体的编译执行,再详细的介绍一遍。

2.2 测试数据集准备

        http://webdiis.unizar.es/~raulmur/orbslam/downloads/Example.bag.tar.gz  

       上面的链接为测试数据集的下载链接,可以下下着,比较大了,会很慢。。

       下载完解压 得到Example.bag文件

3. ORB SLAM编译

3.1 依赖库的安装

       ORB SLAM依赖于另外两个第三方库g2o(执行图优化的一个通用求解器,这里可以简单理解位姿求解,位姿优化、地图优化就基本上靠它啦),DBOW库(主要用于place recognition,场景识别,在ORB SLAM中主要用于闭环检测)。这两个库ORB SLAM已经打包在一块了,在ThirdParty文件夹下。

 当然这两个库也是需要依赖其他库的,所以呢,先安装一些其它的库,就按照readme中来就好啦。。。


    sudo apt-get install libboost-all-dev
    sudo apt-get install libsuitesparse-dev

    sudo apt-get install libblas-dev  

    sudo apt-get install liblapack-dev  

    sudo apt-get install libeigen3-dev  

3.2 第三方库的编译

 上面的库安装好了之后,那么后面就好办了:

 1. 终端进入到g2o文件夹,执行


   mkdir build  

   cd build  

   cmake ..  

  make 
  

      执行完这四个指令,若没报错就噢啦,对于DBOW2同样的道理,到这步还是按照README的第二节介绍的就好啦

     注意:这里README没有介绍要安装Opencv,ORBSLAM是依赖它的,大家不要忘了安装opencv了,下个新版本按照说明装就好了,这里就不在介绍了。

3.3 ORB_SLAM的编译

  到这里终于到源码的编译了,编译过程与两个第三方库相似,不过还是有些区别的。

 若ORB_SLAM是在你的ros工作空间目录下,可以跳过以下步骤:

 将ORB_SLAM路径加入ROS的环境变量ROS_PACKAGE_PATH中去,

  执行 export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:(你的ORB_SLAM文件夹绝对路径)

 然后执行


   mkdir build  

  cd build  

  cmake ..  

  make  

        正常情况下会没错的,若编译成功,则可以执行下一步了。本人在这一步cmake时报错了,说是找不到opencv2,其实这里直接将文件manifest.xml中 <depend package="opencv2"/> 删除就好了。

4. 运行程序

     说到运行程序,orbslam是基于ros的,因此首先必须得运行roscore,启动ros服务。随后逐一运行图片显示,地图显示,orb slam主体程序,rosbag图片发布程序。

       关于启动各个程序,无论是ORB本体程序还是可视化程序还是图片发布程序,大致有两种方法:

4.1 逐一手动启动各个程序

      (1) 开启新的终端,执行


   roscore   #启动ros服务  

      (2) 开启新的终端,执行


   export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:(你的ORB_SLAM文件夹绝对路径)#添加环境变量,如果ORB_SLAM位于ROS工作空间的话,则忽略  

    rosrun image_view image_view image:=/ORB_SLAM/Frame _autosize:=true   #启动图片查看程序,到时可以看到特征点跟踪情况  

         (3) 打开新的终端,执行


   export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:(你的ORB_SLAM文件夹绝对路径)#添加环境变量,如果ORB_SLAM位于ROS工作空间的话,则忽略  

    rosrun rviz rviz -d Data/rviz.rviz   #启动地图视图窗口,显示轨迹及特征点地图

(4) 打开新的终端,执行

   export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:(你的ORB_SLAM文件夹绝对路径)#添加环境变量,如果ORB_SLAM位于ROS工作空间的话,则忽略
    rosrun ORB_SLAM ORB_SLAM Data/ORBvoc.yml Data/Settings.yaml   #运行ORB_SLAM , 其中ORBvoc.yml需要先解压

(5) 打开新的终端执行,进入Example.bag所在文件夹,执行

       rosbag play --pause Example.bag  #执行图片发布程序,执行后,按空格键开始

4.2 使用launch文件启动程序

使用launch文件就比较简单了,ORB_SLAM包中包含两个launch文件,对应不同的ROS版本

       

    根据你的ROS版本,选择对应的launch文件即可,launch文件相当于将上一小节的2,3,4步集成在一块,通过一个脚本文件顺序执行:

       (1) 开启新的终端,执行


   roscore   #启动ros服务  

      (2) 开启新的终端,执行


   export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:(你的ORB_SLAM文件夹绝对路径)#添加环境变量,如果ORB_SLAM位于ROS工作空间的话,则忽略  

    roslaunch ExampleGroovyHydro.launch  

(3) 打开新的终端执行,进入Example.bag所在文件夹,执行

       rosbag play --pause Example.bag  #执行图片发布程序,执行后,按空格键开始

5. 问题及解决方法

  前面介绍的仅仅是如何把程序运行起来,然而在运行时使用不同的数据集可能会有一些问题,以下将本人在执行ORB SLAM遇到的问题整理下:

5.1 为什么跑数据集时老是出现跟踪失败?

      本人在使用Example.bag时并未出现什么问题,然而在运行自己的数据集时,常常会出现Tracking失败的现象,而且通常是开始时都没问题,运行一段时间后出现的。将数据集中的图片打开感觉前后帧变化不大啊,后来测了一下程序每步执行的时间,稍微看了一下他的代码实现,大致的推论是这样的:
     1). 在用rosbag发布图像时,很多时候都用的30帧每秒的发送速率,然而电脑性能未特别好的情况下,是不能及时处理的,因此读取图像端可能会出现丢帧现象,导致图像不连续,造成跟踪失败;
     2).ORB_SLAM在程序执行时,多个线程共享同一份地图关键帧,造成每个线程可能运行的时间不固定,这个也是导致不能及时处理图片的一个原因吧。
     解决方法:一般跑代码的人是先想看看代码的功能性,效率可以作为接下来考量的东西,因此最简单的办法是将rosbag发布的帧率调低或调到很低,具体方法是在使用BagFromImages工具打包时将帧率参数设置为比较小的数值,而不是通常地30帧。

5.2 为什么跑文献中那个kitti最大场景(sequence 00)的结果与文献中给出的不一致?

      可能对于比较小的数据集出现个跟踪失败现象使用将图像发布速度降低的方法能解决一部分问题,然而想跑一个大场景的数据集时,比如说文献中那个比较庞大的数据集时(如下图),发现前面跑的还好,后面咋就还是由于跟踪失败,导致在回到之前到过场景之前地图一直处于丢失状态。


      开始时本人也是相当困惑的,后来一想ORB_SLAM使用的多线程,资源共享机制还有增量式地图会导致两个因素:一是算法时间不稳定,二是对内存的消耗会越来越大,一旦真实的物理内存用尽了,大家都知道Linux会使用交换分区作为内存的扩展空间,这样的话程序的执行效率会降低不少的,后来通过系统监视器发现4G的内存根本就不够他用,最后通过加了个4G内存然后将图片发布速度控制到很低的帧率,慢吞吞的跑完,终于达到作者所描述的效果(看来科研是有一台性能好的电脑还是有优势的)。

5.3 设置自己相机相关参数

     当使用自己的数据集时,相机的内参数和畸变参数会有不同,因此可在Data下的 Settings.yaml中修改:

6 .结语

    本文只是简单的介绍了如何将ORB-SLAM跑起来的步骤,下一篇会逐步介绍本人对于ORB-SLAM算法的理解和自己的一些思考!



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ORB-SLAM(1) --- 让程序飞起来 的相关文章

  • 三维刚体变换

    欢迎访问我的博客首页 三维刚体变换 1 坐标系 1 1 空间坐标系 1 2 右手坐标系与像素坐标系 2 旋转与平移 2 1 推导旋转 2 2 推导平移 2 3 推导变换 2 4 刚体变换 2 5 坐标系旋转与向量旋转 3 链式变换 4 Ei
  • 微信小程序SLAM AR零基础入门教程

    鬼灭之刃花街篇 开播在即 今天带大家零基础使用Kivicube制作一个炭治郎的SLAM AR云手办 可以通过微信小程序将AR版的炭治郎放置在家中 提前感受鬼灭的氛围 先上个GIF大家看看动态的展示效果 在这里先科普一下本次教程使用到的AR技
  • ubuntu系统下配置vscode编译cmake

    文章目录 一 配置vs code运行c 代码 三个关键文件介绍 1 tasks json run helloworld cpp 1 1 打开cpp文件 使其成为活动文件 1 2 按编辑器右上角的播放按钮 1 3生成task文件 1 4 此时
  • ROS激光SLAM导航理解

    ROS激光SLAM导航理解 注 最近学习ROS的激光导航知识 需要理清ROS的SLAM 环境感知 costmap 与导航算法 为防止自己忘记 将觉得有价值的内容收集于此 对AGV来说 SLAM是个大大坑 环境感知和局部运动控制也是大坑 学习
  • Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题

    Ubuntu18 04 安装速腾聚创最新驱动RSLidar SDK采集XYZIRT格式的激光点云数据 新款驱动支持RS16 RS32 RSBP RS128 RS80 RSM1 B3 RSHELIOS等型号 注意 该教程旨在引导安装 可能现在
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计
  • 使用EKF融合odometry及imu数据

    整理资料发现早前学习robot pose ekf的笔记 大抵是一些原理基础的东西加一些自己的理解 可能有不太正确的地方 当时做工程遇到的情况为机器人在一些如光滑的地面上打滑的情形 期望使用EKF利用imu对odom数据进行校正 就结果来看
  • LeGO-LOAM 系列(1): LeGO-LOAM 安装以及概述

    一 github GitHub RobustFieldAutonomyLab LeGO LOAM 二 安装依赖 1 ROS Ubuntu 64 bit 16 04 ROS Kinetic 比较常规 就不赘述了 2 gtsam Georgia
  • Sophus安装踩坑

    装SLAM十四讲第二版提供的Sophus Eigen版本3 4 0 报错 home ch 下载 Sophus 13fb3288311485dc94e3226b69c9b59cd06ff94e test core test so2 cpp 9
  • 视觉SLAM技术及其应用(章国锋--复杂环境下的鲁棒SfM与SLAM)

    SLAM 同时定位与地图构建 机器人和计算机视觉领域的基本问题 在未知环境中定位自身方位并同时构建环境三维地图 应用广泛 增强现实 虚拟现实 机器人 无人驾驶 SLAM常用的传感器 红外传感器 较近距离感应 常用与扫地机器人 激光雷达 单线
  • IMU预积分的一些理解

    IMU预积分 算是比较简单的一个算法 无奈网上找到的资料都讲的晦涩难懂 看明白了也觉得不过如此 讲一下我的理解 整体流程 1 推导IMU离散运动方程 2 根据离散运动方程 进行预积分 并将预积分的误差项拆分出来 因为我们在定义误差的时候 有
  • 动态场景下基于实例分割的SLAM(毕业设计开题及语义分割部分)

    动态场景下基于实例分割的SLAM 毕业论文设计思路及流水 前言 今年选了个比较难的毕设题目 这里记录一下自己思路和流程 为之后的学弟学妹 划掉 铺个方向 会按日期不定期的更新 一 开题 2019 12 24 考研前选择课题是 利用深度学习对
  • PnP 问题

    欢迎访问我的博客首页 PnP 问题 1 DLT 2 P3P 3 G2O 求解 PnP 3 1 单目 3 2 双目 4 自定义顶点与边优化内参 4 1 二元边 4 2 三元边 4 3 总结 5 参考 PnP Perspective n Poi
  • 高斯牛顿法求非线性最小二乘的步骤和c++代码实现

    slam图优化的本质是一个非线性优化问题 Gauss Newton求解步骤 1 线性化误差函数 2 构建线性系统 3 求解线性系统 4 更新解 并不断迭代直至收敛 一个简单的代码实现 一维参数xy 高维变为对应的矩阵即可 include
  • Eigen::aligned_allocator

    如果STL容器中的元素是Eigen库数据结构 例如这里定义一个vector容器 元素是Matrix4d 如下所示 vector
  • LeGO-LOAM代码详细注释版

    学习LeGO LOAM时 写的代码注释github代码链接 一部分注释来自github用户wykxwyc 一部分来自网上查阅 还有一部分是自己的理解 持续更新中
  • docker dbus-x11

    本来想用terminator启动nvidia docker 显示出图形界面的 结果发现启动的时候出问题了 terminator 1 dbind WARNING 07 31 53 725 Couldn t connect to accessi
  • 二.全局定位--开源定位框架livox-relocalization实录数据集测试

    相关博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 二十五 SLAM中Mapping和Localization区别和思考 goldqiu的博客 CSDN博客 基于固态雷达的全局
  • 将 ORB 特征与阈值进行匹配

    我的项目是基于android的草药识别 我使用 ORB 来获取关键点 特征并匹配特征 我想使用这个算法 我使用 4 个参考图像 并将它们的特征 image1 与 image1 1 2 1 3 1 4 2 3 3 4 进行匹配 然后我将到数据
  • OpenCV无法绘制关键点

    我尝试运行所示的示例代码ORB in the openCV页 首先我必须弄清楚问题cv2 ORB 变成cv2 ORB create 出现此错误后 出现以下内容 Traceback most recent call last File orb

随机推荐

  • CAN总线网络的传输模式

    CAN总线网络的传输模式根据触发条件的不同 xff0c 在车身CAN网络中可分为事件型 周期性及混合型三种传输模式 xff1b 1 事件型传输模式 xff1a 随着类型或数据的转变及时发送的消息 此类型消息的好处是极少占用总线资源 xff0
  • matlab中m文件的命名规则

    matlab的m文件的命名规则 xff1a 1 文件名命名要用英文字符 xff0c 首字符不能是数字或下划线 xff1b 2 文件名不能与matlab的内部函数名相同 m文件名的命名尽量不要是简单的英文单词 xff0c 最好是由大小写英文
  • 2014去哪儿校招笔试

    共 3 43 2 43 2 个题 开发 前3 个必做 xff0c 其他选做 测试或web 开发 前 2 个必做 43 另外 2 个必做 1 字符串split 43 翻转 2 实现 访问历史记录 xff0c insert next pre 3
  • MicroStrategy笔试

    1 coding判定二叉树是否是有序二叉树 2 一个有序数组A xff08 buffer 足够大 xff09 xff0c 和一个有序数组 B xff0c 设计算法 xff0c merge 两个数组后有序 xff0c 不使用任何额外的内存空间
  • 欢迎使用CSDN-markdown编辑器

    能力培养 与team leader讨论 xff0c 大抵将能力培养分成三类 业务能力 解决具体反馈的问题 xff1b 总结通用的解决方案 xff1b 从根本上改善根本问题技术能力 设计架构的能力 xff0c 注重性能的改善泛化能力 明确问题
  • 一些5G整理

    鲁棒性 设计 相对于终端成本 xff0c 网络掉线的损失是行业客户是不可接受的 xff0c 所以行业终端鲁棒性设计很重要 这里的鲁棒性是指排除了前述的散热 环境可靠性等自身设计后面对其他突发未知情况的还能可靠应用的能力 业内对于鲁棒性的设计
  • ES设置多个自定义分词器,每个分词器使用不同的词库

    ES中如何设置自定义分词器并且每个分词器使用自己定义的词库 xff1f 1 首先在ansj cfg yml中配置 然后在ansj library properties文件中添加词典放置路径 ansj library properties和l
  • 开发原则

    1 提供完整的数据 xff0c 不需要调用者进行额外的处理 2 测试 xff0c 保证比较对象要都是真实正确的 3 以业务需求为驱动 xff0c 兼顾系统架构升级
  • Windows下多台电脑共享剪切板的方法

    转自于 http www microsoft com china MSDN library WebServices WebServices WebServices mspx mfr 61 true
  • Cisco Packet Tracer模拟器使用

    第一篇 熟悉界面 一 设备的选择与连接 在界面的左下角一块区域 xff0c 这里有许多种类的硬件设备 xff0c 从左至右 xff0c 从上到下依次为路由器 交换机 集线器 无线设备 设备之间的连线 xff08 Connections xf
  • 各种路由器接口与连接方法

    转自于 http bbs pcsoft com cn thread 138952 1 4 html 路由器所在的网络位置比较复杂 xff0c 既可是内部子网边缘 xff0c 也可位于内 外部网络边缘 同时为了实现强大的适用性 xff0c 它
  • line vty 0 4 什么意思

    转自于 http hi baidu com rxlly blog item 9072bc397ae18bde7c1e71f6 html line vty 0 4是不是指启用5个telnet会话的意思 xff1f 那line vty 0 0是
  • matlab实现牛顿迭代法求解非线性方程组

    http hi baidu com aillieo blog item 0800e2a10ac9a59647106493 html 已知非线性方程组如下 3 x1 cos x2 x3 1 2 61 0 x1 2 81 x2 43 0 1 2
  • 区别 chown和chmod的用法

    本人总是习惯使用chmod xff0c 而把chown混淆 chown就是修改 第一列内容的 xff0c chmod是修改 第3 4列内容的 chown用法 用来更改某个目录或文件的用户名和用户组的 chown 用户名 组名 文件路径 xf
  • Linux中安装新的包时错误提示

    错误1 E Could not open lock file var lib dpkg lock open 13 Permission denied E Unable to lock the administration directory
  • django框架简介

    主要内容 1 Django框架发展 2 Django架构 MTV模式 3 开发流程 4 开发实例 Poll python下各种框架 一个完整的Web应用框架包括下面功能的支持 服务发布 URL分发 模板支持 数据库处理 Python框架一般
  • 用VirtualBox打开VMware创建的虚拟机的方法

    方法一 xff1a 用VMware7 0以上版本 xff0c 自带的 ovftool exe 工具将 vmx 文件转化成 ovf 文件 命令格式 xff1a ovftool vmx文件完整路径 要存放ovf 文件的路径 注意 xff1a 源
  • 松灵学院 | 在松灵 LIMO 上使用 Docker 进行 ROS2 开发

    截至目前 xff0c Jetson Nano 平台官方仍不提供 Ubuntu 20 04 固件 xff0c 所以使用 Jetson Nano 平台开发 ROS2 存在巨大的困难 xff0c 但是好在 Docker 提供的容器技术 xff0c
  • 2019学习计划

    1 数据结构与算法 2 架构设计
  • ORB-SLAM(1) --- 让程序飞起来

    1 ORB SLAM简介 ORBSLAM是15年出的比较完备的单目slam算法 xff0c orb指的是一种旋转不变性特征 xff0c 整个算法均是基于orb特征实现的 xff0c 不同于基于稠密或半稠密地图的slam orbslam是一个