文章目录
- 0 引言
- 1 安装依赖
- 1.1 opencv安装
- 1.2 Eigen3安装
- 1.3 Pangolin安装
- 1.4 其他
- 2 编译安装ORB-SLAM2
- 2.1 build.sh
- 2.2 build_ros.sh
0 引言
ORB-SLAM2
是一种用于单目、双目和RGB-D相机的视觉SLAM
(同时定位与地图构建)系统。它由萨拉戈萨大学和伦敦帝国学院的研究人员开发,并于2016年首次发布。
该系统基于ORB
特征检测器和描述子,这是一种快速且具有鲁棒性的特征提取方法。ORB-SLAM2
使用了多种技术,包括相机姿态估计、特征匹配、回环检测和地图优化等,以实现高精度的定位和地图构建。它还支持实时运行,并且可以在没有先验地图的情况下进行自适应构建。ORB-SLAM2
已成为许多研究和工业应用中的常用SLAM
系统之一。
本文主要包括Ubuntu20.04
系统下,并已安装对应的ROS-noetic
机器人系统,在此基础上如何一步步安装ORB-SLAM2
的依赖库,比如OpenCV
,Eigen3
,Pangolin
,最后安装非ROS版本
和ROS版
的ORB-SLAM2
,以及安装过程中遇到的问题和解决问题的办法。
本文系统:
Ubuntu20.04
系统ROS-noetic
机器人系统
1 安装依赖
1.1 opencv安装
建议下载源码编译安装的方式,OpenCV-release下载地址,可以选择OpenCV3
的版本,比如OpenCV-3.4.16
版本,找到对应版本,点击Sources
下载即可。
# 安装OpenCV依赖
sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
# 进入到OpenCV下载文件夹目录,新开终端,这里以3.4.16版本为例
unzip opencv-3.4.16.zip
# 编译安装
cd opencv-3.4.16/
mkdir build
cd build
# cmake
cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES ..
# make
make -j4
# install
sudo make install
安装后可进行测试
cd opencv-3.4.16/samples/cpp/example_cmake
cmake .
make
./opencv_example
# 笔记本有摄像头的话,会自动打开,如下图
也可以用以下命令查看安装的版本
pkg-config --modversion opencv
# 3.4.16
1.2 Eigen3安装
eigen3 一般已经安装了,可用如下命令查看:
# 查看前18行,可自行调整
cat /usr/include/eigen3/Eigen/src/Core/util/Macros.h | head -n 18
比如出现如下所示,eigen版本是3.3.7
#ifndef EIGEN_MACROS_H
#define EIGEN_MACROS_H
#define EIGEN_WORLD_VERSION 3
#define EIGEN_MAJOR_VERSION 3
#define EIGEN_MINOR_VERSION 7
如果确定没有安装,可用如下命令直接安装:
sudo apt-get install libeigen3-dev
1.3 Pangolin安装
同样也是源码编译安装,Pangolin下载地址,本文用的是Pangolin-0.6
版本,进入后选择v0.6
,然后点击source code(zip)
下载即可。
# 安装依赖库
sudo apt-get update
sudo apt-get install libxkbcommon-dev
sudo apt-get install wayland-protocols
sudo apt install libglew-dev
# 进入到Pangolin下载文件夹目录,新开终端,这里以0.6版本为例
unzip Pangolin-0.6.zip
cd Pangolin-0.6/
mkdir build
cd build
# cmake
cmake ..
# make
make -j4
# install
sudo make install
安装中的问题:
make
时缺少pybind11.h
的报错问题
fatal error: pybind11/pybind11.h: No such file or directory
30 | #include <pybind11/pybind11.h>
解决办法:由于下载的Pangolin-0.6.zip
,解压后external/pybind11
文件夹下是空的,所以找不到,当然CMakeLists.txt
中也有find_package(pybind11 QUIET)
,所以有以下两种办法解决,本文用第二种解决了编译错误。
- 1.安装pybind11:
python3 -m pip install pybind11
或pip install pybind11
- 2.下载pybind11源码解压后放到
external/pybind11
文件夹下,比如下载了pybind11-2.10.4.zip
,解压的pybind11-2.10.4
文件夹中的所有文件放到external/pybind11
文件夹下
1.4 其他
-
DBoW2 and g2o
两个库已经包含在官方工程的ORB-SALM2-->Thirdparty
文件夹中,同时官方也把这两个库的安装命令写到了编译安装脚本build.sh
中。 -
ORB-SLAM2
也有ROS版本
,所以也需要安装ROS
机器人系统,如果是Ubuntu20.04
,那么就安装对应的ROS-noetic
版本。
2 编译安装ORB-SLAM2
2.1 build.sh
以下是非ROS版本
的ORB_SLAM2
安装:
# 比如home下新开终端,确定下载的路径
# 下载ORB_SLAM2
git clone https://github.com/raulmur/ORB_SLAM2.git
cd ORB_SLAM2
chmod +x build.sh
./build.sh
编译出现的问题:
问题1:error: ‘usleep’ was not declared in this scope
解决办法:ORB_SLAM2/include/System.h
头文件中添加
#include<unistd.h>
问题2:LoopClosing.h 中eigen类别定义问题
解决办法:ORB_SLAM2/include/ORBextractor.h
中如下修改
// Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
Eigen::aligned_allocator<std::pair<KeyFrame* const, g2o::Sim3> > > KeyFrameAndPose;
问题3:OpenCV头文件引用问题
解决办法:ORB_SLAM2/include/ORBextractor.h
中注释掉cv.h
,新增如下两行
// #include <opencv/cv.h>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui_c.h>
2.2 build_ros.sh
以下是ROS版
的ORB_SLAM2
安装:
打开build_ros.sh
文件中可以看到,ROS版
在ORB_SLAM2/Examples/ROS/ORB_SLAM2/
目录下,对应的编译build
也是在对应的文件夹下。
# 冒号后的 PATH 替换成自己的ORB_SLAM2工程保存目录
# 添加以下export到 ~/.bashrc 中,可以 vim ~/.bashrc,添加到最后一行
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS
source ~/.bashrc
# 给.sh脚本权限
chmod +x build_ros.sh
# 编译
./build_ros.sh
编译出现的问题:
问题1:ROS-noetic中OpenCV4
和ORB_SLAM2中OpenCV3
不匹配的问题
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_imgproc.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgproc.so.3.4
/usr/bin/ld: warning: libopencv_core.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_core.so.3.4
/usr/bin/ld: CMakeFiles/Stereo.dir/src/ros_stereo.cc.o: undefined reference to symbol '_ZNK2cv8FileNodecviEv'
/usr/bin/ld: /usr/lib/x86_64-linux-gnu/libopencv_core.so.4.2.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/Stereo.dir/build.make:179: ../Stereo] Error 1
make[1]: *** [CMakeFiles/Makefile2:514: CMakeFiles/Stereo.dir/all] Error 2
make: *** [Makefile:130: all] Error 2
解决办法:
因为ORB_SLAM2
用的OpenCV3
,刚刚1.1
小节中安装的也是OpenCV3
,但是Ubuntu20.04
对应的ROS noetic
自带的是OpenCV4
,而cv_bridge
链接的是OpenCV4
,所以,与OpenCV3
存在冲突,解决方法如下:
根据报错提示,进入libopencv_imgcodecs.so.4.2
和libopencv_proc.so.4.2
所在位置/usr/lib/x86_64-linux-gnu/
目录下,然后复制到ORB_SLAM2的ROS版本的lib
目录中
# PATH替换成自己的ORB_SLAM2工程保存目录
cd /usr/lib/x86_64-linux-gnu/
sudo cp libopencv_imgproc.so.4.2 PATH/ORB_SLAM2/lib/libopencv_imgproc.so.4.2
sudo cp libopencv_core.so.4.2 PATH/ORB_SLAM2/lib/libopencv_core.so.4.2
然后在ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt
中添加两个lib
的路径${PROJECT_SOURCE_DIR}/../../../lib/libopencv_core.so.4.2
和${PROJECT_SOURCE_DIR}/../../../lib/libopencv_imgproc.so.4.2
# ORB_SLAM2/Examples/ROS/ORB_SLAM2/CMakeLists.txt文件中添加
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
# for opencv4
${PROJECT_SOURCE_DIR}/../../../lib/libopencv_core.so.4.2
${PROJECT_SOURCE_DIR}/../../../lib/libopencv_imgproc.so.4.2
然后回到ORB_SLAM2
的工程目录下,重新执行./build_ros.sh
,如下,不再报错,编译成功。
[ 22%] Linking CXX executable ../MonoAR
[ 22%] Linking CXX executable ../RGBD
[ 33%] Linking CXX executable ../Mono
[ 44%] Linking CXX executable ../Stereo
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by ../../../../lib/libORB_SLAM2.so, may conflict with libopencv_core.so.4.2
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by ../../../../lib/libORB_SLAM2.so, may conflict with libopencv_core.so.4.2
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by /usr/local/lib/libopencv_highgui.so.3.4.16, may conflict with libopencv_core.so.4.2
/usr/bin/ld: warning: libopencv_imgcodecs.so.4.2, needed by /opt/ros/noetic/lib/libcv_bridge.so, may conflict with libopencv_imgcodecs.so.3.4
/usr/bin/ld: warning: libopencv_core.so.3.4, needed by ../../../../lib/libORB_SLAM2.so, may conflict with libopencv_core.so.4.2
[100%] Built target Stereo
[100%] Built target RGBD
[100%] Built target Mono
[100%] Built target MonoAR
Reference:
- https://github.com/raulmur/ORB_SLAM2
- https://stackoverflow.com/questions/46396204/affdex-cpp931-fatal-error-pybind11-pybind11-h-no-such-file-or-directory-in
- https://stackoverflow.com/questions/61758906/building-cpp-with-pybind11
⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔