學(xué)完SLAM十四講 心血來潮想跑一下ORB-SLAM2的代碼,純新手小白,自己的踩坑經(jīng)歷進行整理:
本文章主要對ORB-SLAM2進行編譯運行。以及自己構(gòu)建數(shù)據(jù)集。
1 ORB-SLAM2 簡介
源碼github地址:https://github.com/raulmur/ORB_SLAM2
終端克隆代碼:
git clone https://github.com/raulmur/ORB_SLAM2.git ORB_SLAM2
查看源代碼,其重要的代碼庫僅為三個文件夾:
Example
include
src
2 安裝相關(guān)庫:
可以去看我?guī)熜衷谥醢l(fā)的文章:https://zhuanlan.zhihu.com/p/452256687
主要操作:
2.1更新apt庫:
sudo apt-get update
2.2安裝git
用于從Github上克隆項目到本地
sudo apt-get install git
2.3安裝cmake(巨牛逼)
用于程序的編譯
sudo apt-get install cmake
2.4安裝Pangolin
注意: 需安裝0.5版本的Pangolin,若安裝最新版會在SLAM項目build時出現(xiàn) cannot find -lEigen3::Eigen 的報錯。
直接在Ubuntu中打開鏈接
下載地址:https://github.com/stevenlovegrove/Pangolin/tree/v0.5
終端克隆倉庫:
git clone https://github.com/stevenlovegrove/Pangolin.git
安裝依賴項:
sudo apt-get install libglew-dev libboost-dev libboost-thread-dev libboost-filesystem-dev libpython3.8-dev python3-pip
在slambook2/3rdparty/Pangolin文件夾下打開終端并輸入:
mkdir build
cd build/
cmake ..
make -j4
sudo make install
測試驗證:
cd ../examples/HelloPangolin
mkdir build && cd build
cmake ..
make
./HelloPangolin
此時終端出現(xiàn)圖像,則安裝成功
3 更改代碼中OpenCV(本代碼經(jīng)過修改為4.5.3版本適用)版本
3.1 版本過高,更改最新版本
涉及文件夾:
CMakeLists.txt
Examples/ROS/ORB_SLAM2/CMakeLists.txt
Thirdparty/DBoW2/CMakeLists.txt
需要更改第一行代碼,下面那一行是判斷版本不正確時,不會進入那一步
find_package(OpenCV 3.0 QUIET) 中更改為 find_package(OpenCV 4.5.3 QUIET)
由于OpenCV版本問題,在opencv4中opencv2的cv.h融合進了imgproc.hpp里我們修改其代碼,
include文件夾
include/ORBextractor.h
頭文件中
#include <opencv/cv.h>
更改為
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/highgui/highgui_c.h>
3.2 OpenCV高版本更改
由于opencv高版本棄用CV_LOAD_IMAGE_UNCHANGED這一參數(shù)導(dǎo)致的涉及到以下文件夾:
Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples/RGB-D/rgbd_tum.cc
Examples/ROS/Stereo/stereo_euroc.cc
Examples/ROS/Stereo/stereo_kitti.cc
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
將 CV_LOAD_IMAGE_UNCHANGED 更改為 cv::IMREAD_UNCHANGED
4 代碼報錯
4.1 初次編譯
orbslam2 fatal error: …/…/config.h: 沒有那個文件或目錄
因為g2o沒有編譯完整,進入ORB_SLAM2文件夾,重新執(zhí)行 ./build.sh
打開ORB-SLAM文件夾,終端輸入完整代碼:
cd ORB_SLAM2
chmod +x build.sh
./build.sh
4.2 為避免報錯usleep(未聲明)的問題
在以下文件夾中頭文件添加
Examples 中 Monocular單目相機文件夾
Examples/Monocular/mono_euroc.cc
Examples/Monocular/mono_kitti.cc
Examples/Monocular/mono_tum.cc
Examples 中 RGB-D深度相機文件夾
Examples/RGB-D/rgbd_tum.cc
Examples 中 Stereo雙目相機文件夾
Examples/Stereo/stereo_euroc.cc
Examples/Stereo/stereo_kitti.cc
include文件夾
include/System.h
src文件夾
src/LocalMapping.cc
src/LoopClosing.cc
src/System.cc
src/Tracking.cc
src/Viewer.cc
頭文件添加
#include <unistd.h>
4.3 修改
把ORB-SLAM2源碼目錄中include/LoopClosing.h文件夾中第49行代碼(中文注釋版本在第64行):
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;
5 搭建自己的數(shù)據(jù)集(單目視頻)
原本ORB-SLAM2文件夾的樣子:
在跑自己的數(shù)據(jù)后文件夾內(nèi)容:
5.1 新建myvideo.yaml
在ORB-SLAM2文件夾打開終端,要新建一個myvideo.yaml,在終端輸入:
gedit myvideo.yaml
打開新建myvideo.yaml,復(fù)制以下內(nèi)容:
%YAML:1.0
#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------
# Camera calibration and distortion parameters (OpenCV)
Camera.fx: 500.0
Camera.fy: 500.0
Camera.cx: 320.0
Camera.cy: 240.0
Camera.k1: 0
Camera.k2: 0
Camera.p1: 0
Camera.p2: 0
Camera.k3: 0
# Camera frames per second
Camera.fps: 30.0
# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 0
#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------
# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1000
# ORB Extractor: Scale factor between levels in the scale pyramid
ORBextractor.scaleFactor: 1.2
# ORB Extractor: Number of levels in the scale pyramid
ORBextractor.nLevels: 8
# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast
ORBextractor.iniThFAST: 10
ORBextractor.minThFAST: 5
#--------------------------------------------------------------------------------------------
# Viewer Parameters
#--------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize: 2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500
(這一步是設(shè)置自己手機攝像頭的參數(shù),可以就按照這個用著,手機相機的參數(shù)差不多。)
5.2 新建myvideo.cpp
在ORB-SLAM2文件夾打開終端,要新建一個myvideo.cpp,在終端輸入:
gedit myvideo.cpp
打開新建的myvideo.cpp,直接復(fù)制輸入下面的代碼。注意第9、10、12行,根據(jù)myvideo.yaml、ORBvoc.txt、myvideo.mp4的具體位置自行修改。
#include <opencv2/opencv.hpp>
#include "System.h"
#include <string>
#include <chrono> // for time stamp
#include <iostream>
using namespace std;
// 參數(shù)文件與字典文件
// 如果你系統(tǒng)上的路徑不同,請修改它
string parameterFile = "./myvideo.yaml";
string vocFile = "./Vocabulary/ORBvoc.txt";
// 視頻文件,若不同請修改
string videoFile = "./myvideo.mp4";
int main(int argc, char **argv) {
// 聲明 ORB-SLAM2 系統(tǒng)
ORB_SLAM2::System SLAM(vocFile, parameterFile, ORB_SLAM2::System::MONOCULAR, true);
// 獲取視頻圖像
cv::VideoCapture cap(videoFile); // change to 0 if you want to use USB camera.
// 記錄系統(tǒng)時間
auto start = chrono::system_clock::now();
while (1) {
cv::Mat frame;
cap >> frame; // 讀取相機數(shù)據(jù)
if ( frame.data == nullptr )
continue;
// rescale because image is too large
cv::Mat frame_resized;
cv::resize(frame, frame_resized, cv::Size(640,360));
auto now = chrono::system_clock::now();
auto timestamp = chrono::duration_cast<chrono::milliseconds>(now - start);
SLAM.TrackMonocular(frame_resized, double(timestamp.count())/1000.0);
cv::waitKey(30);
}
return 0;
}
(這一步,若按照以上的步驟是不需要修改的,第一步的myvideo.yaml就在ORB-SLAM2文件夾中,ORBvoc.txt下載自帶的就在ORB-SLAM2文件夾的Vocabulary文件夾中,myvideo.mp4在第四步,也在ORB-SLAM2文件夾中
5.3 修改CMakeLists.txt
打開ORB-SLAM2文件夾中的CMakeLists.txt,在最后復(fù)制添加以下代碼并保存:
#生成調(diào)用myvideo.mp4 可執(zhí)行文件
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})
add_executable(myvideo myvideo.cpp)
target_link_libraries(myvideo ${PROJECT_NAME})
5.4 拍攝一段視頻
注意使用手機(單目)拍攝視頻時,因slam初始化需要一定時間,開始的攝像機盡量不要對著顏色單一的白墻或者其他,旋轉(zhuǎn)速度不要太快,將拍好的視頻上傳到電腦,命名為myvideo.mp4,放在ORB-SLAM2文件夾中。
5.5 編譯和運行
ORB-SLAM2文件夾打開終端,直接復(fù)制下面代碼即可運行:
cd ORB_SLAM2
mkdir build
cd build
cmake ..
make -j
cd ..
./myvideo #(執(zhí)行)
這是我的運行結(jié)果:文章來源:http://www.zghlxwxcb.cn/news/detail-839249.html
6 參考博文:
師兄的環(huán)境安裝:https://zhuanlan.zhihu.com/p/452256687
ORB-SLAM的安裝:https://blog.csdn.net/qq_51645628/article/details/123263013?
編譯出現(xiàn)的問題:https://blog.csdn.net/SEAL0107/article/details/128316425?
使用自己的數(shù)據(jù)集(特別鳴謝,這個很牛,適合新手學(xué)習):https://blog.csdn.net/weixin_45947476/article/details/123923975
使用matlab標定相機內(nèi)參(注意固定焦距):https://blog.csdn.net/qq_64079631/article/details/127984760?
代碼講解:https://www.yuque.com/chenhai-7zi1m/se4n14/udvggt文章來源地址http://www.zghlxwxcb.cn/news/detail-839249.html
到了這里,關(guān)于【SLAM實戰(zhàn)篇】Ubuntu 20.04版本(OpenCV版本4.5.3)對于ORB-SLAM2安裝運行,代碼編譯,自己的數(shù)據(jù)集構(gòu)造的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!