学完SLAM十四讲 心血来潮想跑一下ORB-SLAM2的代码,纯新手小白,自己的踩坑经历进行整理:
本文章主要对ORB-SLAM2进行编译运行。以及自己构建数据集。
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 安装相关库:
可以去看我师兄在知乎发的文章: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时出现 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
此时终端出现图像,则安装成功
3 更改代码中OpenCV(本代码经过修改为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这一参数导致的涉及到以下文件夹:
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文件夹,重新执行 ./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 搭建自己的数据集(单目视频)
原本ORB-SLAM2文件夹的样子:
在跑自己的数据后文件夹内容:
5.1 新建myvideo.yaml
在ORB-SLAM2文件夹打开终端,要新建一个myvideo.yaml,在终端输入:
gedit myvideo.yaml
打开新建myvideo.yaml,复制以下内容:
%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
(这一步是设置自己手机摄像头的参数,可以就按照这个用着,手机相机的参数差不多。)
5.2 新建myvideo.cpp
在ORB-SLAM2文件夹打开终端,要新建一个myvideo.cpp,在终端输入:
gedit myvideo.cpp
打开新建的myvideo.cpp,直接复制输入下面的代码。注意第9、10、12行,根据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;
// 参数文件与字典文件
// 如果你系统上的路径不同,请修改它
string parameterFile = "./myvideo.yaml";
string vocFile = "./Vocabulary/ORBvoc.txt";
// 视频文件,若不同请修改
string videoFile = "./myvideo.mp4";
int main(int argc, char **argv) {
// 声明 ORB-SLAM2 系统
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.
// 记录系统时间
auto start = chrono::system_clock::now();
while (1) {
cv::Mat frame;
cap >> frame; // 读取相机数据
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,在最后复制添加以下代码并保存:
#生成调用myvideo.mp4 可执行文件
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR})
add_executable(myvideo myvideo.cpp)
target_link_libraries(myvideo ${PROJECT_NAME})
5.4 拍摄一段视频
注意使用手机(单目)拍摄视频时,因slam初始化需要一定时间,开始的摄像机尽量不要对着颜色单一的白墙或者其他,旋转速度不要太快,将拍好的视频上传到电脑,命名为myvideo.mp4,放在ORB-SLAM2文件夹中。
5.5 编译和运行
ORB-SLAM2文件夹打开终端,直接复制下面代码即可运行:
cd ORB_SLAM2
mkdir build
cd build
cmake ..
make -j
cd ..
./myvideo #(执行)
这是我的运行结果:文章来源:https://www.toymoban.com/news/detail-839249.html
6 参考博文:
师兄的环境安装:https://zhuanlan.zhihu.com/p/452256687
ORB-SLAM的安装:https://blog.csdn.net/qq_51645628/article/details/123263013?
编译出现的问题:https://blog.csdn.net/SEAL0107/article/details/128316425?
使用自己的数据集(特别鸣谢,这个很牛,适合新手学习):https://blog.csdn.net/weixin_45947476/article/details/123923975
使用matlab标定相机内参(注意固定焦距):https://blog.csdn.net/qq_64079631/article/details/127984760?
代码讲解:https://www.yuque.com/chenhai-7zi1m/se4n14/udvggt文章来源地址https://www.toymoban.com/news/detail-839249.html
到了这里,关于【SLAM实战篇】Ubuntu 20.04版本(OpenCV版本4.5.3)对于ORB-SLAM2安装运行,代码编译,自己的数据集构造的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!