C++编译器这里用的是GCC。GCC原名GNU C Compiler,后来逐渐支持更多语言编译(C++, Fortran, Pascal, Objective-C, Java, Ada, Go等),所以变成了GNU Compiler Collection, 是一套由GNU工程开发的支持多种编程语言的编译器。
优点: 类Unix下的标准编译器,支持众多语言,支持交叉编译。
缺点:不支持Windows,需第三方移植才可用于Windows系统。
gcc --version
==> gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Doxygen是一个程序的文件产生工具,可将程序中的特定批注转换成说明文件。Doxygen是编译Pangolin的一个选项,用自动生成文档。
sudo apt-get install -y doxygen
或
git clone https://github.com/doxygen/doxygen.git
cd doxygen
mkdir build
cd build
cmake -G "Unix Makefiles" ..
make
make install
Pangolin是一个轻量、便携的管理OpenGL显示、交互和提取的视频输入的快速开发库。是一个简单是OpenGL视口管理器,能帮助模块化
OpenGL是渲染2D、3D矢量图形硬件的软件接口。本质上,它是一个3D徒刑和模型库,类似一个C运行时函数库。
检查是否已经安装OpenGL
apt-cache search libgl
==>libgl1 - Vendor neutral GL dispatch library -- legacy GL support
证明OpenGL安装成功。
若没有安装:
sudo apt install libgl1-mesa-dev
检查是否已经安装Grew
apt-cache search libglew
==>libglew-dev - OpenGL Extension Wrangler - development environment
证明Grew安装成功。
若没有安装:
sudo apt install libglew-dev
检查是否已经安装CMake
apt-cache search cmake
==>cmake - cross-platform, open-source make system
证明CMake(for building environment)安装成功。
若没有安装:
sudo apt install cmake
git clone https://github.com/stevenlovegrove/Pangolin.git
cd Pangolin
mkdir build
cd build
cmake ..
cmake --build .
编译中没有遇到任何问题。
检查是否已经安装opencv
apt-cache search opencv
==>libopencv-dev - development files for opencv
==>libopencv-contrib-dev - development files for libopencv-contrib3.2
证明opencv安装成功。
若没有安装:
git clone https://github.com/opencv/opencv.git
cd opencv
mkdir build
cd build
cmake ..
make -j7 # runs 7 jobs in parallel
make install
Eigen是一个基于C++模版的开源库,支持线性代数、矩阵和矢量运算、数值分析及相关的算法。
根据官方文档 ,下载Eigen即可,不需要build。
检查Eigen是否已经安装
pkg-config --modversion eigen3
==> 3.3.7
wget https://gitlab.com/libeigen/eigen/-/archive/3.2.10/eigen-3.2.10.tar.gz
tar -zxvf eigen-3.2.10.tar.gz
这里建议用Eigen 3.2版本,因为3.3版本中取消了 AlignedBit(deprecated)
Note: 用 sudo apt install libeigen3-dev 会安装Eigen 3.3版本
DBoW2 和 g2o library项目源代码已经包含在 Thirdparty 文件夹下。build.sh里面自动build了两个libraries。
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
cd ORB_SLAM3
chmod +x build.sh
./build.sh
问题:no match for ‘operator/’
解决方法:
根据issue,
(1) 将ORB-SLAM3 src/LocalMapping.cc 的第628行改成
x3D = x3D_h.get_minor<3,1>(0,0) * (1/x3D_h(3));
(2) 将ORB-SLAM3 src/CameraModels/KannalaBrandt8.cpp 的第535行改成
x3D = x3D_h.get_minor<3,1>(0,0) * (1/x3D_h(3));
问题:
//usr/lib/x86_64-linux-gnu/libgdcmMSFF.so.2.8: undefined reference to 'uuid_generate@UUID_1.0'
//usr/lib/x86_64-linux-gnu/libgdcmMSFF.so.2.8: undefined reference to 'uuid_parse@UUID_1.0'
//usr/lib/x86_64-linux-gnu/libgdcmMSFF.so.2.8: undefined reference to 'uuid_unparse@UUID_1.0'
collect2: error: ld returned 1 exit status
CMakeFiles/mono_inertial_tum_vi.dir/build.make:179: recipe for target '../Examples/Monocular-Inertial/mono_inertial_tum_vi' failed
make[2]: *** [../Examples/Monocular-Inertial/mono_inertial_tum_vi] Error 1
CMakeFiles/Makefile2:354: recipe for target 'CMakeFiles/mono_inertial_tum_vi.dir/all' failed
make[1]: *** [CMakeFiles/mono_inertial_tum_vi.dir/all] Error 2
解决方法:
ldconfig -p|grep libgdcmMSFF
==>libgdcmMSFF.so.2.8 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgdcmMSFF.so.2.8
libgdcmMSFF.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgdcmMSFF.so
所以/usr/lib/x86_64-linux-gnu应该要放在LD_LIBRARY_PATH环境变量里面:在 .bashrc
文件中写入:
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH
然后更新 .bashrc
:
source ~/.bashrc
ldconfig -p|grep libuuid
==>libuuid.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libuuid.so.1
libuuid.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libuuid.so
Anaconda3
/ Anaconda2
,会出现在调用uuid的时候,找到Anaconda3/lib
下的uuid而非usr/lib
下的。因此,把anaconda3/lib
下的libuuid
库文件移走,即可解决问题。ls home/jyq/anaconda3/lib/libuuid*
mkdir home/jyq/anaconda3/libuuid
mv home/jyq/anaconda3/lib/libuuid* home/jyq/anaconda3/libuuid
下载一共11个数据集(unzip -d MH01 MH_01.zip
),并更改 euroc_examples.sh
中的数据的路径。
运行./euroc_examples.sh
,出现以下错误:
terminate called after throwing an instance of 'std::runtime_error'
what(): Pangolin X11: Failed to open X display
问题原因:用remote server时启用图形界面导致以上错误
解决方式:将ORB_SLAM3/Examples/Monocular/mono_euroc.cc和ORB_SLAM3/Examples/Monocular/stereo_euroc.cc中的这句话中的true
改为false
// Create SLAM system. It initializes all system threads and gets ready to process frames.
ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM2::System::MONOCULAR,false);
这样就不会去调用线程进行图形化处理。改完后重新使用./build.sh编译,再运行就不会报错了。
下载TUM RGB-D数据集
由于Kinect得到的color images和depth images不同步,导致RGB图像和深度图像的time stamp不相同。下载python script associate.py
(download here)并放置在Examples/RGB-D
目录下。associate.py
通过读取rgb.txt和depth.txt中的time stamp,关联RGB图像和深度图像。
生成RGB-D关联 (association files):
python associate.py PATH_TO_RGBD_DATASET/rgb.txt PATH_TO_RGBD_DATASET_FOLDER/depth.txt > ASSOCIATE_NAME.txt
【Notice:ORB-SLAM3 Examples/RGB-D/associations文件夹下提供了TUM RGB-D数据集的关联。】
在Examples/RGB-D目录下,运行
./rgbd_tum ../../Vocabulary/ORBvoc.txt TUMX.yaml PATH_TO_RGBD_DATASET_FOLDER PATH_TO_ASSOCIATION_FILE
其中TUMX.yaml
替换为TUM1.yaml
或TUM2.yaml
或TUM3.yaml
同理,用remote server时,请在rgbd_tum.cc
关掉图形界面显示。