本文介绍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