【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2

文章目录

    • ORB_SLAM2框架简介
    • 下载ORB_SLAM2源码
    • ORB_SLAM2源码介绍
    • ORB_SLAM2源码编译
    • 下载 EuRoC Dataset
    • 将数据集移动到路径下
    • stereo_euroc终端运行命令
    • 终端运行效果
    • 配置clion运行参数
    • clion运行效果
    • 运行效果
    • stereo_euroc运行视频
    • Ubuntu16.04、视觉SLAM十四讲第一版本、第二版本、ORB_SLAM2、3代码运行环境搭建
    • submodule
    • 编译流程
    • 通用CMakeLists.txt
    • opencv3.4.0 源码编译安装
    • Ceres Solver
    • Pangolin
    • 安装g2o库
    • 卸载g2o库
    • sophus
    • gtsam
    • octomap
    • pcl
    • Ubuntu16.04系统下搭建开发环境和源码的编译调试
    • 位置姿态的表示显示与优化
    • 非线性优化
    • 两帧之间的视觉里程计
    • 小秋答疑微信

ORB_SLAM2框架简介

  1. Tracking-跟踪
  2. Local Mapping-地图
  3. Loop Closing-回环

在这里插入图片描述

ORB_SLAM2与传感器之间是相互独立,提取特征之后,图像不需要被保存而是直接丢弃。

在这里插入图片描述

下载ORB_SLAM2源码

git clone https://github.com/raulmur/ORB_SLAM2.git

ORB_SLAM2源码介绍

ORB_SLAM2将编译出libORB_SLAM2.so安装在lib目录中
并且生成可执行的数据集测试样例
mono_tum, mono_kitti, rgbd_tum, stereo_kitti, mono_euroc,stereo_euroc
有19个库文件、6个可执行文件:
分别是 rgbd_tum, stereo_kitti, stereo_euroc, mono_tum,mono_kitti,mono_euroc

/src 中包含的是ORB_SLAM2的SLAM定位建图子程序函数源库文件
/include 中包含的是ORB_SLAM2的SLAM定位建图子程序函数源库文件对应的头文件
/Examples 中的是各个数据集的测试调用程序以及相机标定文件

链接到的内部库
src/System.cc
src/LoopClosing.cc
src/FrameDrawer.cc
src/KeyFrame.cc
src/Optimizer.cc
src/KeyFrameDatabase.cc
src/Viewer.cc

链接到的外部库
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so

ORB_SLAM2源码编译

首先更改 camke 编译文件 CMakeLists.txt

git clone https://github.com/raulmur/ORB_SLAM2
cd /ORB_SLAM2
gedit CMakeLists.txt   
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall   -O3 -march=native")
删除 -march=native 编译环境的优化选项
  
cd /ORB_SLAM2
gedit /Thirdparty/g2o/CMakeLists.txt  
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3 -march=native") 
SET(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3 -march=native")                    
删除“-march=native”  编译环境的优化选项

cd /ORB_SLAM2
gedit /Thirdparty/DBoW2/CMakeLists.txt   
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}  -Wall  -O3 -march=native ")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall  -O3 -march=native")            
删除“-march=native” 编译环境的优化选项

编译过程中可能报错

'_ZN5boost6system15system_categoryEv'

解决办法,找到下面共享库的目录

locate  boost_system

/usr/lib/x86_64-linux-gnu/libboost_system.a
/usr/lib/x86_64-linux-gnu/libboost_system.so
/usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0

locate boost_filesystem
/usr/lib/x86_64-linux-gnu/libboost_filesystem.a
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.58.0

更改 camke 编译文件 CMakeLists.txt

cd /ORB_SLAM2/Examples/ROS/ORB_SLAM2
gedit CMakeLists.txt   

set(LIBS 
${OpenCV_LIBS} 
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PROJECT_SOURCE_DIR}/../../../Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/../../../Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/../../../lib/libORB_SLAM2.so
/usr/lib/x86_64-linux-gnu/libboost_filesystem.so
/usr/lib/x86_64-linux-gnu/libboost_system.so)

删除下面路径下的 build 目录

Thirdparty/DBoW2/build
Thirdparty/g2o/build
ORB_SLAM2/build
Examples/ROS/ORB_SLAM2/build

方法一在编译和执行终端添加环境变量

ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/q/projects/ORB_SLAM2/Examples/ROS/ORB_SLAM2

方法二在bashrc添加环境变量

gedit ~/.bashrc
export ORB_SLAM2_ROOT_DIR=/home/q/projects/ORB_SLAM2
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/q/projects/ORB_SLAM2/Examples/ROS/ORB_SLAM2
source ~/.bashrc
sudo updatedb

开始编译

chmod 777 ./build.sh
将 make -j 改成 make -j4 否则编译过程中有可能死机
编译非ROS版本
./build.sh
编译ROS版本
./build_ros.sh

在这里插入图片描述
我主要安装了这两个版本,然后系统是16.04

更多编译问题请参考下面文章

下载 EuRoC Dataset

EuRoC Dataset 数据集下载地址

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第1张图片

将数据集移动到路径下

/home/q/ORB_SLAM2/Examples/Stereo/MH_01_easy

stereo_euroc终端运行命令

./Examples/Stereo/stereo_euroc Vocabulary/ORBvoc.txt Examples/Stereo/EuRoC.yaml /home/q/ORB_SLAM2/EuRoC_Dataset/mav0/cam0/data /home/q/ORB_SLAM2/EuRoC_Dataset/mav0/cam1/data Examples/Stereo/EuRoC_TimeStamps/MH01.txt

终端运行效果

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第2张图片

配置clion运行参数

/home/q/ORB_SLAM2/Vocabulary/ORBvoc.txt
/home/q/ORB_SLAM2/Examples/Stereo/EuRoC.yaml
/home/q/ORB_SLAM2/Examples/Stereo/MH_01_easy/mav0/cam0/data
/home/q/ORB_SLAM2/Examples/Stereo/MH_01_easy/mav0/cam1/data
/home/q/ORB_SLAM2/Examples/Stereo/EuRoC_TimeStamps/MH01.txt

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第3张图片

clion运行效果

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第4张图片

运行效果

在这里插入图片描述
在这里插入图片描述

stereo_euroc运行视频

stereo_euroc运行视频

Ubuntu16.04、视觉SLAM十四讲第一版本、第二版本、ORB_SLAM2、3代码运行环境搭建

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第5张图片
在这里插入图片描述
跑高博十四讲里面的代码需要的eigen版本是3.3.0 否则sophus编译不会通过

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第6张图片
【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第7张图片

submodule

git clone 的仓库才可以在目录下输入下面命令下载第三方库
git submodule init 
git submodule update

[submodule "3rdparty/Pangolin"]
	path = 3rdparty/Pangolin
	url = https://github.com/stevenlovegrove/Pangolin
[submodule "3rdparty/Sophus"]
	path = 3rdparty/Sophus
	url = https://github.com/strasdat/Sophus
[submodule "3rdparty/ceres-solver"]
	path = 3rdparty/ceres-solver
	url = https://github.com/ceres-solver/ceres-solver
[submodule "3rdparty/g2o"]
	path = 3rdparty/g2o
	url = https://github.com/RainerKuemmerle/g2o
[submodule "3rdparty/DBoW3"]
	path = 3rdparty/DBoW3
	url = https://github.com/rmsalinas/DBow3
[submodule "3rdparty/googletest"]
	path = 3rdparty/googletest
	url = https://github.com/google/googletest.git
	

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第8张图片

编译流程

cmake  ..
make -j2|4|8
sudo make install|sudo make install DESTDIR= /home/build

通用CMakeLists.txt

# OpenCV
find_package( OpenCV REQUIRED )
include_directories(${OpenCV_DIRS} )
include_directories(${OpenCV_INCLUDE_DIRS})

# find_package(G2O REQUIRED)
set(G2O_INCLUDE_DIRS /home/q/CLionProjects/slambook2/3rdparty/g2o/)
set(CERES_LIBRARIES /home/q/CLionProjects/slambook2/3rdparty/g2o/lib/)
include_directories(${G2O_INCLUDE_DIRS})

# find_package(Ceres REQUIRED)
set(CERES_INCLUDE_DIRS /usr/local/include/ceres)
set(CERES_LIBRARIES /usr/local/lib/libceres.a)
include_directories(${CERES_INCLUDE_DIRS})

# find_package(Eigen3 REQUIRED)
set( EIGEN3_INCLUDE_DIRS /usr/local/include/eigen3)
include_directories(${EIGEN3_INCLUDE_DIRS})
或者这样指定
# Eigen
include_directories("/usr/local/include/eigen3")


find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})

find_package(Pangolin REQUIRED)

set(Pangolin_INCLUDE_DIRS /usr/local/include/pangolin)
set(Pangolin_LIBRARIES /usr/local/lib/libpangolin.so)

# pcl
find_package( PCL REQUIRED COMPONENT common io )
include_directories( ${PCL_INCLUDE_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )

add_executable( curve_fitting main.cpp )
# 与Ceres和OpenCV链接
target_link_libraries( curve_fitting ${CERES_LIBRARIES} ${OpenCV_LIBS} ${G2O_INCLUDE_DIRS})

add_executable(joinMap joinMap.cpp)
target_link_libraries(joinMap ${OpenCV_LIBS} ${Pangolin_LIBRARIES} ${PCL_LIBRARIES})

opencv3.4.0 源码编译安装

官方安装教程:https://docs.opencv.org/3.4.0/d7/d9f/tutorial_linux_install.html

cd /opencv3.4.0
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -DWITH_GTK_2_X=ON -DWITH_VTK=ON ..
make -j4
sudo make install

CMakeLists.txt多版本OpenCV切换

系统安装多版本opencv的时候,在CMakeLists.txt文件中指定
默认路径:/usr/local/include
指定路径:/usr/local/opencv-3.4.0

find_package找默认路径下的OpenCV

find_package( OpenCV REQUIRED )
include_directories( ${OPENCV_INCLUDE_DIR} )

find_package找到指定路径下的opencv-3.4.0

set(OpenCV_DIR "CMAKE_INSTALL_PREFIX")
OpenCV_DIR 就是你刚才给CMAKE_INSTALL_PREFIX指定的安装地址
set( OpenCV_DIR /usr/local/opencv-3.4.0)
find_package(OpenCV 3.4.0 REQUIRED)
include_directories(${OPENCV_INCLUDE_DIR})
MESSAGE("OPENCV_INCLUDE_DIR " ${OPENCV_INCLUDE_DIR})
target_link_libraries(vo_simulate ${OpenCV_LIBS})

Ceres Solver

http://ceres-solver.org/installation.html
sudo apt-get install libgoogle-glog-dev
感觉只装这一个就够了
sudo apt-get install cmake
sudo apt-get install libgoogle-glog-dev
sudo apt-get install libatlas-base-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libsuitesparse-dev

Pangolin

https://zhuanlan.zhihu.com/p/394088042

安装g2o库

sudo apt-get install libqglviewer-dev

卸载g2o库

主要就是删除库文件 头文件 和可执行程序

1:删除g2o的头文件,位于/usr/local/include/g2o下

sudo rm -r /usr/local/include/g2o

2:删除g2o的库文件,位于/usr/local/lib下

sudo rm -r /usr/local/lib/libg2o*

3:删除g2o的可执行文件,位于/usr/local/bin下

sudo rm -r /usr/local/bin/g2o*

sophus

set(Sophus_INCLUDE_DIR “/usr/local/sophus-template/include”)
set(Sophus_LIBS )

include_directories(${Sophus_INCLUDE_DIRS})
target_link_libraries(test ${Sophus_LIBS})

set(Sophus_LIBRARIES “/usr/local/lib/libSophus.so”)
target_link_libraries( P R O J E C T N A M E {PROJECT_NAME} PROJECTNAME{Sophus_LIBRARIES})

gtsam

https://github.com/borglab/gtsam
Prerequisites:

    Boost >= 1.43 (Ubuntu: sudo apt-get install libboost-all-dev)
    CMake >= 3.0 (Ubuntu: sudo apt-get install cmake)
    
Optional prerequisites

	Ubuntu: sudo apt-get install libtbb-dev

octomap

https://github.com/OctoMap/octomap

pcl

sudo apt install libpcl-dev

TUM数据集RGBD-Benchmark工具之associate.py
TUM数据集RGBD-Benchmark工具之evaluate_ate.py
TUM数据集RGBD-Benchmark工具之evaluate_rpe.py
「原理+实践」从文件或终端读写yaml和txt文件
视觉SLAM十四讲实践系列笔记之SLAM轨迹可视化
ORB_SLAM2的可视化是怎么实现的?
https://zhuanlan.zhihu.com/p/61738607

Ubuntu16.04系统下搭建开发环境和源码的编译调试

视觉SLAM十四讲实践系列笔记之ubuntu16.04系统下高频使用命令

视觉SLAM十四讲实践系列笔记之安装和如何使用C++集成开环境Clion调试C++和ROS项目

视觉SLAM十四讲实践系列笔记之安装和如何使用Visual Studio Code调试C++和ROS项目

视觉SLAM十四讲实践系列笔记之ubuntu16.04下如何搭建开发环境安装OpenCV等开源算法库

视觉SLAM十四讲实践系列笔记之如何使用cmake组织编译大型C++源码项目

视觉SLAM十四讲实践系列笔记之gdb如何调试C++源码项目

ubuntu16.04下如何使用git创建代码仓库对本地代码进行版本控制

位置姿态的表示显示与优化

eigen下的位姿表示显示变换
视觉SLAM十四讲实践系列笔记之eigen表示四种位姿以及相互转换

视觉SLAM十四讲实践系列之坐标系之间的欧式变换

李群李代数sophus下位姿的优化
视觉SLAM十四讲实践系列之Sophus下的位姿表示和更新优化和修正

轨迹可视化与评估
视觉SLAM十四讲实践系列笔记之轨迹可视化

视觉SLAM十四讲实践笔记系列之真实轨迹和估计轨迹均方根误差

TUM数据集RGBD-Benchmark工具之associate.py
TUM数据集RGBD-Benchmark工具之evaluate_ate.py
TUM数据集RGBD-Benchmark工具之evaluate_rpe.py

如何使用evo工具评估位姿轨迹精度?

传感器
TOF的工作原理是什么
RealSense D435i RGBD英特尔® 实感™ D435i 深度摄像头 硬件结构及各个组件原理详解 SDK ROS
SLAM领域传感器工作原理与使用场景汇总
扫地机器人工作原理、传感器原理、结构、工作流程、路径规划技术
小觅双目摄像头MYNTEYE-S1030-IR和自制双目摄像头测试ORB-SLAM2和RTAB-Map的运行效果对比

文件 yaml
「原理+实践」从文件或终端读写yaml和txt文件

图像 opencv
模拟图像、数字图像、OpenCV表示图像
视觉SLAM十四讲系列之图像的基本操作
视觉SLAM十四讲实践笔记系列之图像去畸变

用直方图统计图像的像素和计算图像的矩
高斯平滑和高斯模糊的算法
离散傅里叶变换和仿射变换Affine Transformation在图像处理中的应用及原理
循环读取rgbd_dataset_freiburg1_desk数据集每一张图片并且重命名的两种方法
视觉SLAM十四讲实践系列之OpenCV实现特征点检测和匹配

G2O优化问题 视觉SLAM十四讲系列之第七讲pose_estimation_2d2d.cpp
视觉SLAM十四讲实践系列之三角化方法求深度
视觉SLAM十四讲实践笔记系列之双目图像如何生成视差图和点云图
[视觉SLAM十四讲实践系列之两张图像拼接成点云]

非线性优化

如何理解概率密度函数以及概率论的一些总结
视觉SLAM十四讲实践系列之曲线拟合高斯牛顿优化
G2O优化问题 视觉SLAM十四讲系列之第七讲pose_estimation_2d2d.cpp
视觉SLAM十四讲实践系列之三角化方法求深度
视觉SLAM十四讲实践笔记系列之双目图像如何生成视差图和点云图
视觉SLAM十四讲实践系列之两张图像拼接成点云
一文帮你理解SLAM的投影模型、像素坐标系、图像坐标系、相机坐标系、世界坐标系
视觉SLAM十四讲实践系列之3D-2D求位姿用高斯牛顿和最小二乘法优化
视觉SLAM里的最小二乘Bundle Adjustment问题
Bundle adjustment 总结
视觉SLAM十四讲实践笔记系列之3D-3D求解位姿并用g2o优化
g2o之非线性优化(一)
视觉SLAM十四讲实践笔记系列之g2o_viewer
视觉SLAM十四讲实践系列之VIZ可视化
OpenCV Viz 代码实战详解

两帧之间的视觉里程计

视觉SLAM十四讲实践笔记系列之视觉里程计前端基本数据结构
视觉SLAM十四讲实践系列之两帧之间的视觉里程计
视觉SLAM十四讲实践系列之g2o优化两帧之间的视觉里程计
BA问题用g2o求解重新投影误差优化相机位姿和路标点的源码注释版本来了
什么是路标点?
视觉SLAM十四讲实践系列之两帧之间的视觉里程计g2o优化并保存mappiont路标点
精确率、精度(Precision) 召回率(recall)你真的理解吗?
SLAM 后端优化 算法 简单描述
欧氏距离、汉明距离、余弦相似度
一起做RGB-D SLAM (1)-(7) 代码实践
我的 一起做RGB-D SLAM (1)-(7) 代码实践
高博博客
高博代码

  1. ros_rgbd.cc的头文件讲解
  2. ros_rgbd.cc文件的ros::init、start、shutdown、NodeHandle、message_filters、spin、shutdown讲解
  3. 「ORB_SLAM2|3实践笔记」详细解读ros_rgbd.cc文件ORB_SLAM2::System、System::TrackRGBD运行流程
  4. ORB_SLAM2::System、System::TrackRGBD运行流程
  5. cv::Mat Tracking::GrabImageRGBD()
  6. 构造函数Frame::Frame() 、去畸变UndistortKeyPoints()、计算虚拟右目横坐标ComputeStereoFromRGBD
  7. void Tracking::StereoInitialization()、UnprojectStereo、ComputeDistinctiveDescriptors
  8. mpFrameDrawer->Update(this)
  9. void Tracking::Track()
  10. LocalMapping线程执行流程
  11. void MapPoint::UpdateNormalAndDepth()

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第9张图片
【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第10张图片
【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第11张图片
【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第12张图片
【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第13张图片
【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第14张图片
【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第15张图片
【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第16张图片

小秋答疑微信

【ORB_SLAM2源码解读】EuRoC双目数据集跑通ORB_SLAM2_第17张图片

你可能感兴趣的:(从零开始学习SLAM实战教程,ORB_SLAM2,ORB_SLAM3)