【SLAM实战篇】Ubuntu 20.04版本(OpenCV版本4.5.3)对于ORB-SLAM2安装运行,代码编译,自己的数据集构造

学完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  #(执行)

这是我的运行结果:
在这里插入图片描述

6 参考博文:

师兄的环境安装:https://zhuanlan.zhihu.com/p/452256687
ORB-SLAM的安装:https://blog.youkuaiyun.com/qq_51645628/article/details/123263013?
编译出现的问题:https://blog.youkuaiyun.com/SEAL0107/article/details/128316425?
使用自己的数据集(特别鸣谢,这个很牛,适合新手学习):https://blog.youkuaiyun.com/weixin_45947476/article/details/123923975
使用matlab标定相机内参(注意固定焦距):https://blog.youkuaiyun.com/qq_64079631/article/details/127984760?
代码讲解:https://www.yuque.com/chenhai-7zi1m/se4n14/udvggt

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-涧生-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值