[Note-3]【SLAM】ubuntu16.04及ubuntu20.04編譯ORB-SLAM3及運行EuRoC數據集 - 2020-10-25

【SLAM】ubuntu16.04及ubuntu20.04編譯ORB-SLAM3及運行EuRoC數據集:https://blog.csdn.net/weixin_47074246/article/details/108691189#1%09_291

分類專欄: slam 文章標簽: ubuntu slam

ORB-SLAM3安裝及運行EuRoC數據集

需要各種庫的下載安裝(Pangolin、Opencv、 Eigen 3安裝),與ORB-SLAM2基本相同。

詳見:https://blog.csdn.net/weixin_47074246/article/details/108690625

一、 依賴庫安裝

0 準備工作

  • 安裝git、vim、g++、gcc、cmake工具
$ sudo apt-get install git
$ sudo apt-get install vim
$ sudo apt-get install g++
$ sudo apt-get install gcc
$ sudo apt-get install cmake

安裝最新版本的cmake

  • 將cmake更新至最新版本,現最新為3.18.3

卸載舊版本的cmake

$ sudo apt-get autoremove cmake

下載依賴項

$ sudo apt-get install build-essential
$ sudo apt-get install libssl-dev

下載

$ sudo wget https://github.com/Kitware/CMake/releases/download/v3.18.3/cmake-3.18.3.tar.gz

文件路徑一般選擇在/opt/usr 路徑下, 這里選擇/opt
解壓并安裝

$ tar -zxvf  cmake-3.18.3.tar.gz
$ sudo mv cmake-3.18.3 /opt/cmake-3.18.3
$ cd /opt/cmake-3.18.3
$ ./configure
$ make -j8
$ sudo make install

創建軟鏈接。

$ sudo ln -sf /opt/cmake-3.18.3/bin/*  /usr/bin/ 

查看cmake的版本

$ cmake --version

顯示

cmake version 3.18.3

CMake suite maintained and supported by Kitware (kitware.com/cmake).

完成安裝。

1 安裝Pangolin

Pangolin是對OpenGL進行封裝的輕量級的OpenGL輸入/輸出和視頻顯示的庫。可以用于3D視覺和3D導航的視覺圖,可以輸入各種類型的視頻、并且可以保留視頻和輸入數據用于debug。

(1)安裝必要的依賴項

$ sudo apt-get install libglew-dev
$ sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
$ sudo apt-get install libpython2.7-dev libpython3-dev
$ sudo apt-get install build-essential

(2)從github下載項目

$ git clone https://github.com/stevenlovegrove/Pangolin.git

(3)編譯安裝

$ cd Pangolin
$ mkdir build
$ cd build
$ cmake ..
$ make
$ sudo make install

2 OpenCV 3.4.11 安裝及環境配置

(0)卸載OpenCV

原本安裝了OpenCV 4.5.0 但是ORB_SLAM3需要版本號為3,需要卸載原版本。

進入原先編譯opencv的build目錄,執行以下代碼。

$  cd opencv/build
$  sudo make uninstall
$  cd ..
$  sudo rm -r build
$  sudo rm -r /usr/local/include/opencv2 /usr/local/include/opencv /usr/include/opencv /usr/include/opencv2 /usr/local/share/opencv /usr/local/share/OpenCV /usr/share/opencv /usr/share/OpenCV /usr/local/bin/opencv* /usr/local/lib/libopencv*

代碼執行后會報錯,忽略

$  sudo apt-get --purge remove opencv-doc opencv-data python-opencv

檢查,用以下代碼檢查opencv是否卸載干凈

$  pkg-config opencv --libs
$  pkg-config opencv --modversion

$  cd /usr
$  find . -name "*opencv*" | xargs sudo rm -rf

若仍能顯出opencv的相關信息,則表示未卸載干凈

清除干凈

$  sudo apt-get autoremove opencv-doc opencv-data libopencv-dev libopencv2.4-java libopencv2.4-jni python-opencv libopencv-core2.4 libopencv-gpu2.4 libopencv-ts2.4 libopencv-photo2.4 libopencv-contrib2.4 libopencv-imgproc2.4 libopencv-superres2.4 libopencv-stitching2.4 libopencv-ocl2.4 libopencv-legacy2.4 libopencv-ml2.4 libopencv-video2.4 libopencv-videostab2.4 libopencv-objdetect2.4 libopencv-calib3d2.4

(1)安裝依賴項

1)安裝編譯工具

$ sudo apt-get install build-essential

2)安裝依賴包

$ sudo apt-get install libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libswscale-dev

3)安裝可選包

# python支持
$ sudo apt install python-dev python-numpy python3-dev python3-numpy
# streamer支持
$ sudo apt install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
# 可選的依賴
$ sudo apt install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev  libtiff5-dev libwebp-dev libjasper-dev libdc1394-22-dev libopenexr-dev 

(2)下載和編譯OpenCV 3.4.11

官網下載:https://opencv.org/releases/

或者源碼下載

$ git clone https://github.com/opencv/opencv.git

$ git clone https://hub.fastgit.org/opencv/opencv.git

$ cd opencv
$ mkdir build
$ cd build
$ cmake -D CMAKE_BUILD_TYPE=Release -D OPENCV_GENERATE_PKGCONFIG=YES -D CMAKE_INSTALL_PREFIX=/usr/local/ ..
$ make
$ sudo make install

(3)OpenCV環境配置

1)pkg-config環境

  • 找到opencv4.pc文件所在目錄:
$ sudo find / -iname opencv4.pc

/usr/local/opencv4/lib/pkgconfig/opencv4.pc

  • /usr/local/include/opencv4/lib/pkgconfig/路徑加入PKG_CONFIG_PATH
$ sudo gedit /etc/profile.d/pkgconfig.sh

在文件中加入下面一行:

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

保存退出后,使用命令激活:

$ source /etc/profile

  • 驗證是否配置成功:
$ pkg-config --libs opencv4
-L/usr/local/opencv4/lib -lopencv_ml -lopencv_dnn -lopencv_video -lopencv_stitching -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_flann -lopencv_photo -lopencv_gapi -lopencv_imgproc -lopencv_core

2)動態庫環境

配置OpenCV動態庫環境——程序執行時加載動態庫*.so的路徑。

$ sudo vim /etc/ld.so.conf.d/opencv4.conf

在該文件(可能是空文件)末尾加上:

/usr/local/opencv4/lib

再執行以下命令使剛才配置的路徑生效:

$ sudo ldconfig

3)python-opencv環境

找到編譯好的python cv庫:

$ sudo find / -iname cv2*.so

/home/username/opencv/build/lib/python3/cv2.cpython-35m-x86_64-linux-gnu.so
/usr/local/opencv4/lib/python3.5/dist-packages/cv2/python-3.5/cv2.cpython-35m-x86_64-linux-gnu.so

cv2.cpython-35m-x86_64-linux-gnu.so就是編譯好的python3的opencv庫,我們把它復制到對應python解釋器的/path/to/dist-packages/(系統自帶的python解釋器)和/path/to/site-packages(用戶安裝的python解釋器)目錄下,之后就能在該python解釋器中使用python-opencv庫。

鏈接到系統自帶的python3解釋器中:

$ sudo ln -s /usr/local/opencv4/lib/python3.5/dist-packages/cv2/python-3.5/cv2.cpython-35m-x86_64-linux-gnu.so /usr/lib/python3/dist-packages/cv2.so

鏈接到Anaconda創建的虛擬環境python3解釋器中:

$ ln -s /usr/local/opencv4/lib/python3.5/dist-packages/cv2/python-3.5/cv2.cpython-35m-x86_64-linux-gnu.so ~/anaconda3/lib/python3.7/site-packages/cv2.so

參考:https://blog.csdn.net/new_delete_/article/details/84797041

3 安裝Eigen3

(1) 源碼安裝

1)安裝Eigen庫

$ sudo apt-get install libeigen3-dev

2) 尋找Eigen3頭文件

$ sudo updatedb
$ locate eigen3
找到位置在/usr/include/eigen3

3) 調用Eigen庫

Eigen庫全部由頭文件組成要使用Eigen庫
在cmake工程中的CMakeLists.txt文件中指定Eigen的頭文件目錄:

include_directories("/usr/local/include/eigen3")

4) 修改目錄

運行命令:

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

因為eigen3 被默認安裝到了usr/local/include,很多程序經常使用#include <Eigen/Dense>而不是使用#include <eigen3/Eigen/Dense>。所以要做下處理,否則一些程序在編譯時會因找不到Eigen/Dense而報錯。上面指令將usr/local/include/eigen3文件夾中的Eigen文件遞歸地復制到上一層文件夾(直接放到/usr/local/include中,否則系統無法默認搜索到 -> 此時只能在CMakeLists.txtinclude_libraries

$ sudo cp /usr/local/include/eigen3/ /usr/include/ -R 

復制至/usr/include/目錄以防萬一。

參考:https://blog.csdn.net/ganbaoni9yang/article/details/83956999

(2) 壓縮包安裝

詳見(3)ORB-SLAM3安裝問題 2)Eigen的deprecated錯誤

(3) Eigen3測試

編寫程序test.cpp

#include <iostream>
#include <Eigen/Dense>

//using Eigen::MatrixXd;
using namespace Eigen;
using namespace Eigen::internal;
using namespace Eigen::Architecture;

using namespace std;

int main()
{
        cout<<"*******************1D-object****************"<<endl;
        Vector4d v1;
        v1<< 1,2,3,4;
        cout<<"v1=\n"<<v1<<endl;

        VectorXd v2(3);
        v2<<1,2,3;
        cout<<"v2=\n"<<v2<<endl;

        Array4i v3;
        v3<<1,2,3,4;
        cout<<"v3=\n"<<v3<<endl;

        ArrayXf v4(3);
        v4<<1,2,3;
        cout<<"v4=\n"<<v4<<endl;
}

編譯

$ g++  test.cpp

運行

./a.out

4 安裝g2o和DBoW2的依賴項

由于在ORB_SLAM2項目的Thirdparty下已包含g2oDBoW2,只需安裝依賴項。

$ sudo apt-get install cmake libeigen3-dev libsuitesparse-dev qtdeclarative5-dev qt5-qmake libqglviewer-dev //g2o的依賴項
$ sudo apt-get install libboost-dev //DBoW2的依賴項

二、ORB-SLAM3 編譯

1 ORB-SLAM3 源碼下載

官網下載 https://github.com/UZ-SLAMLab/ORB_SLAM3

但是國內有限制,下載很慢(平均30kb/s)。可以通過git clone 鏡像文件提速。

下載ORB-SLAM3的鏡像文件

git clone https://hub.fastgit.org/UZ-SLAMLab/ORB_SLAM3.git


其他github下載提速方法參考:https://blog.csdn.net/weixin_44821644/article/details/107574297

2 ORB-SLAM3 安裝

(1) 編譯環境

Ubuntu 16.04 LTS
(Intel? Core? i5-4210U CPU @ 1.70GHz x86_64-pc-linux-gnu)

Ubuntu 20.04 LTS
(Intel? Core? i7-10710U CPU @ 1.10GHz × 12 x86_64-pc-linux-gnu)

Pangolin
Opencv 4.5.0
Eigen 3

(2) 編譯安裝

$ cd ORB_SLAM3
$ chmod +x build.sh
$  ./build.sh

編譯成功


在這里插入圖片描述

查看占用內存

$ free -m

在這里插入圖片描述

若虛擬內存不足,編譯提示virtual memory exhausted: Cannot allocate memory,則需增加Swap虛擬內存。
參考:https://blog.csdn.net/zzcchunter/article/details/83587881

三、EuRoC 數據集測試

EuRoC數據集是使用兩個針孔照相機(雙目)和一個慣性傳感器(IMU)采集的數據
下載ASL格式的序列:https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets#downloads

這里下載的是MH01,Dataset machine hall “easy” 。
下載后進行解壓。注意dataset文件夾與ORB_SLAM3同路徑下,并且dataset目錄下只有一個mav0文件夾,為解壓后的MH_01

打開ORB-SLAM3源碼中的腳本euroc_examples.sh,找到包含MH01的指令:

./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml "$pathDatasetEuroc"/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono

$pathDatasetEuroc/MH01改成自己數據集的路徑。其中我的路徑為:ORB_SLAM3/Datasets/MH_01 ,并去掉指令中的dataset-MH01_mono,最終改成的指令如下:

./Examples/Monocular-Inertial/mono_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml ./Dataset/MH01 ./Examples/Monocular-Inertial/EuRoC_TimeStamps/MH01.txt

在這里插入圖片描述

評價:
純視覺的軌跡由左攝像頭中心采集,通過evaluation文件夾將地面真實軌跡轉換為左攝像頭的參考軌跡。

執行以下腳本,處理序列并計算RMS ATE:

./Examples/Stereo/stereo_euroc ./Vocabulary/ORBvoc.txt ./Examples/Stereo/EuRoC.yaml ./Dataset/MH01 ./Examples/Stereo/EuRoC_TimeStamps/MH01.txt dataset-MH01_stereo

echo “------------------------------------”
echo “Evaluation of MH01 trajectory with Stereo sensor”

python evaluation/evaluate_ate_scale.py evaluation/Ground_truth/EuRoC_left_cam/MH01_GT.txt f_dataset-MH01_stereo.txt --plot MH01_stereo.pdf

四、運行bug解決

(1)Pangolin安裝問題

1)cmake與anaconda的動態鏈接庫沖突

/usr/lib may be hidden by files in /home/username/anaconda/lib

系統存在兩個動態鏈接庫(.so文件),分別在 /usr/lib 和 anaconda/lib 下。
由于曾分別用常規方式和 anaconda 安裝過 opencv。用anaconda安裝后, 默認的路徑就是anaconda, 因此鏈接不到 /usr/lib 下的庫文件,所以報錯。

參考:https://blog.csdn.net/weixin_30555753/article/details/98960883

解決方法:刪除或轉移相關的文件

2)找不到 Doxygen

Could NOT find Doxygen (missing: DOXYGEN_EXECUTABLE)

解決辦法:安裝 Doxygen

sudo apt-get install doxygen

3)找不到libpng,未連接動態庫函數

在這里插入圖片描述
../../src/libpangolin.so: undefined reference to `png_set_longjmp_fn'

未找到動態庫層的函數,可能是版本過低的原因,需要鏈接更高版本的libpng庫。

查看系統png庫的版本

$ cd /lib/x86_64-linux-gnu
$ ll | grep png

輸出

lrwxrwxrwx  1 root root      18 7月  11  2018 libpng12.so.0 -> libpng12.so.0.54.0
-rw-r--r--  1 root root  149904 7月  11  2018 libpng12.so.0.54.0

$ cd /usr/lib/x86_64-linux-gnu
$ ll | grep png

輸出

-rw-r--r--   1 root root    243746 7月  11  2018 libpng12.a
lrwxrwxrwx   1 root root        13 7月  11  2018 libpng12.so -> libpng12.so.0
lrwxrwxrwx   1 root root        35 7月  11  2018 libpng12.so.0 -> /lib/x86_64-linux-gnu/libpng12.so.0
lrwxrwxrwx   1 root root        10 7月  11  2018 libpng.a -> libpng12.a
lrwxrwxrwx   1 root root        11 7月  11  2018 libpng.so -> libpng12.so

現在用的libpnglibpng12.so

解決方法:
1)創建一個軟鏈接libpng16.so指向libpng16.so.16

$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libpng16.so.16 libpng16.so
$ ll | grep png

輸出

-rw-r--r--   1 root root    243746 7月  11  2018 libpng12.a
lrwxrwxrwx   1 root root        13 7月  11  2018 libpng12.so -> libpng12.so.0
lrwxrwxrwx   1 root root        35 7月  11  2018 libpng12.so.0 -> /lib/x86_64-linux-gnu/libpng12.so.0
lrwxrwxrwx   1 root root        14 9月  24 16:37 libpng16.so -> libpng16.so.16
lrwxrwxrwx   1 root root        10 7月  11  2018 libpng.a -> libpng12.a
lrwxrwxrwx   1 root root        11 7月  11  2018 libpng.so -> libpng12.so

2)刪除之前的軟鏈接libpng.so

$ cd /usr/lib/x86_64-linux-gnu
$ sudo rm -rf libpng.so 
$ ll | grep png

輸出

-rw-r--r--   1 root root    243746 7月  11  2018 libpng12.a
lrwxrwxrwx   1 root root        13 7月  11  2018 libpng12.so -> libpng12.so.0
lrwxrwxrwx   1 root root        35 7月  11  2018 libpng12.so.0 -> /lib/x86_64-linux-gnu/libpng12.so.0
lrwxrwxrwx   1 root root        14 9月  24 16:37 libpng16.so -> libpng16.so.16
lrwxrwxrwx   1 root root        10 7月  11  2018 libpng.a -> libpng12.a
chan@chanpc:/usr/lib/x86_64-linux-gnu$ 

3)創建一個新的軟鏈接libpng.so指向libpng16.so

$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libpng16.so libpng.so
$ ll | grep png

-rw-r--r--   1 root root    243746 7月  11  2018 libpng12.a
lrwxrwxrwx   1 root root        13 7月  11  2018 libpng12.so -> libpng12.so.0
lrwxrwxrwx   1 root root        35 7月  11  2018 libpng12.so.0 -> /lib/x86_64-linux-gnu/libpng12.so.0
lrwxrwxrwx   1 root root        14 9月  24 16:37 libpng16.so -> libpng16.so.16
lrwxrwxrwx   1 root root        10 7月  11  2018 libpng.a -> libpng12.a
lrwxrwxrwx   1 root root        11 9月  24 16:44 libpng.so -> libpng16.so

4)仍然報錯No rule to make target '/usr/lib/x86_64-linux-gnu/libpng.so', needed by 'src/libpangolin.so'. Stop.

動態鏈接庫的鏈接性中斷,搜索發現libpng.so文件存在與anaconda目錄.

  • 搜索libpng.so文件路徑: 本機中路徑為:~/anaconda3/libuuid/libpng.so
  • 建立symlink
sudo ln -s ~/anaconda3/libuuid/libpng.so /usr/lib/x86_64-linux-gnu/libpng.so

報錯File exists,則刪除原有文件

sudo rm /usr/lib/x86_64-linux-gnu/libpng.so

重新建立軟連接即可。

參考:http://blog.csdn.net/wangpanbaoding/article/details/104185058

4)CMakeFiles文件出錯

CMakeFiles/Makefile2:136: recipe for target 'src/CMakeFiles/pangolin.dir/all' failed
make[1]: *** [src/CMakeFiles/pangolin.dir/all] Error 2
Makefile:149: recipe for target 'all' failed
make: *** [all] Error 2

由于系統安裝了Anaconda產生了沖突,可以采取軟連接的方式指定。

(2)OpenCV安裝問題

1)找不到ccache

looking for ccache --not found

解決方法:

$ sudo apt-get install ccache

2)找不到gtk±3.0

No package 'gtk+-3.0' found

安裝gtk±3.0

$ sudo apt install libgtk-3-devgtk+-3.0

$ sudo apt-get install libgtk-3-dev

3)找不到OpenJPEG

Could NOT find OpenJPEG

安裝依賴項

$ sudo apt-get install liblcms2-dev  libtiff-dev libpng-dev libz-dev

下載并解壓

$ git clone https://github.com/uclouvain/openjpeg.git

編譯

$ cd openjpeg
$ mkdir build
$ cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make

參考官網:https://github.com/uclouvain/openjpeg/blob/master/INSTALL.md

4)IPPICV安裝

參考:https://www.cnblogs.com/yongy1030/p/10293178.html

打開ippicv.cmake文件

$ sudo gedit ~/opencv/3rdparty/ippicv/ippicv.cmake

第一個是IPPICV_COMMIT,它的值可以從代碼中找到:

set(IPPICV_COMMIT "a56b6ac6f030c312b2dce17430eef13aed9af274")

第二個是OPENCV_IPPICV_URL,同理可以找到:

$ENV{OPENCV_IPPICV_URL}"<br>"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/

最后一個是文件名OPENCV_ICV_NAME

if(X86_64)
      set(OPENCV_ICV_NAME "ippicv_2020_lnx_intel64_20191018_general.tgz")
      set(OPENCV_ICV_HASH "7421de0095c7a39162ae13a6098782f9")

這三個聯合起來就可以得到文件的下載路徑為:

https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_lnx_intel64_20191018_general.tgz

ps: 解決GitHub的raw.githubusercontent.com無法連接問題

修改host文件

$ sudo gedit /etc/hosts

添加以下內容保存即可 (IP地址查詢后相應修改,可以ping不同IP的延時 選擇最佳IP地址)

#GitHub Start
52.74.223.119 github.com
192.30.253.119 gist.github.com
54.169.195.247 api.github.com
185.199.111.153 assets-cdn.github.com
151.101.108.133 raw.githubusercontent.com
151.101.108.133 user-images.githubusercontent.com
151.101.76.133 gist.githubusercontent.com
151.101.76.133 cloud.githubusercontent.com
151.101.76.133 camo.githubusercontent.com
151.101.76.133 avatars0.githubusercontent.com
151.101.76.133 avatars1.githubusercontent.com
151.101.76.133 avatars2.githubusercontent.com
151.101.76.133 avatars3.githubusercontent.com
151.101.76.133 avatars4.githubusercontent.com
151.101.76.133 avatars5.githubusercontent.com
151.101.76.133 avatars6.githubusercontent.com
151.101.76.133 avatars7.githubusercontent.com
151.101.76.133 avatars8.githubusercontent.com
#GitHub End

參考:https://www.cnblogs.com/sinferwu/p/12726833.html

  • 下載文件:
sudo wget https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_lnx_intel64_20191018_general.tgz

  • 修改 ippicv.cmake

將如下的地址

 "${OPENCV_IPPICV_URL}"
                 "$ENV{OPENCV_IPPICV_URL}"
                 "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/"

修改為ippicv安裝包所在本地路徑file://本地路徑

最后還是報錯,直接將文件修改名字后放在.cache下載文件夾、

5)找不到BLAS, Atlas, LAPACK

 Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
-- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
-- Could NOT find Atlas (missing:  Atlas_CBLAS_INCLUDE_DIR Atlas_CLAPACK_INCLUDE_DIR Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY Atlas_LAPACK_LIBRARY) 
-- A library with BLAS API not found. Please specify library location.
-- LAPACK requires BLAS
-- A library with LAPACK API not found. Please specify library location.

  • 安裝OpenBLAS、Atlas和lapack
$ sudo apt-get install libopenblas-dev
$ sudo apt-get install libatlas-dev
$ sudo apt-get install liblapacke-dev

找到API,仍然找不到庫文件和頭文件,報錯

-- Could not find OpenBLAS include. Turning OpenBLAS_FOUND off
-- Could not find OpenBLAS lib. Turning OpenBLAS_FOUND off
-- Could NOT find Atlas (missing: Atlas_CBLAS_LIBRARY Atlas_BLAS_LIBRARY)

  • 官網下載源文件,進行庫文件和頭文件的復制。

安裝gfortran編譯器

$ sudo apt-get install gfortran

下載blas, cblas, lapack 源代碼
官網:http://www.netlib.org/blas
依次解壓之后有三個文件夾,BLAS-3.8.0,CBLAS, lapack-3.9.0

編譯 blas

$ cd BLAS-3.8.0
$ gfortran -c  -O3  -fPIC  *.f # 編譯所有的 .f 文件,生成 .o文件   加上了-fPIC
$ gcc -shared *.o -fPIC -o  libblas.so
$ sudo cp libblas.so /usr/local/lib/
$ ar rv libblas.a *.o  # 鏈接所有的 .o文件,生成 .a 文件  
$ sudo cp libblas.a /usr/local/lib  # 將庫文件復制到系統庫目錄

編譯 cblas

進入CBLAS文件夾,根據計算機平臺,將目錄下某個 Makefile.XXX 復制為 Makefile.in 。XXX表示計算機的平臺,如果是Linux,那么就將Makefile.LINUX 復制為 Makefile.in

$ cd CBLAS
$ sudo cp ../BLAS-3.8.0/libblas.a  testing  # 將上一步編譯成功的 libblas.a 復制到 CBLAS目錄下的testing子目錄  
$ make # 編譯所有的目錄    
$ sudo cp lib/cblas_LINUX.a /usr/local/lib/libcblas.a  #   將lib文件夾下cblas-LINUX.a文件名改為libcblas.a 將庫文件復制到系統庫目錄下 

編譯 lapack

進入lapack-3.9.0文件夾,根據平臺將INSTALL目錄下對應的make.inc.XXX 復制一份到 lapack-3.9.0目錄下,并命名為make.inc, 這里復制的是 INSTALL/make.inc.gfortran

$ sudo cp INSTALL/make.inc.gfortran  make.inc

修改Makefile, 因為lapack以來于blas庫,所以需要做如下修改

$ sudo gedit Makefile

.PHONY: lib
lib: lapacklib tmglib
#lib: blaslib variants lapacklib tmglib

改為

#lib: lapacklib tmglib
lib: blaslib variants lapacklib tmglib

修改make.inc 文件

$ sudo gedit make.inc

#
BLASLIB      = $(TOPSRCDIR)/librefblas.a
CBLASLIB     = $(TOPSRCDIR)/libcblas.a
LAPACKLIB    = $(TOPSRCDIR)/liblapack.a
TMGLIB       = $(TOPSRCDIR)/libtmglib.a
LAPACKELIB   = $(TOPSRCDIR)/liblapacke.a

改為

BLASLIB  = /usr/local/lib/libblas.a
CBLASLIB = /usr/local/lib/libcblas.a
LAPACKLIB = liblapack.a
TMGLIB = libtmglib.a
LAPACKELIB = liblapacke.a

設定好對應的blascblas目標文件的鏈接路徑(在系統庫目錄下的)。

$ make # 編譯所有的lapack文件
$ cd LAPACKE # 進入LAPACKE 文件夾,這個文件夾包含lapack的C語言接口文件
$ make # 編譯lapacke
$ sudo cp include/*.h /usr/local/include #將lapacke的頭文件復制到系統頭文件目錄
$ cd .. #返回到 lapack-3.9.0 目錄
$ sudo cp *.a /usr/local/lib # 將生成的所有庫文件復制到系統庫目錄

頭文件包括: lapacke.h, lapacke_config.h, lapacke_mangling.h, lapacke_mangling_with_flags.h lapacke_utils.h

庫文件包括:liblapack.a, liblapacke.a, librefblas.a, libtmglib.a

檢查/usr/local/lib,發現缺少lapacke_mangling_with_flags.h,返回LAPACKE/include文件夾將后綴h.in修改為.h,重新復制。

發現缺少liblapacke.alibtmglib.a,發現之前安裝過的文件放在/usr/lib/x86_64-linux-gnu,重新復制。

發現缺少librefblas.a,且本機無相關文件,閱讀make.inc和example文件發現與liblapack.a相同,鏈接BLASLIB,忽略。

嘗試將文件復制到/usr/lib和/usr/include 的目錄下

/usr/local/lib$ sudo cp *.a /usr/lib
/usr/local/include$ sudo cp *.h /usr/include

最后發現是文件放在/usr/lib/x86_64-linux-gnu cmake文件沒有搜到,修改OpenCVFindOpenBLAS.cmake

$ sudo gedit opencv/cmake/OpenCVFindOpenBLAS.cmake

找到

SET(Open_BLAS_INCLUDE_SEARCH_PATHS

添加路徑/usr/include/x86_64-linux-gnu

找到

SET(Open_BLAS_LIB_SEARCH_PATHS

添加路徑/usr/lib/x86_64-linux-gnu

參考:http://www.lxweimin.com/p/33c4aea6117b

6)找不到JNI

Could NOT find JNI (missing:  JAVA_AWT_LIBRARY JAVA_JVM_LIBRARY JAVA_INCLUDE_PATH JAVA_INCLUDE_PATH2 JAVA_AWT_INCLUDE_PATH) 

嘗試安裝jdk-8u202-linux-x64.tar.gz解決問題
參考:https://blog.csdn.net/zbj18314469395/article/details/86064849

· 下載推薦鏡像地址:https://mirrors.huaweicloud.com/java/jdk/

· 解壓縮到指定目錄(以jdk-8u202-linux-x64.tar.gz為例)

創建目錄:

$ sudo mkdir /usr/lib/jvm

解壓縮到該目錄:

$ sudo tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/lib/jvm

· 修改環境變量:

$ sudo gedit ~/.bashrc

在文件末尾追加下面內容:

#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_202 ## 這里要注意目錄要換成自己解壓的jdk 目錄
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH  

· 使環境變量馬上生效:

$ source ~/.bashrc

· 系統注冊此jdk

$ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.8.0_202/bin/java 300

· 查看java版本,看看是否安裝成功:

$ java -version

重啟生效

7)找不到VTK

 VTK is not found. Please set -DVTK_DIR in CMake to VTK build directory, or to VTK install subdirectory with VTKConfig.cmake file

  • 編譯安裝
$ sudo apt install libvtk6-dev

一連串的報錯

The imported target "vtkHashSource" references the file
   "/usr/bin/vtkHashSource-6.3"
but this file does not exist.

  • 嘗試手動編譯安裝vtk
    下載依賴項
$ sudo apt-get install libgl1-mesa-dev
$ sudo apt-get install libglu1-mesa-dev
$ sudo apt-get install freeglut3-dev
$ sudo apt-get install mesa-common-dev
$ sudo apt-get install cmake-curses-gui

下載源碼:https://vtk.org/download/

建議使用git clone

$ git clone https://gitlab.kitware.com/vtk/vtk.git

或鏡像文件

$ git clone https://hub.fastgit.org/Kitware/VTK

下載的版本為9.0.1

配置VTK


$ cd VTK
$ mkdir build
$ cd build
$ ccmake ..

主要配置選項:

    # 按照VTK tutorial要求,每設置完一項均按'c'進行一次configuration,直到所有項目設置完,

    BUILD_SHARED_LIBS = ON   

    BUILD_TESTING = ON    # 默認OFF,如果打開的話,編譯時會由于下載測試數據所用url過舊而報錯,建議OFF

    CMAKE_BUILD_TYPE = Release    # 默認Debug運行會較慢

    CMAKE_INSTALL_PREFIX = /usr/local    # 這里用默認就行,或者改到想要安裝的位置

    # 以下為高級設置,需先在命令行按't'才可見
    VTK_FORBID_DOWNLOADS = ON    # 默認OFF,建議打開,否則編譯會報錯,理由同BUILD_TESTING

    # 按 c 進行configure
    # 此時應已經出現'g' generating 的按鍵選項,按 'g' 即完成配置.

編譯安裝VTK

$ cd /VTK/build
$ cmake -DVTK_QT_VERSION:STRING=5 \
      -DQT_QMAKE_EXECUTABLE:PATH=/opt/Qt5.12.9/5.12.9/gcc_64/bin/qmake \
      -DVTK_Group_Qt:BOOL=ON \
      -DCMAKE_PREFIX_PATH:PATH=/opt/Qt5.12.9/5.12.9/gcc_64/lib/cmake  \
      -DBUILD_SHARED_LIBS:BOOL=ON ..
$ sudo make -j8
$ sudo make install

官方cmake編譯容易報錯,可以采用以下的cmake gui的方式

$ sudo apt install cmake-qt-gui

在build目錄下運行

$ cd VTK/build
$ sudo cmake-gui <VTK源碼的絕對路徑>

彈出配置窗口

在這里插入圖片描述

configure報錯,cmake版本需要在3.7以上。原版本為3.5.1,需要更新。

ubuntu20.04更新后重復以上操作,會安裝3.16.3的版本。
但ubuntu16.04會安裝回3.5.1版本,回到cmake-3.18.3目錄,進行編譯。

$ cd /opt/cmake-3.18.3
$ ./configure --qt-gui
$ make -j8
$ sudo make install 

· cmake上advance打勾,將VTK_Group_Qt打勾,制定Qt相應模塊的目錄
點擊configure
點擊generate

最后編譯:

$ sudo make -j8
$ sudo make install

完成安裝,再次編譯OpenCV已找到VTK。

若仍然無法找到VTK,用cmake-gui進行配置OpenCV:

1、找到VTK_DIR,填寫VTKbuild目錄
2、勾選WITH_VTK.
3、勾選BIULD_opencv_world(勾選此項,編譯之后會生成opencv_world.lib)。點擊configure按鈕。沒有紅色標識后,點擊generate按鈕。

參考:
https://blog.csdn.net/weixin_30552635/article/details/96263611
https://blog.csdn.net/sinat_28752257/article/details/79169647
https://blog.csdn.net/luolinll1212/article/details/102721840

8)Qt5.12.9安裝

VTK仍然沒有找到,cmake預設目錄查找。


在這里插入圖片描述

發現本機缺少安裝Qt5。

采用cmake-gui的時候報錯

Found unsuitable Qt version "" from NOTFOUND, this code requires Qt 4.x
Call Stack (most recent call first):

需要qt4.x以上的安裝。

下載官網:http://download.qt.io/archive/qt/4.8/4.8.6/

或者選擇鏡像文件

$ sudo wget https://mirror.tuna.tsinghua.edu.cn/qt/archive/qt/5.12/5.12.9/qt-opensource-linux-x64-5.12.9.run

解壓后將文件移動至/opt/文件夾進行編譯安裝

$ sudo mv qt-opensource-linux-x64-5.12.9.run /opt/
$ cd /opt/
$ sudo chmod +x qt-opensource-linux-x64-5.12.9.run
$ sudo ./qt-opensource-linux-x64-5.12.9.run

進行注冊后按照步驟進行安裝


在這里插入圖片描述

安裝成功后返回cmake-gui進行路徑設置


在這里插入圖片描述

重新編譯VTK

9)找不到libavresample

-- Checking for module 'libavresample'
--   No package 'libavresample' found

安裝libavresample


$ sudo apt-get install libavresample-dev

10)OpenCL未安裝

CMake Warning at cmake/OpenCVFindVA_INTEL.cmake:28 (message):
  Intel OpenCL installation is not found.
Call Stack (most recent call first):
  cmake/OpenCVFindLibsVideo.cmake:333 (include)
  CMakeLists.txt:693 (include)

(3)ORB-SLAM3安裝問題

1)CMakeFiles文件出錯

CMake Error at CMakeLists.txt:31 (message):
  OpenCV > 2.4.3 not found.

問題應該是OpenCV要求在3.x的版本,但是下載了較高版本的4.5.0,嘗試卸載重裝。

重新設置OpenCV路徑

$ sudo gedit /ORB_SLAM3/CMakeLists.txt

set(OpenCV_DIR  /home/username/opencv/build)
find_package(OpenCV REQUIRED)

2)Eigen的deprecated錯誤

編譯ORB-SLAM3時,出現關于eigen的deprecated錯誤,如下:


在這里插入圖片描述

出現這個問題是因為安裝的eigen版本太高,需要降低到3.2.1版本。

查看版本

$ sudo gedit /usr/local/include/Eigen/src/Core/util/Macros.h

原本裝的是eigen-3.3.7


在這里插入圖片描述

操作方法:

  1. 卸載原本的eigen:
$ sudo rm -rf /usr/local/include/Eigen

  1. 下載eigen-3.2.10版本,并解壓縮進入文件夾,執行如下命令:

下載

$ sudo wget https://gitlab.com/libeigen/eigen/-/archive/3.2.1/eigen-3.2.1.zip

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

  1. 重新編譯Pangolin, DBoW2, g2o, ORB_SLAM3

參考:https://blog.csdn.net/u010003609/article/details/100676041

  1. 相關bug解決
    (1)
-- Performing Test COMPILER_SUPPORT_wd981 - Failed
-- Performing Test COMPILER_SUPPORT_wd2304 - Failed

(2)

qmake: could not find a Qt installation of ''

之前安裝過舊版本的 Qt ,所以 qmake 軟鏈接發生錯誤


$ sudo rm /usr/bin/qmake #        刪除原先的鏈接
$ sudo ln -s Qt-qmake的位置 /usr/bin/qmake         #建立新的鏈接

若仍然未解決
添加#include <unistd.h>System.h

參考:https://github.com/raulmur/ORB_SLAM2/issues/661

3)沒找到Eigen3相關cmake文件

報錯

CMake Error at CMakeLists.txt:72 (FIND_PACKAGE):
  By not providing "FindEigen3.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "Eigen3", but
  CMake did not find one.

  Could not find a package configuration file provided by "Eigen3" (requested
  version 3.1.0) with any of the following names:

    Eigen3Config.cmake
    eigen3-config.cmake

  Add the installation prefix of "Eigen3" to CMAKE_PREFIX_PATH or set
  "Eigen3_DIR" to a directory containing one of the above files.  If "Eigen3"
  provides a separate development package or SDK, be sure it has been
  installed.

對路徑為 …/ORB-SLAM3/CMakeLists.txt的47行,進行修改

find_package(Eigen3 3.1.0 REQUIRED)

去掉3.1.0限制,改為

find_package(Eigen3 REQUIRED)

同時對路徑 …/ORB_SLAM3/Thirdparty/g2o/CMakeLists.txt的第72行,進行修改

FIND_PACKAGE(Eigen3 3.1.0 REQUIRED)

去掉3.1.0限制,改為

FIND_PACKAGE(Eigen3 REQUIRED)

參考:https://blog.csdn.net/ly869915532/article/details/107899708

1、找到FindEigen3.cmake文件路徑

/usr/local/include/eigen3/cmake

2、復制到自己這個的工程下

$ sudo cp /usr/local/include/eigen3/cmake/FindEigen3.cmake /home/chan/ORB_SLAM3

3、在工程的CMakeLists.txt里面。

$ sudo gedit ~/ORB_SLAM3/CMakeLists.txt

添加這句話:

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})

find_package(Eigen3)
if(NOT EIGEN3_FOUND)
  # Fallback to cmake_modules
  find_package(cmake_modules REQUIRED)
  find_package(Eigen REQUIRED)
  set(EIGEN3_INCLUDE_DIRS ${EIGEN_INCLUDE_DIRS})
  set(EIGEN3_LIBRARIES ${EIGEN_LIBRARIES})  # Not strictly necessary as Eigen is head only
  # Possibly map additional variables to the EIGEN3_ prefix.
else()
  set(EIGEN3_INCLUDE_DIRS ${EIGEN3_INCLUDE_DIR})
endif()

參考:https://blog.csdn.net/handsome_for_kill/article/details/53288771

4)error-找不到MatrixFunctions矩陣函數

/home/chan/ORB_SLAM3/src/Optimizer.cc:28:10: fatal error: unsupported/Eigen/MatrixFunctions: No such file or directory
   28 | #include <unsupported/Eigen/MatrixFunctions>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

$ cd eigen-3.2.1 #eigen的解壓安裝包的位置
$ sudo cp -r unsupported/ /usr/local/include

5)warning排除-static assertion failed

error: static assertion failed: std::map must have the same value_type as its allocator

ORB-SLAM3源碼目錄中include/LoopClosing.h文件中的

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

修改為

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。