Bootstrap

ORB_SLAM3 ROS编译及使用D435I运行

本文介绍ORB_SLAM3编译、运行中遇到问题,尤其涉及到ORB_SLAM3 ROS编译遇到的问题。最后通过使用D435I完成在室内环境下运行。
本文运行环境在Ubuntu20.04 + ROS noetic。

一、ORB_SLAM3 依赖安装

ORB_SLAM3 依赖的安装,有同学喜欢上来就baidu,按照别人介绍的安装,这样做大多数时候会出现错误,因为每个人的电脑环境不一样(可能库安装不一样的版本)。其实最好的方式是直接在仓库代码,按照readme介绍安装就好,故这部分着实没啥好介绍的。
具体参考:https://github.com/UZ-SLAMLab/ORB_SLAM3#readme
注:因为文章会介绍ROS运行,故自行安装上ROS。

二、编译

很遗憾,一步步完成上述安装,以为可以直接愉快的玩耍了,结果编译时会出错。主要错误如下:

1.error: decay_t is not a member of std did you mean decay

问题出现的原因是作者使用的是C++11编译的,从CMakeLists.txt可以看出,所以只需要将下面几行C++14替换C++11即可。

17行:CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
20行:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
22行:message(STATUS "Using flag -std=c++14.")
28行:message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
2.Could not find a configuration file for package “OpenCV” that is compatible

with requested version “4.4”.
问题出现主要是opencv版本问题。查看自己安装的opencv版本,将cmake中,改成自己安装的版本即可。修改如下

原:find_package(OpenCV 4.4)
修改后:find_package(OpenCV 3.4)

其中OpenCV 3.4,是我安装的版本,更低版本是否可用读者可按照自己安装的版本自行尝试。
接下来就可以愉快的玩耍了。

cd ORB_SLAM3
chmod +x build.sh
./build.sh

正常情况下应该没有错误啦。

三、ROS编译

ROS编译,是本文要讲的重点。因为按照作者readme中介绍,直接执行如下脚本就可以了,

gedit ~/.bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM3/Examples/ROS
chmod +x build_ros.sh
./build_ros.sh

执行完后,可以编译成功,但是出现错误
./build_ros.sh: line 3: cd: Examples/ROS/ORB_SLAM3: No such file or directory
mkdir: cannot create directory ‘build’: File exists
按照路径查找居然在Examples没有ROS文件夹!!!
哎,你说坑不坑。
下面要开始我们的操作了,几番查找,发现Examples_old中有。于是:
将Examples_old文件夹下ROS文件夹复制到Examples文件夹下,然后编译,会出现如下错误:

1.C++11编译的版本问题,对应将ROS/ORB_SLAM3文件下CMakeLists.txt文件中用C++14替换C++11即可。
2.提示找不到sophus库

在CMakeLists.txt文件中,添加

 include_directories(
 ${PROJECT_SOURCE_DIR}/../../../Thirdparty/Sophus
 )
3.Sophus::SE3f, cv::MAT,Eigen::Vector3f类型转换报错,在报错文件中添加头文件
#include <Eigen/Dense>
#include <opencv2/core/eigen.hpp>
4.解决 cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec()); 报错

引入上述两个头文件,然后删除ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc第151行,由下面内容替换

cv::Mat Tcw;
Sophus::SE3f Tcw_SE3f = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix();
cv::eigen2cv(Tcw_Matrix, Tcw);
5.解决 vPoints.push_back(pMP->GetWorldPos()); 报错

引入上述两个头文件,然后删除ROS/ORB_SLAM3/src/AR/ViewerAR.cc第409行,由以下内容替换

cv::Mat WorldPos;
cv::eigen2cv(pMP->GetWorldPos(), WorldPos);
vPoints.push_back(WorldPos);
6.解决 cv::Mat Xw = pMP->GetWorldPos();报错

引入上述两个头文件,然后删除ROS/ORB_SLAM3/src/AR/ViewerAR.cc第530行,由以下内容替换

cv::Mat Xw;
cv::eigen2cv(pMP->GetWorldPos(), Xw);

于是又可以愉快的玩耍了,在进行上述编译

gedit ~/.bashrc
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM3/Examples/ROS
chmod +x build_ros.sh
./build_ros.sh

这下没有错误啦。

三、跑数据集

1.slam3
(1)EuRoC stereo+Inertial测试

euroc数据集
本测试是以双目+imu跑euroc 数据集为例
./Examples/Stereo-Inertial/stereo_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Stereo-Inertial/EuRoC.yaml ./Examples/datasets/MH_03_medium ./Examples/Stereo-Inertial/EuRoC_TimeStamps/MH03.txt
运行结果如下:
在这里插入图片描述ps:在Examples建立datasets文件夹,将下载好的数据集放里面即可。

(2) 运行D435I

./Examples/Stereo-Inertial/stereo_inertial_realsense_D435i ./Vocabulary/ORBvoc.txt ./Examples/Stereo-Inertial/Realsense_D435i.yaml
关于D435I相机设置、校准可以参考系列文章
Realsense d435i驱动安装、配置及校准
Realsense d435i内参、外参标定
从零完成slam实战,以Vins-Fusion为例

2. slam3_ros
(1)EuRoC ros包 + stereo+Inertial测试

rosrun ORB_SLAM3 Stereo-Inertial Vocabulary/ORBvoc.txt Examples/Stereo-Inertial/Realsense_D435i.yaml false
rosbag play MH_03_medium.bag
运行结果如下:
在这里插入图片描述

其中:MH_03_medium.bag话题/imu0 /cam0/image_raw /cam1/image_raw

(2)运行自己录制好的bag

rosrun ORB_SLAM3 Stereo-Inertial Vocabulary/ORBvoc.txt Examples/Stereo-Inertial/EuRoC.yaml ./Examples/datasets/MH_03_medium.bag false
rosbag play room.bag
运行结果如下:
在这里插入图片描述
其中:room.bag包含话题:/camera/imu /camera/infra1/image_rect_raw /camera/infra2/image_rect_raw
ps:小技巧,根据自己录制包的话题,在ros_stereo_inertial.cc中141-143行更改对应订阅的话题。

参考文献

https://github.com/UZ-SLAMLab/ORB_SLAM3
https://blog.csdn.net/zhh2005757/article/details/122353772

;