本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析-接如下:
(01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/123092196
文末正下方中心提供了本人 联系方式, 点击本人照片即可显示 W X → 官方认证 {\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证} 文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证
请注意本人使用环境为 U b u n t u 18.04 \color{red}{Ubuntu18.04} Ubuntu18.04,另外本人现在的时间点为 20220223 \color{red}{20220223} 20220223 无法保证你现在的时间点,相应的依赖库或者工程作者是否有更新,不过本人编译的相关文件都有保留,可以直接获取(无法获取则可评论,或者联系我本人):
链接:https://pan.baidu.com/s/15H8ZrN4IUcMjxHSnfWB6TQ
提取码:1234 --来自百度网盘超级会员V5的分享
(1)本人运行的系统为 Ubuntu18.04,使用docker(不明白则理解为裸机)进行创建,该环境纯净,初始无任何安装包
(2)开源代码ORB-SLAM2链: https://github.com/raulmur/ORB_SLAM2
换源,修改/etc/apt/sources.list文件,文末添加如下内容,添加完成之后执行 apt-get update
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
#首先我们创建一个目录为01.ORB-SLAM2源码解析,执行指令如下:
sudo mkdir /my_work/01.ORB-SLAM2源码解析
# 进入该目录
cd /my_work/01.ORB-SLAM2源码解析
# 创建一个用来存错依奈包的目录:
sudo mkdir 01.Prerequisites
以上目录名称都可以进行自定义的
按照下面的 流程操作完成 \color{red}{流程操作完成} 流程操作完成之后,目录结构应该如下图所示:
首先我们要阅读 ORB_SLAM2 对应的 README.md 文件,可以发现其依奈: Pangolin,OpenCV,Eigen3,DBoW2,g2o,ROS 这几个工程,是否还有其他的依奈暂时未知,我们先按照 README.md 文件的介绍依次进行安装如下。
# 进入依奈目录
cd /my_work/01.ORB-SLAM2源码解析/01.Prerequisites
# 获得源码,注意这里需要的是,我们需要的是0.5版本的
apt-get install git
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
git checkout v0.5
# 依奈安装
sudo apt-get update
sudo apt install libgl1-mesa-dev
sudo apt install libglew-dev
sudo apt install cmake
sudo apt install libpython2.7-dev
sudo apt install pkg-config
sudo apt install libegl1-mesa-dev libwayland-dev libxkbcommon-dev wayland-protocols
sudo apt install ffmpeg libavcodec-dev libavutil-dev libavformat-dev libswscale-dev libavdevice-dev
sudo apt install libdc1394-22-dev libraw1394-dev
sudo apt install libjpeg-dev libpng-dev libtiff5-dev libopenexr-dev
# 特殊依奈(原本是后续需要安装的)
sudo apt-get install libeigen3-dev
# 编译安装
mkdir build
cd build
cmake ..
sudo make -j18 # runs 18 jobs in parallel
sudo make install
执行 cmake … 执行之后本人打印如下,则表示成功:
执行 make 之后打印如下,则表示成功:
执行 sudo make install 执行之后本人打印如下,则表示成功:
# 进入依奈目录
cd /my_work/01.ORB-SLAM2源码解析/01.Prerequisites
# 获取Opencv源码
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
# 切换为 3.4.6 版本
cd opencv_contrib
git checkout 3.4.6
cd ../opencv
git checkout 3.4.6
#依奈安装
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 libdc1394-22-dev
# 代码编译
mkdir build
cd build
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
sudo make -j18 # runs 18 jobs in parallel
sudo make install
运行完成之后本人打印如下:
# 其实在前面已经安装过了
sudo apt-get install libeigen3-dev
已经包含在ORBSLAM2中的第三⽅库⽂件夹中,不需要⾃⼰编译安装
可以参考:
(01) http://wiki.ros.org/melodic/Installation/Ubuntu
(02)一行代码搭建机器人开发环境(ROS/ROS2/ROSDEP)
# 如果之前安装过ros先卸载
sudo apt-get purge ros-*
# 执行指令
wget http://fishros.com/install -O fishros && . fishros
出现如下界面,
根据提示我们再次运行: wget http://fishros.com/install -O fishros && . fishros,出现如下界面,则输入 1 即可。
出现如下界面则输入 1 即可:
出现如下界面则输入 1 即可:
出现如下界面则输入 1 即可:
后续还需要输入6选择6. Asia,以及70选择70. Shanghai。安装完成之后本人打印如下:
apt-get install python3-pip
pip3 install rosdepc
rosdepc init
rosdepc update
#完成上述工作之后,我们再验证ROS是否安装成功,我们首先要开启三个终端,每个终端运行对应的指令如下:
第一个终端: roscore
第二个终端: rosrun turtlesim turtlesim_node # 会出现一个小海龟,
第三个终端: rosrun turtlesim turtle_teleop_key # 接下来就在可以通过方向键控制海龟的移动。
注意,其上所有终端需要重新开启 \color{red}{注意,其上所有终端需要重新开启} 注意,其上所有终端需要重新开启
本人显示图像图下:
通过前面的介绍我们已经我们已经安装好了相关的依奈环境,那么我们接下来的任务就是安装 ORB_SLAM2 了。执行如下指令:
cd /my_work/01.ORB-SLAM2源码解析
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
cd ORB_SLAM2
chmod +x build.sh
./build.sh
ORB_SLAM2/src/LoopClosing.cc:84:9: error: ‘usleep’ was not declared in this scope
usleep(5000);
CMakeFiles/ORB_SLAM2.dir/build.make:494: recipe for target ‘CMakeFiles/ORB_SLAM2.dir/src/Viewer.cc.o’ failed
make[2]: *** [CMakeFiles/ORB_SLAM2.dir/src/Viewer.cc.o] Error 1
…
使用如下方案解决:
// 主要的问题为: error: ‘usleep’ was not declared in this scope
//解决⽅式为在sudo vim include/System.h中添加⼀句
#include "unistd.h"
然后重新执行: ./build.sh , 本人打印如下:
运⾏结束后将会⽣成libORB_SLAM2.so 在lib⽂件夹中 以及测试程序 mono_tum,mono_kitti, rgbd_tum, stereo_kitti, mono_euroc和 stereo_euroc 在Example⽂件夹中。
我们首先以单目模式下的TUM数据集为例子,演示作者提供的例子是如何运行的。首先我们从 http://vision.in.tum.de/data/datasets/rgbd-dataset/download 链接中下载任意一个数据包,比如本人下载如下:
并且解压,解压之后的路径存放为 路径存放 : \color{red}{路径存放:} 路径存放:/my_work/01.ORB-SLAM2源码解析/Datasets/rgbd_dataset_freiburg1_xyz,准备好这些工作之后,我们执行如下指令:
cd /my_work/01.ORB-SLAM2源码解析/ORB_SLAM2
#执行指令./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUMX.yaml PATH_TO_SEQUENCE_FOLDER
# 注意,此处的TUMX.yaml⽂件要对应于你下载的数据集类型, PATH_TO_SEQUENCE_FOLDER要对应于你的数据集⽂件夹路径,所以本人修改为:
./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml /my_work/01.ORB-SLAM2源码解析/Datasets/rgbd_dataset_freiburg1_xyz
这里我们使用 单⽬⽰例 的数据集,也就是前面我们下载且解压之后的/my_work/01.ORB-SLAM2源码解析/Datasets/rgbd_dataset_freiburg1_xyz数据集,但是针对于深度摄像头的示例,我们是不能直接使用的我们需要做一些处理。主要流程,主要参考README.md文件的6. RGB-D Example,本人截图如下:
一、数据准备与处理:
(1)这里数据我们使用/my_work/01.ORB-SLAM2源码解析/Datasets/rgbd_dataset_freiburg1_xyz,所以不需要重复下载
(2)根据介绍提示下载 associate.py 为文件,链接为: http://vision.in.tum.de/data/datasets/rgbd-dataset/download
(3)下载完成之后存放在/my_work/01.ORB-SLAM2源码解析/Datasets/目录下
(4)执行如下指令生成 associations.txt 文件
cd /my_work/01.ORB-SLAM2源码解析/Datasets/
python associate.py rgbd_dataset_freiburg1_xyz/rgb.txt rgbd_dataset_freiburg1_xyz/depth.txt > rgbd_dataset_freiburg1_xyz/associations.txt
如果操作正确,我们可以看到 /my_work/01.ORB-SLAM2源码解析/Datasets/rgbd_dataset_freiburg1_xyz/associations.txt 文件的内容如下:
完成了数据处理之后,我们就要执行命令,运行深度示例了:
二、深度示例运行代码
cd /my_work/01.ORB-SLAM2源码解析/ORB_SLAM2
# 官方的介绍为运行 ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE
# 但是我们需要进行适当的修改,如TUMX改成TUM1,替换PATH_TO_SEQUENCE_FOLDER,以及 ASSOCIATIONS_FILE
./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml /my_work/01.ORB-SLAM2源码解析/Datasets/rgbd_dataset_freiburg1_xyz /my_work/01.ORB-SLAM2源码解析/Datasets/rgbd_dataset_freiburg1_xyz/associations.txt
运行的结果与单目示例比较类似,为了博客不过于臃肿,我们这里就不再进行结果的贴图。
下面我们我们讲解双目摄像头的示例如何运行。这里我们以ROS为例,顺便带大家把ROS也编译配置成功。
cd /my_work/01.ORB-SLAM2源码解析/ORB_SLAM2
#⾸先需要将Examples/ROS/ORB_SLAM2路径导⼊到ROS_PACKAGE_PATH环境变量中,
#具体做法为打开终端,输⼊sudo vim ~./bashrc,并在⽂件最后⼀⾏添加
# export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAMª/Examples/ROS
# 此处的PATH为你的ORBSLAM2⽂件夹所在的绝对路径,所以本人添加的代码为:
export ROS_PACKAGE_PATH=/my_work/01.ORB-SLAM2源码解析/ORB_SLAM2/Examples/ROS:${ROS_PACKAGE_PATH}
chmod +x build_ros.sh
./build_ros.sh
运行之后报错如下:
/usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol ‘_ZN5boost6system15system_categoryEv’
/usr/lib/x86_64-linux-gnu/libboost_system.so: 无法添加符号: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/Stereo.dir/build.make:187: recipe for target ‘…/Stereo’ failed
make[2]: *** […/Stereo] Error 1
CMakeFiles/Makefile2:104: recipe for target ‘CMakeFiles/Stereo.dir/all’ failed
make[1]: *** [CMakeFiles/Stereo.dir/all] Error 2
make[1]: *** 正在等待未完成的任务…
/usr/bin/ld: CMakeFiles/RGBD.dir/src/ros_rgbd.cc.o: undefined reference to symbol ‘_ZN5boost6system15system_categoryEv’
/usr/lib/x86_64-linux-gnu/libboost_system.so: 无法添加符号: DSO missing from command line
解决方案:修改vim Examples/ROS/ORB_SLAM2/CMakeLists.txt⽂件,将第51⾏的代码修改如下,然后删除build文件夹(执行 rm -r Examples/ROS/ORB_SLAM2/build/ )重新构建即可。
set(LIBS
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
-lboost_system)
本人完成之后打印如下:
首先我们从 https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets 中下载一个数据,本人下载如下
下载之后 路径存放 : \color{red}{路径存放:} 路径存放:/my_work/01.ORB-SLAM2源码解析/Datasets/rgbd_dataset_freiburg1_xyz
# 然后我们需要开启三个终端,每个终端先执行:
export ROS_PACKAGE_PATH=/my_work/01.ORB-SLAM2源码解析/ORB_SLAM2/Examples/ROS:${ROS_PACKAGE_PATH}
# 然后每个终端先执行 cd /my_work/01.ORB-SLAM2源码解析/ORB_SLAM2,然后再执行下面对应的指令
第一个终端: roscore
第二个终端: rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml true
# 需要更改为你数据集的路径
第三个终端: rosbag play --pause /my_work/01.ORB-SLAM2源码解析/Datasets/MH_01_easy.bag /cam0/image_raw:=/camera/left/image_raw /cam1/image_raw:=/camera/right/image_raw
如果出现如下错误:
Depth Threshold (Close/Far Points): 3.85272
double free or corruption (out)
已放弃 (核心已转储)
出行以上错误
第二个终端执行: rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml false
需要注意的是,我们需要等待ORB词典读取完成后,再切换到播放bag的shell并按下空格开始播放,若提前播放,会丢失部分数据。最终显示结果如下:
通过整篇博客的介绍,我们已经把 ORB-SLAM2 的环境搭建了起来,同时跑通了例子,接下来我们就是去阅读论文以及分析代码了,相关的博客链接可以再该篇博客的开头找到。