【SLAM】ubuntu16.04及ubuntu20.04編譯ORB-SLAM3及運行EuRoC數據集:https://blog.csdn.net/weixin_47074246/article/details/108691189#1%09_291
ORB-SLAM3安裝及運行EuRoC數據集
- 一、 依賴庫安裝
- 二、ORB-SLAM3 編譯
- 三、EuRoC 數據集測試
- 四、運行bug解決
需要各種庫的下載安裝(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.txt
用include_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
下已包含g2o
和DBoW2
,只需安裝依賴項。
$ 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 鏡像文件提速。
- 下載git
官網有點慢 https://git-scm.com/downloads
或 windows下載 https://download.csdn.net/download/qq_20051535/12667504?utm_source=bbsseo
下載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
現在用的libpng
是libpng12.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
設定好對應的blas
和cblas
目標文件的鏈接路徑(在系統庫目錄下的)。
$ 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.a
和libtmglib.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
,填寫VTK
的build
目錄
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
操作方法:
- 卸載原本的eigen:
$ sudo rm -rf /usr/local/include/Eigen
- 下載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
- 重新編譯Pangolin, DBoW2, g2o, ORB_SLAM3
參考:https://blog.csdn.net/u010003609/article/details/100676041
- 相關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;