复现ORB_SLAM1和ORB_SLAM2算法

SLAM代码复现——orbslam

简介

定义

SLAM即Simultaneous Localization and Mapping(同时定位与地图构建)的缩写,它是一种用于移动机器人或自主驾驶车辆等智能系统中的算法和技术,旨在实现机器人同时定位自身在未知环境中并构建环境地图的能力。

解决的核心问题

在机器人没有预先知识的情况下,通过传感器获取的数据,同时估计机器人的位置(定位)和环境的结构(地图),并且不断地更新这些估计值。

所用工具——intel RealSense D435i:一款具有深度感知能力的相机,它可以提供RGB图像和深度图像。具体作用如下:

  • 深度感知
    • D435i相机配备了一对红外摄像头和红外投影器,能够生成深度图像。通过红外光的投影和红外摄像头的接收,相机能够计算出场景中每个像素点的距离信息,从而产生精确的深度图像。
    • 深度图像的分辨率为1280x720,可以捕捉细节丰富的环境深度信息,适用于许多计算机视觉任务和感知应用。
  • RGB图像
    • D435i相机还拥有一个RGB摄像头,提供分辨率为1920x1080的彩色图像。这使得相机可以同时获取深度图像和彩色图像,从而获得视觉和深度信息的结合。
    • 彩色图像可用于识别和跟踪物体,进行图像分割和分类等计算机视觉任务。
  • 内置IMU
    • D435i相机配备了**惯性测量单元(IMU)**,包括加速度计、陀螺仪和磁力计等传感器。这些传感器可以提供相机的姿态、加速度和角速度等运动信息。
    • 结合深度图像和IMU数据,可以实现更精确的位姿估计和运动跟踪。
  • 精确的时间同步
    • D435i相机具有精确的硬件时间同步功能,可确保深度图像、彩色图像和IMU数据之间的时间对齐。这对于数据融合和姿态估计非常重要,提供更准确和一致的感知数据。

分类

  • 视觉SLAM:使用视觉信息进行定位和地图构建的SLAM方法。它主要依赖于摄像头获取的视觉数据,例如图像和特征点等。视觉SLAM的基本原理是**通过对连续图像帧之间的特征点进行匹配,估计相机的运动和环境的结构,从而实现定位和地图构建**
    • 优势:视觉SLAM的优势包括低成本(相机普遍易得)、广泛的应用范围和较好的可扩展性。它适用于许多场景,包括室内和室外环境,可以在不同类型的摄像头(单目、双目或多目)上实现。一些常见的视觉SLAM算法包括ORB-SLAM、LSD-SLAM、SVO、PTAM等。
  • 深度SLAM:利用深度传感器(例如激光雷达、结构光、时间飞行相机)获取的场景深度信息来进行定位和地图构建的SLAM方法。深度传感器提供了每个像素点的距离信息,使得SLAM系统能够更准确地估计相机的位置和环境的结构。深度SLAM的基本原理是**通过深度传感器获取场景深度信息,利用特征提取与跟踪、运动估计和地图构建等步骤,实现同时定位与地图构建的过程。**
    • 优势:对深度信息的直接利用,可以提供更准确的3D环境建模和姿态估计。它在存在纹理缺失、光照变化和动态场景等情况下通常比视觉SLAM更鲁棒。一些常见的深度SLAM算法包括ElasticFusion、KinectFusion、InfiniTAM等。

这次需要实现的就是视觉SLAM中的ORB-SLAM三大算法。

原理讲解

基本原理:

  1. 传感器获取数据:获取环境的感知数据,SLAM系统通常使用各种传感器,如相机、激光雷达、惯性测量单元(IMU)等。
  2. 前端感知:提取关键特征,通过对传感器数据进行处理和分析,前端感知模块提取关键特征,如特征点、线、平面等,用于定位和地图构建。
  3. 自身定位:估计自身的姿态和位置,SLAM系统通过分析传感器数据中的特征点或其他特征,并结合已知地图信息,估计自身的姿态和位置。
  4. 地图构建:利用感知数据中提取的特征点和自身定位信息,SLAM系统逐步构建环境的地图模型。地图可以是二维的平面地图、三维的点云地图或更复杂的拓扑结构。
  5. 数据关联:通过比较当前帧的感知数据和已构建的地图,SLAM系统尝试将新的观测数据与已知地图进行关联,以进一步提高定位和地图的精度。
  6. 闭环检测与校正:SLAM系统会周期性地进行闭环检测,即检测到之前访问过的场景或地点。一旦发现闭环,系统将校正先前的定位误差,并更新地图以提高一致性和准确性。
  7. 后端优化:通过图优化等算法,SLAM系统对定位和地图进行全局优化,以减小累积误差并提高整体一致性。

IMU:一种集成了多个惯性传感器的装置,用于测量物体的加速度和角速度,结合相关算法进行姿态估计、运动跟踪、导航等应用。

  • 加速度计(Accelerometer):用于测量物体在三个空间维度上的线性加速度。加速度计可以检测物体的加速度变化,并提供关于物体的运动状态的信息。

  • 陀螺仪(Gyroscope):用于测量物体绕三个空间维度的旋转角速度。陀螺仪可以检测物体的旋转速度和方向变化,并提供关于物体的旋转状态的信息。

  • 磁力计(Magnetometer):用于测量物体周围的磁场强度。磁力计可以提供物体在地球磁场中的定向信息,用于辅助姿态估计和导航。

前端感知:从传感器数据中提取环境信息并进行实时的感知和建图。

  1. 视觉传感器数据获取:通过相机捕获环境中的图像数据。相机可以是单个相机或双目/多目相机系统。
  2. 视觉特征提取与跟踪:对相机图像进行特征提取,通常使用特征描述子(ORB)来表示关键点。然后,通过跟踪算法(如光流、特征匹配)追踪关键点在连续帧之间的运动。
  3. 视觉里程计估计:通过关键点的运动估计计算相机在连续帧之间的相对运动,从而得到相机的位姿估计。这个过程通常被称为视觉里程计或相机运动估计。
  4. IMU数据融合:将惯性传感器(如加速度计和陀螺仪)提供的姿态和加速度信息与视觉里程计估计进行融合,以提高姿态估计的准确性和稳定性。常用的融合算法包括卡尔曼滤波和扩展卡尔曼滤波。
  5. 地图构建:利用前端感知提取的特征和相机姿态估计,通过三角化等技术构建环境的稀疏或稠密地图。地图可以是二维或三维的,用于后端优化和路径规划。

自身定位:

  • 位姿估计:利用特征点的匹配关系,通过解算问题(如PnP问题)或迭代优化(如RANSAC算法)来估计相机的姿态变换(旋转和平移)。
  • 三角化:利用匹配的特征点和相机姿态,通过三角化技术计算特征点对应的三维位置。
  • 回环检测以及闭环校正后进行位姿优化,利用非线性优化算法(如BA,Bundle Adjustment),对估计的相机位姿和地图进行全局优化,进一步提高定位的精度和稳定性。

回环检测:检测相机轨迹中是否存在回环的情况.

回环指的是相机在不同时间或位置回到先前经过的地方

目的:通过识别回环,找到相机轨迹中的重复区域,并将这些重复区域与先前的地图信息进行匹配,从而改善相机位姿估计的准确性和一致性,减少轨迹的漂移和定位误差。

步骤:

  1. 特征提取与描述子计算:从当前帧的图像中提取特征点,并计算每个特征点的描述子。
  2. 特征匹配:将当前帧的特征点与先前帧或地图中的特征点进行匹配,建立它们之间的对应关系。
  3. 相似性度量:通过度量当前帧与先前帧或地图中匹配特征点之间的相似性,例如计算特征点间的距离或相似度得分。
  4. 回环检测判定:根据相似性度量的结果,判断当前帧是否与先前的某一帧或地图中的某个位置具有足够高的相似性,从而认为发生了回环。
  5. 回环校正:如果检测到回环,系统将进行回环校正,即通过优化算法(如图优化或非线性优化),调整先前的相机位姿和地图,以修正轨迹的漂移并提高定位的准确性。

闭环校正:改善SLAM系统的精度和一致性,减少轨迹的漂移和定位误差。

步骤:

  1. 特征提取与描述子计算:从当前帧的图像中提取特征点,并计算每个特征点的描述子。
  2. 特征匹配:将当前帧的特征点与先前帧或地图中的特征点进行匹配,建立它们之间的对应关系。
  3. 相似性度量:通过度量当前帧与先前帧或地图中匹配特征点之间的相似性,例如计算特征点间的距离或相似度得分。
  4. 回环检测判定:根据相似性度量的结果,判断当前帧是否与先前的某一帧或地图中的某个位置具有足够高的相似性,从而认为发生了回环。
  5. 回环校正:如果检测到回环,系统将进行回环校正,即通过优化算法(如图优化或非线性优化),调整先前的相机位姿和地图,以修正轨迹的漂移并提高定位的准确性。

三角化技术:基于视差(disparity)的三维重建方法,用于计算两个视角下的图像特征点对应的三维坐标。

通过匹配当前帧和之前帧的特征点来计算它们对应的三维点的位置,使得ORB-SLAM算法能够从多个视角观测到的特征点计算出它们在三维空间中的位置,从而实现对场景的三维重构和地图建立。

  1. 特征匹配:首先,ORB-SLAM使用特征描述子匹配当前帧和之前帧之间的特征点。通过比较特征点的描述子,找到它们之间的最佳匹配对。
  2. 三角化计算:对于每对匹配的特征点,ORB-SLAM使用当前帧和之前帧的相机内参以及它们之间的相对位姿来进行三角化计算。三角化的目标是确定这对特征点对应的三维空间点的位置。
  3. 优化和筛选:通过三角化计算得到的三维点存在一定的误差。为了提高精度和稳定性,ORB-SLAM会对三维点进行优化和筛选。通过优化算法(例如最小二乘法)对三维点进行优化,进一步提高其精确度。同时,ORB-SLAM会进行一些筛选步骤,例如剔除误匹配点或不可靠的三维点。

三大系统线程

  1. Tracking线程:负责实时的视觉跟踪和位姿估计。它处理来自相机的图像,提取特征并进行特征匹配,通过追踪关键点的运动来估计相机的位姿。
  2. LocalMapping线程:负责局部地图的建立和更新。它接收Tracking线程提供的新的关键帧,并将关键帧的地图点添加到局部地图中,同时进行地图点的三角化、位姿优化等操作。
  3. Loop Closing线程:负责回环检测和闭环校正。它通过比较当前帧与之前的关键帧之间的相似性来检测回环,并执行闭环校正来纠正位姿漂移和提高地图的一致性。

具体情况可看下面分类中的框架图。

ORB-SLAM的分类

定义

一种基于特征的视觉SLAM算法,通过使用ORB特征提取和描述子、视觉里程计和闭环检测等技术,在实时视频流上实现相机的定位和地图构建。ORB-SLAM的优点包括实时性能、追踪效果和地图精度的改进,使其成为广泛应用于视觉SLAM领域的重要算法。

分类

  • ORB-SLAM1:单目SLAM算法,使用**ORB特征提取和描述子、视觉里程计和闭环检测等技术,实现了实时的相机定位和地图构建**。ORB-SLAM通过在帧之间进行特征匹配和跟踪来估计相机的运动,并使用回环检测来纠正漂移和提高地图的准确性。

代码框架:
在这里插入图片描述

  • ORB-SLAM2:支持双目和RGB-D SLAM。它在ORB-SLAM的基础上增加了对双目摄像头和RGB-D相机的支持利用视差信息或深度信息来提高定位和地图构建的精度。ORB-SLAM2还引入了更加精细的**关键帧选取策略**和基于尺度信息的地图初始化方法,以提高算法的性能和鲁棒性。

代码框架:

在这里插入图片描述

  • ORB-SLAM3:对ORB-SLAM2的进一步改进和扩展,引入了语义信息的利用。ORB-SLAM3结合了几何信息和语义信息,使得SLAM系统能够在具备语义标签的场景中进行定位和地图构建。它利用语义分割算法将场景分割为不同的语义类别,并将语义信息与几何信息进行融合。这样做可以提高地图的表达能力,并为场景理解和导航等应用提供更多的信息。

代码框架:

在这里插入图片描述

ORB-SLAM1的技术实现

github
参考链接1
参考链接2

ORB_SLAM1实现

orbslam主要是参考了上述两篇博客,大佬太强了,成功实现了!

首先观看顺序本人是通过同学分享的,先看第一篇,具体操作在下面在讲述一下:

STEP1:安装ros环境

确保自己的ubuntu系统下载安装好了ros系统,如果没有的话那就运行不了了,这个是大前提。

执行下述文件,注:下述文件中不要有任何变动,也不要先把orb_slam的文件放下去,否则很容易出错。如果是空的文件,一般只会在最后的source中报错,目前重复很多次没有在其他地方报错。

$ mkdir -p ~/SLAM/src
$ cd ~/SLAM/src
$ catkin_init_workspace
$ cd ..
$ catkin_make
$ echo "source ~/SLAM/devel/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

容易报错:source devel/setup.bash bash: devel/setup.bash: No such file or directory

解决方案:

vim ~/.bashrc

然后把里面多余的会这是不用的给删了(别删多了!)

STEP2:把orb_slam放进src文件下

这里我是直接在windows下好,拖进去的,注意:重命名为:ORB_SLAM,不要改成什么ORB_SLAM1,否则后面环境编译会报错。

下载地址可以去分享的博客中去下载。

STEP3:修改部分文件中的内容

(1)在ORB_SLAM1文件夹下有个manifest.xml文件,将里面的<depend package="opencv2"/>这一行删掉或注释掉。
(2)打开ORB_SLAM1/src文件夹下的ORBextractor.cc文件,添加两个头文件:

#include <opencv2/features2d/features2d.hpp>
#include <opencv2/imgproc/imgproc.hpp>

修改以上两条的原因是ROS-kinetic版本自带OpenCV3 。

(3)打开ORB_SLAM1/Thirdparty/g2o/g2o/solvers文件夹下的linear_solver_eigen.h文件,找到

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix;

将其改为:

typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic> PermutationMatrix;

原因是:Ubuntu16.04安装的Eigen库与源码自带的g2o库产生了一些不兼容的问题。

(4)打开ORB_SLAM1文件夹下的CMakeLists.txt,在target_link_libraries()中添加两个库文件:

/usr/lib/x86_64-linux-gnu/libboost_system.so
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so

STEP4:安装一些必要的库

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

这个一个一个下就好了,没有遇到报错,遇到的报错很可能是网络的问题,请确保ubuntu系统中网络的正常。

STEP5:开始编译ORB_SLAM

这里再次说明一下:我用ORB_SLAM1这个文件路径后面执行的时候运行不成功,表示找不到这个环境,我感觉是ORB_SLAM版本1中的文件设置的是ORB_SLAM索引,我们用ORB_SLAM1需要改内置文件,我不会。

$ cd ~/SLAM/src/ORB_SLAM/Thirdparty/DBoW2/
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make
$ cd ~/SLAM/src/ORB_SLAM/Thirdparty/g2o/
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make
$ cd ~/SLAM/src/ORB_SLAM/
$ mkdir build
$ cd build
$ cmake .. -DROS_BUILD_TYPE=Release
$ make

STEP6:准备数据集,准备run

下载缓慢,慢慢等个10多分钟吧

下载完成后记得放置到ubuntu系统中,我放置的位置如下(找得到就行,到时候在相应的位置运行一般不会报错):

在这里插入图片描述

STEP7:运行

# 开启新的终端,执行
roscore   #启动ros服务
# 开启新的终端执行
roslaunch ExampleGroovyOrNewer.launch
# 开启新的终端执行
rosbag play --pause Example.bag  
#执行图片发布程序,执行后,按空格键开始

结果演示:

在这里插入图片描述

ORB_SLAM2实现

提醒:最好给自己的ubuntu系统多分配点空间,我刚开始弄第一次的时候,内存炸了!!!
github下载代码

参考链接

看上面那一篇就够了!!

这里进行说明:本人是跑完1就跑2的,前后间隔不超过24小时,然后这篇博客也是一个集美大学大佬同学分享给我的,感激!!

这里也对其具体步骤进行说明:

STEP1:下载一些前置的库

切记把之前安装错的库给清楚干净!虽然我好想没有,可能是1中的库2都要用吧,这里强调的应该是之前跑2,没成功,但是一些库没删干净会导致运行不成功吧。

# 安装cmake,gcc,g++,git
sudo apt-get update
sudo apt-get install  cmake gcc g++ git

STEP2:安装Pangolin

原本想的是直接在ubuntu安装pangolin的,但是我发现我错了,对不起,没成功!!!

下载链接:https://pan.baidu.com/s/1oSaagKQwqLdUNfPdDBRUKA?pwd=ahsg
提取码:ahsg

注:后面提取后解压放置在ubuntu的目录下,我和ORB_SLAM同级,注意要改名成:Pangolin

之后依次执行以下命令,安装必要的库:

sudo apt-get install libxkbcommon-dev
sudo apt-get install wayland-protocols
sudo apt install libglew-dev
cd Pangolin
mkdir build
cd build
cmake ..
make
sudo make install

注:make编译后面就不用加 -j,不然内存一般都要炸!!

库安装成功了之后可以测试一下是否安装成功:

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

注:如果有报错**C++…**这里需要进行修改:在对应的build中的Makefile的上面添加下面的内容,本人在测试build的文件下的makefile中添加的,然后报错就消失了。

CXX = g++ -std=c++11
CXXFLAG = -g -wall -std=c++11

成功有以下表示:

在这里插入图片描述

这里会遇到网络下载问题,请多次尝试或者找个网络好还稳定的地方。

STEP3:安装Eigen3

sudo apt-get install libeigen3-dev

STEP4:安装opencv3(安装4会冲突!)

下载链接:https://pan.baidu.com/s/1c716DXddnL-97P1tjZusgw?pwd=abcd
提取码:abcd

注:后面提取后解压放置在ubuntu的目录下,我和ORB_SLAM同级,注意要改名成:opencv3

在这里插入图片描述

输入以下命令进行编译:

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
cd opencv3
mkdir build
cd build
cmake ..
make
sudo make install

安装完成后,新建一个新的终端:

sudo gedit /etc/ld.so.conf.d/opencv.conf

这时会出现一个文档,在文档最后一行添加:

/usr/local/lib

保存好后,退出,打开一个新终端,输入:

sudo ldconfig

再打开一个新终端,输入:

sudo gedit /etc/bash.bashrc

这时会出现一个文档,在文档最后一行添加如下代码:

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

添加完成后,保存并退出,并打开一个新终端,输入:

source /etc/bash.bashrc
sudo updatedb

测试opencv:输入如下代码:

cd opencv3/samples/cpp/example_cmake
cmake .
make
./opencv_example

成功有以下图片展示:

在这里插入图片描述

STEP5:安装ORB_SLAM2

下载链接:https://pan.baidu.com/s/1g9w2AWEchgxkFG2cosNPoA?pwd=1234
提取码:1234

注意改名成**ORB_SLAM2**,然后再目录下新建一个终端,执行下述代码:

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

STEP6:准备数据集、运行

链接:https://pan.baidu.com/s/1lwHO9sMCp_XL8fOUZKQllA?pwd=1234
提取码:1234

下载后,在ORB_SLAM2目录下新建一个data,将其放置进去即可。

新建一个终端,进入ORB_SLAM目录下,输入指令进行运行。

cd ORB_SLAM2
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml data/rgbd_dataset_freiburg1_xyz

在这里插入图片描述

添加自身摄像机进行运行

相机标定参考链接
弄环境
参考链接

在ORB_SLAM1中建立一个文件——usb_cam_node.launch,将下列代码复制到里面。

<launch>
    <arg name="device" default="/dev/video0" />
    <node name="usb_cam_node" pkg="usb_cam" type="usb_cam_node" output="screen">
        <param name="video_device" value="$(arg device)" />
        <param name="image_width" value="640" />
        <param name="image_height" value="480" />
        <param name="framerate" value="30" />
        <param name="brightness" value="128" />
        <param name="contrast" value="128" />
        <param name="saturation " value="70" />
    </node>
</launch>

利用命令行进行标定,注意修改参数,譬如棋盘格大小,生成窗口的面积

rosrun camera_calibration cameracalibrator.py --size 11x8 --square 0.03 image:=/usb_cam_node/image_raw camera:=/usb_cam_node

标点结束后进行运行:

# 启动ros服务
roscore

# 运行ORB_SLAM节点
rosrun ORB_SLAM ORB_SLAM Data/ORBvoc.txt Data/Settings.yaml

# 运行rviz
rosrun rviz rviz -d Data/rviz.rviz

# 运行相机节点,发布信息
roslaunch usb_cam_node.launch

运行结果:

在这里插入图片描述

遇到的问题

  1. C++ 【error】 #error This file requires compiler and library support for the

​ 该报错实在运行orbslam2的时候遇到的,主要是为了测试Pangolin是否可行,在编译的时候报错。

解决方案:Makefile的上面加上下面的内容,本人在测试build的文件下的makefile中添加的,然后报错就消失了。

CXX = g++ -std=c++11
CXXFLAG = -g -wall -std=c++11

如果还没有解决,我还做了一个操作就是——在build中的Cmake中添加一行代码:

add_definitions(-std=c++11)

不过只单独加下面的可能没用,我是先加了下面的然后make了一下,但是还是报错的,加了上面的才解决。

我一个同学弄好像不行,大家仅供参考。抱歉,我只记得我编译报错,然后我修改了mainfire和cmakelist文件,其余的我保证真的没动。

  1. source devel/setup.bash bash: devel/setup.bash: No such file or directory

​ 解决方案:

vim ~/.bashrc

然后把里面多余的会这是不用环境的给删了——一般在最后面!!!(别删多了!)

  1. RPC failed; curl 18 transfer closed with outstanding read data remaining

    unable to access ‘https://github.com/microsoft/vcpkg.git/’: gnutls_handshake() failed: The TLS connection was non-properly terminated.

    error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options. #error This file requires compiler and library support </u>

如果大家遇到上述几个问题,请先相信,自己没问题,是该死的网络的问题,我检索的资料是说网络终端导致无法下载,这是在我配置orb_slam2中遇到的问题。你可以选择一下方法进行修改:

  1. 和我一样不用github换成其他的,不用ubuntu下载东西,果断选择其他的博文进行参考实现
  2. 头铁,科学上网或者是想办法提高自己的网速,使用加速器之类的(我不行,希望你们可以成功!!!)
  1. error:roslaunch usb_cam usb_cam-test.launch
    参考链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jmu xzh_0618

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值