基于ORB-SLAM2+RTAB-MAP+ROS的三维重建设计——环境配置与安装

news2024/11/18 9:00:20

写下这篇是为了毕设题目《基于深度相机的电缆识别系统》。使用的设备与环境如下:

  • Ubuntu 20.04

  • ROS

  • Gazebo仿真运行

  • Kinect 2.0

ORB-SLAM2论文地址:https://arxiv.org/abs/1610.06475

GitHub:https://github.com/raulmur/ORB_SLAM2

一、为什么要选择ORB-SLAM2


ORB-SLAM2:一种单目、立体和RGB-D相机的开源SLAM系统。该开源库具有一下特征:

  • 支持单目,双目,RGB相机

  • 实时计算相机位姿和稀疏的三维重建,可进行回环检测和相机重定位。

  • 提供运行示例:配置安装号后,可直接在KITTI、TUM、EUROC数据集中的视频序列下运行。

  • 可在ros中进行编译,也可以不在ros中进行编译。(只是在数据集上运行,不需要ros;如果需要与真实摄像头连接,则需要ros)

  • 支持轻量级定位模式,可以达到零漂移,此时不使用局部建图和回环检测的线程,可以用视觉里程计来跟踪未建图区域。

  • 使用本质图(Essential Graph)来优化位姿实现回环检测,耗时少精度高 。相比于直接法,可以用于宽基线特征匹配,更适合于对深度精度要求较高的场景,比如三维重建。

KITTI数据集:https://www.cvlibs.net/datasets/kitti/eval_odometry.php

TUM数据集:https://vision.in.tum.de/data/datasets/rgbd-dataset/download

二、ORB-SLAM2环境配置


(1)换源


sudo cp /etc/apt/sources.list /etc/apt/sources.list.old

备份一下以前使用的源,之后打开文件进行换源:

sudo gedit /etc/apt/sources.list

推荐使用清华源:https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/,到网站上复制对应的源进行更换:

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

之后更新源:

sudo apt-get update

(2)安装第三方库


2.1 必要依赖项

sudo apt-get upate
sudo apt-get install git gcc g++ vim make cmake

2.2 安装Pangolin

Pangolin是一个用来可视化的库,ORB-SLAM2用它来进行可视化和人机交互。其下载与安装教程可见:https://github.com/stevenlovegrove/Pangolin。Pangolin是对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的库。可以用于3D视觉和3D导航的视觉图,可以输入各种类型的视频、并且可以保留视频和输入数据用于debug。

安装Pangolin 0.6稳定版:https://github.com/stevenlovegrove/Pangolin/archive/refs/tags/v0.6.zip

安装以下依赖项:

sudo apt-get install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libpng-dev

打开下载好的Pangonlin,配置并编译:

cd Pangolin
mkdir build && cd build
cmake -DCPP11_NO_BOOST=1 ..
make
sudo make install

验证是否安装成功:

cd ../examples/HelloPangolin
mkdir build && cd build
cmake ..
make
./HelloPangolin

出现这个代表配置成功:

2.3 安装Opencv3

OpenCV肯定是必不可少的了。其下载和安装教程可见:(https://opencv.org/releases/)。找到需要的OpenCV版本,对于Linux系统,应点击其中Sources,下载一个压缩文件,下载完成后应对其进行解压。其安装教程可见:(https://docs.opencv.org/4.2.0/d7/d9f/tutorial_linux_install.html)。ORB-SLAM2要求至少为2.4.3,这里安装Opencv3.4.5,在GitHub中找到对应的release:https://github.com/opencv/opencv/releases

首先需要配置一些依赖:

sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu xenial-security main"
sudo apt update
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev 
sudo apt-get install libavformat-dev libjpeg.dev libtiff5.dev 
sudo apt-get install libswscale-dev libjasper-dev 
sudo apt-get install libcanberra-gtk-module libcanberra-gtk3-module 
#或者
sudo apt-get install libcanberra-gtk*

解压下载好的压缩包,并且进入目录:

mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
#电脑性能差的话,去掉-j4,性能很好可增加数字
make -j4
sudo make install

查询opencv是否安装成功:

pkg-config --modversion opencv
pkg-config --cflags opencv
pkg-config --libs   opencv

2.4 安装Eigen3

Eigen3负责矩阵运算,是一个纯头文件的库,直接安装即可:

sudo apt-get install libeigen3-dev

如果使用源码安装的话,可以去https://github.com/eigenteam/eigen-git-mirror,下载源码后:

cd eigen3
mkdir build && cd build
cmake ..
make
sudo make install

安装后头文件在于:

/usr/local/include/eigen3/

复制头文件到/usr/local/include:

sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include

2.5 DBW2 and g2o

这个库已经包含在ORB-SLAM2中的第三方库文件夹中,不需要自己编译安装。

2.6 ROS

添加ros源:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

添加密钥:

sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654

更新软件源:

sudo apt update

安装ros,要记得根据Ubuntu的版本来进行选择:

sudo apt install ros-noetic-desktop-full
sudo apt install python3-rosdep2
sudo rm /etc/ros/rosdep/sources.list.d/20-default.list

新版本的ros不需要执行init以及update,设置环境变量:

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

加载软件包:

sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool

验证ros是否安装成功:

roscore

出现这种问题说明没有安装成功:

sudo apt install ros-noetic-roslaunch
sudo apt install ros-noetic-rosbash
sudo apt install ros-noetic-turtlesim

之后再次运行即可:

打开一个新的终端运行:

rosrun turtlesim turtlesim_node

再打开一个新的终端运行:

rosrun turtlesim turtle_teleop_key

安装成功:

2.7 安装ORB-SLAM2

从GitHub上下载源文件:

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

之后打开文件夹执行:

chmod +x build.sh
./build.sh

之后会看到如下报错:

这是因为缺少了一些Linux的头文件,在目录/ORB_SLAM2/include/System.h中加入对应的头文件:

其他报错可于这篇文章中找到解决方法:https://blog.csdn.net/weixin_43693946/article/details/123366935

这篇也可以:https://zhuanlan.zhihu.com/p/411027681

出现第二个错误:

添加头文件:#include <unistd.h>

做出替换:

typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<KeyFrame *const, g2o::Sim3> > > KeyFrameAndPose;

成功界面如下:

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

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

相关文章

python多线程网络编程

背景 使用过flask框架后&#xff0c;我对request这个全局实例非常感兴趣。它在客户端发起请求后会保存着所有的客户端数据&#xff0c;例如用户上传的表单或者文件等。那么在很多客户端发起请求时&#xff0c;服务器是怎么去区分不同的request对象呢&#xff1f;当查看了大量的…

Android 8请求权限时弹窗BUG

弹窗BUG 应用使用requestPermissions申请权限时&#xff0c;系统会弹出一个选择窗口&#xff0c;可进行允许或拒绝&#xff0c; 此窗口中有一个”不再询问“的选择框&#xff0c; ”拒绝”及“允许”的按钮。 遇到一个Bug,单点击“不再询问”&#xff0c;“允许”这个按钮会变…

OpenAPI SDK组件介绍

背景 公司成立以来&#xff0c;积累了数以万计的可复用接口。上层的SaaS业务&#xff0c;原则上要复用这些接口开发自己的业务&#xff0c;为了屏蔽调用接口的复杂性&#xff0c;基础服务开发了apisdk组件&#xff0c;定义了一套声明OpenAPI的注解、注解解析器&#xff0c;实例…

【蓝牙mesh】Bearer层(承载层)介绍

【蓝牙mesh】Bearer层&#xff08;承载层&#xff09;介绍 Bearer层简介 蓝牙Mesh协议栈由多个不同的协议层组成&#xff0c;其中最底层的协议就是Bearer层&#xff0c;它负责提供数据传输的底层支持。蓝牙Mesh协议栈的最底层就是BLE协议栈&#xff0c;所以Bearer层是直接与BL…

GO 中的 defer 有哪些注意事项?下

上次一起写了 3 个案例&#xff0c;咱们这一次继续&#xff0c;这一次的会比上一次的稍微不太一样 案例 1 还有一个也非常常用的案例&#xff0c;使用 defer 来捕获异常 &#xff0c;也就是当程序崩溃的时候&#xff0c;defer 语句可以帮我们兜底&#xff0c;可以捕获异常后按…

vscode 配置 codeql

1、安装配置 codeql 环境 1.1 下载 codeql-cli 和 codeql 标准库 1&#xff09;下载安装 下载安装 codeql-cli: Releases github/codeql-cli-binaries GitHub 下载 codeql 标准库&#xff1a;https://github.com/gi thub/codeql 下载的安装包解压&#xff0c;codeql 可执…

二,从源代码开始编译安装iperf3

本文目录Linux系统中编译安装基本知识简介第一步&#xff0c;执行configure第二步&#xff0c;执行make第三步&#xff0c;make install其它功能说明Linux系统中编译安装基本知识简介 从前一文章"一&#xff0c;下载iPerf3最新源代码"我们已经知道如何通过git的方式…

Linux系统下命令行安装MySQL5.6+详细步骤

1、因为想在腾讯云的服务器上创建自己的数据库&#xff0c;所以我在这里是通过使用Xshell 7来连接腾讯云的远程服务器&#xff1b; 2、Xshell 7与服务器连接好之后&#xff0c;就可以开始进行数据库的安装了&#xff08;如果服务器曾经安装过数据库&#xff0c;得将之前安装的…

干货 | 八条“黄金规则”解决RF电路寄生信号

PART 01 接地通孔应位于接地参考层开关处流经所布线路的所有电流都有相等的回流。耦合策略固然很多&#xff0c;不过回流通常流经相邻的接地层或与信号线路并行布置的接地。在参考层继续时&#xff0c;所有耦合都仅限于传输线路&#xff0c;一切都非常正常。不过&#xff0c;如…

MySQL关于NULL值,常见的几个坑

数据库版本MySQL8。 1.count 函数 觉得 NULL值 不算数 &#xff0c;所以开发中要避免count的时候丢失数据。 如图所示&#xff0c;以下有7条记录&#xff0c;但是count(name)却只有6条。 为什么丢失数据&#xff1f;因为MySQL的count函数觉得 Null值不算数&#xff0c;就是说…

Shader(着色)

1.深度测试&#xff08;Z-Buffer &#xff09;每个像素需要一个深度来排序是否需要渲染&#xff0c;所以需要额外的buffer来存储&#xff0c;frame buffer 存颜色&#xff0c;depth buffer (z-buffer) 存深度。2.Lambert(漫反射)3.Blinn-Phong &#xff08;高光&#xff09;4.环…

Netty权威指南总结(一)

一、为什么选择Netty&#xff1a;API使用简单&#xff0c;开发门槛低&#xff0c;屏蔽了NIO通信的底层细节。功能强大&#xff0c;预制了很多种编解码功能&#xff0c;支持主流协议。定制能力强&#xff0c;可以通过ChannelHandler对通信框架进行灵活地拓展。性能高、成熟、稳定…

一文搞定Android Vsync原理简析

屏幕渲染原理"现代计算机之父"冯诺依曼提出了计算机的体系结构: 计算机由运算器&#xff0c;存储器&#xff0c;控制器&#xff0c;输入设备和输出设备构成&#xff0c;每部分各司其职&#xff0c;它们之间通过控制信号进行交互。计算机发展到现在&#xff0c;已经出…

【Python知识点桂电版】01基本数据类型

一、变量变量定义注&#xff1a;查看变量类型->type(变量)查看变量地址->id(变量)变量命名规则只允许出现&#xff1a;英文、中文、数字、下划线&#xff08;不推荐用中文&#xff0c;不能以数字开头&#xff09;大小写敏感不可使用关键字&#xff08;如and&#xff09;和…

代码随想录【Day24】| 开始回溯!77. 组合

回溯的本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案&#xff0c;如果想让回溯法高效一些&#xff0c;可以加一些剪枝的操作&#xff0c;但也改不了回溯法就是穷举的本质。 那么既然回溯法并不高效为什么还要用它呢&#xff1f; 因为没得选&#xf…

cesium: 设置skybox透明并添加背景图 ( 003 )

第003个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中设置skybox透明并添加背景图。 我们不想要黑乎乎的背景,想自定义一个背景图,然后前面显示地球。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共70…

奇妙的background-clip:text

我们在学习CSS3时&#xff0c;一个背景属性background-clip用来对背景进行裁剪&#xff0c;即指定背景绘制的区域&#xff0c;通常我们使用的几个属性如下&#xff1a;值说明border-box默认值。背景绘制在边框方框内&#xff08;剪切成边框方框&#xff09;。padding-box背景绘…

【C++入门(上篇)】C++入门学习

前言&#xff1a; 在之前的学习中&#xff0c;我们已经对初阶数据结构进行相应了学习&#xff0c;加上之前C语言的学习功底。今天&#xff0c;我们将会踏上更高一级“台阶”的学习-----即C的学习&#xff01;&#xff01;&#xff01; 文章目录1.C 简介1.1什么是C1.2.C的发展史…

【数据库】join SQL语句原理优化

背景 在实际的开发中&#xff0c;业务相关表都是通过uid或者一个可以标记业务领域的一个属性转换成的字段进行关联的&#xff0c;但是对于一些后续的业务&#xff0c;比如数据分析、下游系统使用、金融对账等业务&#xff0c;需要进行多表联查&#xff0c;之前实际生产的时候就…

【安卓开发】内容提供器

内容提供器实现了不同程序之间实现数据共享的功能。 7.2 运行时权限 安卓6.0版本后引入了运行时权限 每个权限都属于一个组&#xff0c;授权了其中一个&#xff0c;一个组内的权限都将会被授权。 测试代码 // AndroidManifest.xml中加入以下代码 <uses-permission andr…