系统环境:Ubuntu 16.04 LTS

ROS版本:Kinetic Kame

ORB-SLAM2源码的编译部分有ROS版本和非ROS版本,非ROS版本不需要安装ROS也可以运行,主要针对离线数据集模式。而ROS版本主要针对使用摄像头的在线运行模式。

本篇博客对两种模式的配置均进行介绍,其中ROS版本的介绍包括对单目、RGBD摄像头使用方法的讲解。

参考博客:https://blog.csdn.net/u014709760/article/details/85253525

https://blog.csdn.net/learning_tortosie/article/details/79881165

https://www.cnblogs.com/shang-slam/p/6733322.html

https://blog.csdn.net/weixin_39272225/article/details/79886805

Table of Contents

1.准备工作

2.安装库

2.1安装Pangolin

2.2安装opencv

3.ORB-SLAM2安装

3.1非ROS版本下安装与测试

3.1.1非ROS版本单目测试

3.1.2非ROS版本RGBD测试

3.2 ROS版本安装

3.2.2ROS版本的单目摄像头运行

3.2.3ROS版本的RGBD摄像头运行


1.准备工作

键入以下指令安装常用工具:

sudo apt-get update
sudo apt-get install git
sudo apt-get install cmake
//vim不是必须的,但是是个很方便编辑文本的工具
sudo apt-get install vim

键入以下指令安装Pangolin所需的依赖项,Pangolin是用于可视化的工具和用户界面:

sudo apt-get install libglew-dev libpython2.7-dev

键入以下指令安装Opencv所需的依赖项:

sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev

键入以下指令安装Eigen3库:

sudo apt-get install libeigen3-dev

2.安装库

2.1安装Pangolin

键入以下指令下载Pangolin包(路径自行选择):

git clone https://github.com/stevenlovegrove/Pangolin.git

在安装包所在目录下键入以下指令进行安装:

cd Pangolin
mkdir build
cd build
cmake ..
//建议电脑配置不是很高的不要加 -j
make –j
sudo make install

2.2安装opencv

在opencv官网上下载opencv安装包,这里提醒两个问题。

第一个是,安装过ROS的同学可以先跳过这一步,因为ROS自带了opencv的包。

第二个是,网上大多教程都说opencv3版本会出现不兼容的问题,所以建议大家下载opencv2.4.xx版本的。这里有opencv2.4.13.6的官网:https://github.com/opencv/opencv/tree/2.4.13.6

3.ORB-SLAM2安装

首先说明一下,非ROS版本不依赖ROS,但如果读者需要对二者都进行使用的话,需要先按照ROS版本安装过程来编译,然后再回过头来按照非ROS版本操作。

3.1非ROS版本下安装与测试

键入以下指令下载源文件(路径自行选择):

git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2

在源文件所在目录下键入以下指令进行编译:

cd ORB_SLAM2
chmod +x build.sh
./build.sh

3.1.1非ROS版本单目测试

首先下载数据集(路径自行选择,我放在了ORB-SLAM2工程目录下):https://vision.in.tum.de/data/datasets/rgbd-dataset/download

在ORB-SLAM2目录下键入以下指令单目运行:

./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml rgbd_dataset_freiburg1_desk/

第一个参数为系统的主程序执行文件

第二个参数为特征词典

第三个参数为相机参数:后续如果要使用自己的数据集,是需要修改这个文件的。而这个地方,也需要注意你下载的数据集和相机参数文件对应,rgbd_dataset_freiburg1_desk里的数字是1,所以对应的是TUM1。

第四个参数为数据集路径:此处我就放在了当前目录下

3.1.2非ROS版本RGBD测试

同样是用官网数据集。

首先键入以下命令进入数据集目录:

cd rgbd rgbd_dataset_freiburg1_desk

新建一个文本文档associate.py并键入以下代码,保存:

#!/usr/bin/python
# Software License Agreement (BSD License)
#
# Copyright (c) 2013, Juergen Sturm, TUM
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
#  * Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
#  * Redistributions in binary form must reproduce the above
#    copyright notice, this list of conditions and the following
#    disclaimer in the documentation and/or other materials provided
#    with the distribution.
#  * Neither the name of TUM nor the names of its
#    contributors may be used to endorse or promote products derived
#    from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Requirements:
# sudo apt-get install python-argparse"""
The Kinect provides the color and depth images in an un-synchronized way. This means that the set of time stamps from the color images do not intersect with those of the depth images. Therefore, we need some way of associating color images to depth images.For this purpose, you can use the ''associate.py'' script. It reads the time stamps from the rgb.txt file and the depth.txt file, and joins them by finding the best matches.
"""import argparse
import sys
import os
import numpydef read_file_list(filename):"""Reads a trajectory from a text file. File format:The file format is "stamp d1 d2 d3 ...", where stamp denotes the time stamp (to be matched)and "d1 d2 d3.." is arbitary data (e.g., a 3D position and 3D orientation) associated to this timestamp. Input:filename -- File nameOutput:dict -- dictionary of (stamp,data) tuples"""file = open(filename)data = file.read()lines = data.replace(","," ").replace("\t"," ").split("\n") list = [[v.strip() for v in line.split(" ") if v.strip()!=""] for line in lines if len(line)>0 and line[0]!="#"]list = [(float(l[0]),l[1:]) for l in list if len(l)>1]return dict(list)def associate(first_list, second_list,offset,max_difference):"""Associate two dictionaries of (stamp,data). As the time stamps never match exactly, we aim to find the closest match for every input tuple.Input:first_list -- first dictionary of (stamp,data) tuplessecond_list -- second dictionary of (stamp,data) tuplesoffset -- time offset between both dictionaries (e.g., to model the delay between the sensors)max_difference -- search radius for candidate generationOutput:matches -- list of matched tuples ((stamp1,data1),(stamp2,data2))"""first_keys = first_list.keys()second_keys = second_list.keys()potential_matches = [(abs(a - (b + offset)), a, b) for a in first_keys for b in second_keys if abs(a - (b + offset)) < max_difference]potential_matches.sort()matches = []for diff, a, b in potential_matches:if a in first_keys and b in second_keys:first_keys.remove(a)second_keys.remove(b)matches.append((a, b))matches.sort()return matchesif __name__ == '__main__':# parse command lineparser = argparse.ArgumentParser(description='''This script takes two data files with timestamps and associates them   ''')parser.add_argument('first_file', help='first text file (format: timestamp data)')parser.add_argument('second_file', help='second text file (format: timestamp data)')parser.add_argument('--first_only', help='only output associated lines from first file', action='store_true')parser.add_argument('--offset', help='time offset added to the timestamps of the second file (default: 0.0)',default=0.0)parser.add_argument('--max_difference', help='maximally allowed time difference for matching entries (default: 0.02)',default=0.02)args = parser.parse_args()first_list = read_file_list(args.first_file)second_list = read_file_list(args.second_file)matches = associate(first_list, second_list,float(args.offset),float(args.max_difference))    if args.first_only:for a,b in matches:print("%f %s"%(a," ".join(first_list[a])))else:for a,b in matches:print("%f %s %f %s"%(a," ".join(first_list[a]),b-float(args.offset)," ".join(second_list[b])))

这个python代码是用来生成深度图、彩色图文件路径匹配的信息文件的。

在终端键入以下指令生成结合信息文件:

python associate.py rgb.txt depth.txt > associations.txt

返回ORB-SLAM2目录下,键入以下指令RGBD运行:

./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml rgbd_dataset_freiburg1_desk/ rgbd_dataset_freiburg1_desk/associations.txt

注意此命令各文件的路径,与单目有所不同,并且增加了第五个参数,就是刚刚生成的associations.txt文件。

3.2 ROS版本安装

键入以下指令创建工作空间文件夹及其源文件夹(路径自行选择,此处就放在当前用户目录下):

mkdir -p ~/catkin_ws/src

键入以下命令进行工作空间编译:

cd catkin_ws
catkin_make

将ORB-SLAM2源文件夹放在src下。

键入以下指令添加环境变量,PATH为所在路径,请自行修改:

export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS

键入以下命令打开./bashrc文件:

sudo gedit ~/.bashrc

在文件末尾加入以下代码并保存,其中USERNAME请改为当前用户名:

source /home/USERNAME/catkin_ws/devel/setup.sh

在终端中键入以下指令使其生效:

source ~/.bashrc

在ORB-SLAM2目录下键入以下指令进行ROS版本的编译:

$ chmod +x build_ros.sh
$ ./build_ros.sh

可能出现的错误:

undefined reference to symbol '_ZN5boost6system15system_categoryEv'

解决办法:

在Examples/ROS/ORB_SLAM2/CMakeList.txt当中修改:

加入以下两句:

find_package(Boost COMPONENTS filesystem system REQUIRED)#加在其他find_package下面
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${Boost_LIBRARIES} #加的是这句
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
)

保存后再编译,此时可以编译成功,但使用摄像头进行实时运行还需要安装一些其他依赖,我将在另一篇博客里讲解。

3.2.2ROS版本的单目摄像头运行

键入以下命令转到当前catkin_ws下的src中,再键入以下指令安装usb_cam:

cd ~/catkin_ws/src
git clone https://github.com/bosch-ros-pkg/usb_cam.git usb_cam

再键入以下命令转到catkin_ws目录下,重新进行make,并重新开启:

cd ~/catkin_ws/
catkin_make
source ~/catkin_ws/devel/setup.bash

键入以下命令就可以看到摄像头了:

roslaunch usb_cam usb_cam-test.launch

此时显示的是你的自带摄像头,如果想外接usb摄像头,请在usb_cam/launch/usb_cam-test.launch中,将以下这句里的videoX(X为序号)修改为对应设备的序号。一般来说vide0是自带摄像头,video1是外接摄像头。

<param name="video_device" value="/dev/video1" />

如果你成功看到图像,说明测试成功了。

但自己摄像头是需要内参标定的,在此介绍一下ROS下的标定过程:

按照如上操作打开摄像头显示图像后,键入以下命令打开标定窗口:

 rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.025 image:=/usb_cam/image_raw camera:=/usb_cam

这里我们需要准备一张打印好的棋盘标定板,size 8*6指的是8*6的棋盘网格,square 0.0245指的是棋盘格一个正方形格子是2.45厘米,可根据实际情况修改。这里有下载链接:http://wiki.ros.org/camera_calibration/Tutorials/MonocularCalibration?action=AttachFile&do=view&target=check-108.pdf

我们需要拿着标定板在摄像机能捕捉到的各个方位移动,同时还要注意倾斜标定板,等到X、Y、Size、Skew的进度条都变绿以后,点击CALIBRATE按钮,此时后台进行计算。等到计算完毕后,除carlibrate的两个按钮也都点亮了,点击commit即可。

此时相机的内参信息保存在~/.ros/camera_info/head_camera.yaml中,将此文件复制到ORB-SLAM2的文件夹下,并按照Examples/Monocular/TUM1.yaml的格式修改。各个数据的对应关系请参考opencv标定的内参矩阵的形式,其实数值范围一般很好看出对应关系。

此时,还需要修改一个地方,即修改Examples/ROS/ORB_SLAM2/src/ros_mono.cc中的/camera_cam/image_raw为/usb_cam/image_raw。

重新编译。

键入以下指令即可在线运行单目相机模式:(C920是我自己的相机内参文件)

rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt C920.yaml

3.2.3ROS版本的RGBD摄像头运行

我的rgbd摄像头型号为:华硕 Xtion PRO LIVE,步骤如下:

安装openni2:

sudo apt-get install ros-kinetic-openni2-camera
sudo apt-get install ros-kinetic-openni2-launch

打开openni2:

roslaunch openni2_launch openni2.launch

键入以下命令即可在线运行RGBD相机模式:(同样,最后一个文件是我自己的内参文件,如果没有的话需要标定)

rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM2/Asus.yaml 

ORB-SLAM2环境配置以及运行详解(一):ROS与非ROS环境下的安装、编译、离线数据集测试相关推荐

  1. python3.6安装教程-python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

  2. python详细安装教程环境配置-python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

  3. python3.6.0怎么安装pip_python3.6环境安装+pip环境配置教程图文详解

    1.python安装可以跨平台 2.有两个版本2.7和3.6,第三方库适用2.7版,两个版本不兼容 windows安装: 第一种方法官网安装: 在官网下载安装包如图: 图下点击是默认下载32位所以我们 ...

  4. Android + Appium 自动化测试完整的环境配置及代码详解

    环境的的搭建 参考大神博客:https://www.cnblogs.com/fnng/p/4540731.html 该博客有一套详细的入门教程,奈何时间有点久远有些东西不能用了,但是参考价值还是有滴. ...

  5. symbian VC环境配置及其helloword详解

    a:vc6.0(自己想办法买或者下)和Vs6sp6(下载)( 微软网站) b:s60_2nd_fp2_sdk_msb(www.forum.nokia.com) c:activeperl最新(http: ...

  6. pycharm+python3.7+pyqt配置_Python3+Pycharm+PyQt5环境搭建步骤图文详解

    搭建环境: 操作系统:Win10 64bit Python版本:3.7 Pycharm:社区免费版 一.Python3.7安装 下载到安装包后打开,如果想安装到默认路径(C盘)的话一直点下一步就可以了 ...

  7. 大型企业网络配置系列课程详解(五) --Frame-Relay配置与相关概念的理解

    大型企业网络配置系列课程详解(五)             --Frame-Relay配置与相关概念的理解   实验原理: Frame-Relay(帧中继)简称FR,是国际电信联盟通信标准化组(ITU ...

  8. vue-cli脚手架中webpack配置基础文件详解

    一.前言 vue-cli是构建vue单页应用的脚手架,输入一串指定的命令行从而自动生成vue.js+wepack的项目模板.这其中webpack发挥了很大的作用,它使得我们的代码模块化,引入一些插件帮 ...

  9. ureport2 mysql_Ureport2 安装,配置及问题详解

    Ureport2 安装,配置及问题详解 本文详细介绍了笔者Ureport2的 安装,配置以及在此过程中遇到的问题和解决方法. 本安装 基于 IDEA+SpringBoot, 存储使用mysql数据库 ...

最新文章

  1. 【JAVA零基础入门系列】Day2 Java集成开发环境IDEA
  2. Web应用渗透测试框架Arachni
  3. 全球地区资料json 含中英文 经纬度_含乳饮料行业发展趋势及市场化程度分析(附报告目录)...
  4. [Lintcode]136. Palindrome Partitioning /[Leetcode]131. Palindrome Partitioning
  5. 春运火车票开抢:打着“加速包”名号就算“合法黄牛”了吗?
  6. python中ttk详解_Python 中的Property 动态属性和特性详解
  7. C语言根据汉字拼音首字母排序
  8. UML类图中实线虚线的指向关系
  9. ggplot2---绘制地图
  10. 如何用Python写一个小游戏(1)
  11. python获取第一个字符_Python:获取列表中第一个字符串的第一个字符?
  12. 如何在微信自定义链接分享内容,图文链接xml卡片生成代码,制作微信卡片实现自定义标题,描述,缩列图以供转发
  13. 在 Jupyter Notebook 中使用R语言
  14. joinus计算机怎么弄游戏,美国us计算机专业学校排名:joinus学生计算机如何消除sci...
  15. 几个不错的网站(仓库,资源)
  16. 大力智能学习灯,护眼助学有诀窍
  17. 使用正则表达式验证银行帐号
  18. 计算机休眠设置电源开关,电脑中的待机、休眠、睡眠和关机状态的区别。
  19. KCP协议 详解***
  20. 出海美利坚 不可忽视的未成年人法律红线

热门文章

  1. Nginx服务模块开发
  2. 2021年12月电子学会青少年软件编程(图形化)等级考试试卷(一级)答案解析
  3. c# 两个数组拼接_C#对多个集合和数组的操作方法(合并,去重,判断)
  4. 自己建服务器 语音盒子_自建语音服务器
  5. 帷幄DAM - 直播营销引流 分析直播引流推广的技巧
  6. 多线程下载图片并压缩
  7. 基于Python+django的航班查询与推荐-计算机毕业设计
  8. C语言mum,Mum
  9. 计算机网络概论(不完整版,突然想随便写写)
  10. 软件大全下载整理(更新中)