【SLAM】在 ubuntu 18.04 arm 中以ROS情况编译与运行ORB_SLAM3

打印 上一主题 下一主题

主题 1535|帖子 1535|积分 4605

在ubuntu18.04arm中于ROS情况编译与运行ORB_SLAM3,并以TUM和EuRoC数据集测试了ROS下单目、双目和RGB-D运行。
1. 引言

在之前的博客中,已经介绍了基于虚拟机docker情况以及云端的AutoDL情况运行ORB_SLAM3的步骤。
在实际场景中,SLAM通常是需要在机器人平台上运行的,ROS就是一个比较常见的机器人开发平台,在ROS情况中运行,可以方便我们的SLAM系统与其他机器人功能模块(比如导航和路径规划)进行通讯,而且在ros node模式下运行的SLAM更得当多机通讯情况,比如实现多机器人协同建图、机器人和PC交互等等功能。
ORB_SLAM3在当地运行的底子上,提供了在ROS中运行的机制,本文简述了如何在ubuntu 18.04 arm情况中安装ROS情况、编译ORB_SLAM3 ROS版本,以及用现有的数据集模仿摄像头信号输入来利用ORB_SLAM3的全流程。
本文示例情况:ubuntu 22.04 arm虚拟机下启动的ubuntu18.04 docker容器。
2. 安装ROS情况

参考【Linux】在ubuntu18.04arm中安装ROS情况一文进行安装,主要基于ROS官网的教程。
3. 编译ROS情况的ORB_SLAM3

本文撰写时UZ-SLAMLab/ORB_SLAM3的最新提交为2022年2月10日的4452a3c4ab75b1cde34e5505a36ec3f9edcdc4c4,后文的教程基于此提交点。

3.1. 编译命令

3.1.1. 先编译普通版本

本文不赘述安装ORB_SLAM3依赖项的步骤,您可以参考【SLAM】于ubuntu18.04上纯CPU运行GCNv2_SLAM的记载(ARM64/AMD64) | 慕雪的寒舍 一文中的依赖项安装步骤。参考博客内里的步骤安装opencv、eigen3、Pangolin6.0就可以了,不需要安装libtorch。
此中需要注意的是,假如你需要编译ROS的ORB_SLAM3,opencv不能安装3.4.5版本,必须安装3.2.0版本!好消息是,假如你是跟随者本站或者ROS官网的教程安装的ROS,那么opencv 3.2.0版本已经和ROS一起安装在你的系统内里了。
安装完毕依赖后,先以普通模式编译ORB_SLAM3,由于ROS版本依赖于普通版本才能进行编译,这一点必须要注意。
  1. git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3
  2. cd ORB_SLAM3
  3. chmod +x build.sh
  4. ./build.sh
复制代码
3.1.2. 修改build_ros.sh脚本

编译完毕普通版本后,才可以执行build_ros.sh脚本。但是先别急,cat这个脚本,看看内里写了啥
  1. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3# cat build_ros.sh
  2. echo "Building ROS nodes"
  3. cd Examples/ROS/ORB_SLAM3
  4. mkdir build
  5. cd build
  6. cmake .. -DROS_BUILD_TYPE=Release
  7. make -j
复制代码
此中第一个命令就有题目了,最新版本的ORB_SLAM3源码内里,Examples路径下已经没有ROS目次了,这个目次现在是Examples_old/ROS/ORB_SLAM3。

假如你没有注意这个题目就开始执行build_ros.sh脚本,题目就会出现,由于Examples/ROS/ORB_SLAM3目次当前不存在,该脚本实际上是直接在项目根目次下创建了build目次然后cmake开始编译的,编译的完全不是ROS版本。
这个脚本内里还有另外一个坑,那就是make -j背面没有写任何数字。这会导致make无休止地利用系统资源,直到把你的整个系统内存和swap都吃光光。根据我找到的博客,ORB_SLAM3的编译最多能吃掉16GB内存,完全是个洪水猛兽。
最开始我没有注意这个脚本,以为它没有任何题目,就直接执行了,终极在编译时遇到了如下错误。
  1. c++: internal compiler error: Killed (program cc1plus)
  2. Please submit a full bug report,
  3. with preprocessed source if appropriate.
  4. See <file:///usr/share/doc/gcc-7/README.Bugs> for instructions.
复制代码
这个错误就是由于系统没有资源了。开另外一个终端,再启动编译,你可以轻易地观察到编译是怎么把整个系统内存给吃光光的,终极物理内存和swap都没了,操作系统自然会kill掉编译进程,从而导致了上述报错。

假如你直接搜刮“ORB_SLAM3编译失败”等字样,可能会搜到相干教程让你加大swap文件,这是一个可选项,但还不够可选,由于在我的测试中,即便再给出2GB的swap文件,编译依旧会由于内存不足而失败。下面给出新增swap文件的命令。
  1. # 安装
  2. apt install util-linux
  3. # 分配2G
  4. sudo fallocate -l 2G /swapfile
  5. # 给予权限
  6. sudo chmod 600 /swapfile
  7. # 激活权限(执行了之后swap就生效了)
  8. sudo mkswap /swapfile
  9. sudo swapon /swapfile
  10. # 不需要的时候,使用如下命令删除swap文件
  11. swapoff -v /swapfile
  12. rm /swapfile
复制代码
实际上,在物理内存大于8GB的情况中不需要这么麻烦,前文提到了脚本内里make没有写线程数,办理办法就是修正这个脚本,首先是修正目次,其次是将make背面加上-j4来限定make利用的资源,这样就能绕过内存不足导致的编译错误了。修改后的脚本如下:
  1. echo "Building ROS nodes"
  2. cd Examples_old/ROS/ORB_SLAM3
  3. mkdir build
  4. cd build
  5. cmake .. -DROS_BUILD_TYPE=Release
  6. make -j4
复制代码
假如你的情况物理内存低于8GB,可以考虑在加大swap文件的同时进一步减少make利用的线程数,比如make -j2。
3.1.3. 编译ROS版本

修正了build_ros.sh脚本之后,就可以开始编译ROS版本了。
  1. chmod +x build_ros.sh
  2. ./build_ros.sh
复制代码
再次提示,ROS版本的编译依赖于普通版本,需要先编译普通版本!
3.2. 编译期间遇到的各种题目

部分题目参考:记载配置ubuntu18.04下运行ORBSLAM3的ros接口的过程及执行单目imu模式遇到的题目
3.2.1. cmake错误ROS_PACKAGE_PATH

遇到的第一个错误应该是情况变量有关,编译ros版本的时间,需要将源码路径加入到情况变量中,才可以正常编译。
  1. CMake Error at /opt/ros/melodic/share/ros/core/rosbuild/private.cmake:99 (message):
  2.   [rosbuild] rospack found package "ORB_SLAM3" at "", but the current
  3.   directory is "/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3".  You should
  4.   double-check your ROS_PACKAGE_PATH to ensure that packages are found in the
  5.   correct precedence order.
  6. Call Stack (most recent call first):
  7.   /opt/ros/melodic/share/ros/core/rosbuild/public.cmake:177 (_rosbuild_check_package_location)
  8.   CMakeLists.txt:4 (rosbuild_init)
复制代码
在ORB_SLAM3项目根目次下执行如下命令即可
  1. export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$PWD/Examples_old/ROS/ORB_SLAM3
复制代码
修正之后即可正常开始编译
3.2.2. 头文件se3.hpp找不到

编译到30%的时间,会提示<sophus/se3.hpp>头文件找不到
  1. [ 30%] Building CXX object CMakeFiles/Mono_Inertial.dir/src/ros_mono_inertial.cc.o
  2. In file included from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/Frame.h:30:0,
  3.                  from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/KeyFrame.h:28,
  4.                  from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/MapPoint.h:23,
  5.                  from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/FrameDrawer.h:24,
  6.                  from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/Viewer.h:23,
  7.                  from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/Tracking.h:26,
  8.                  from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/System.h:31,
  9.                  from /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/ros_mono_inertial.cc:34:
  10. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/../../../include/ImuTypes.h:29:10: fatal error: sophus/se3.hpp: No such file or directory
  11. #include <sophus/se3.hpp>
  12.           ^~~~~~~~~~~~~~~~****
复制代码
这个第三方库sophus已经在Thirdparty文件夹内里自带了,刚刚我们编译普通版本的时间,其实也已经编译好了这个第三方库了。要做的就是进它的目次make install安装一下。
  1. cd Thirdparty/Sophus/build/
  2. make install
复制代码
安装以后就办理这个题目了。
  1. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3# cd Thirdparty/Sophus/build/
  2. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/Thirdparty/Sophus/build# make install
  3. [  8%] Built target test_sim2
  4. [ 16%] Built target test_se2
  5. [ 25%] Built target test_so3
  6. [ 33%] Built target test_rxso2
  7. [ 41%] Built target test_so2
  8. [ 50%] Built target test_se3
  9. [ 58%] Built target test_geometry
  10. [ 66%] Built target test_rxso3
  11. [ 75%] Built target test_sim3
  12. [ 83%] Built target test_velocities
  13. [ 91%] Built target test_common
  14. [100%] Built target HelloSO3
  15. Install the project...
  16. -- Install configuration: "Release"
  17. -- Installing: /usr/local/share/sophus/cmake/SophusTargets.cmake
  18. -- Installing: /usr/local/share/sophus/cmake/SophusConfig.cmake
  19. -- Installing: /usr/local/share/sophus/cmake/SophusConfigVersion.cmake
  20. -- Installing: /usr/local/include/sophus/average.hpp
  21. -- Installing: /usr/local/include/sophus/common.hpp
  22. -- Installing: /usr/local/include/sophus/geometry.hpp
  23. -- Installing: /usr/local/include/sophus/interpolate.hpp
  24. -- Installing: /usr/local/include/sophus/interpolate_details.hpp
  25. -- Installing: /usr/local/include/sophus/num_diff.hpp
  26. -- Installing: /usr/local/include/sophus/rotation_matrix.hpp
  27. -- Installing: /usr/local/include/sophus/rxso2.hpp
  28. -- Installing: /usr/local/include/sophus/rxso3.hpp
  29. -- Installing: /usr/local/include/sophus/se2.hpp
  30. -- Installing: /usr/local/include/sophus/se3.hpp
  31. -- Installing: /usr/local/include/sophus/sim2.hpp
  32. -- Installing: /usr/local/include/sophus/sim3.hpp
  33. -- Installing: /usr/local/include/sophus/sim_details.hpp
  34. -- Installing: /usr/local/include/sophus/so2.hpp
  35. -- Installing: /usr/local/include/sophus/so3.hpp
  36. -- Installing: /usr/local/include/sophus/types.hpp
  37. -- Installing: /usr/local/include/sophus/velocities.hpp
  38. -- Installing: /usr/local/include/sophus/formatstring.hpp
复制代码
3.2.3. OpenCV 版本不匹配

前文提到过,OpenCV必须安装 3.2.0 版本,是由于cv_bridge默认会指向ROS自带的3.2.0版本,而不是我们自己安装的其他版本,终极编译或者运行的时间就会导致链接错误或者coredump错误。
  1. /usr/bin/ld: warning: libopencv_core.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so, may conflict with libopencv_core.so.3.4
复制代码
假如你已经安装了其他版本的opencv,需要删掉它们。从源码安装的话,直接进入opencv源码的build目次执行make uninstall就可以卸载掉自己安装的opencv。

删掉了之后就会发现系统内里只剩下和ros一起安装的3.2.0版本opencv了,应该是下载ros情况的时间自动安装的。
  1. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3# pkg-config --modversion opencv
  2. 3.2.0
复制代码
随后我们需要修改CMakeLists文件,让编译的时间利用opencv 3.2.0版本。首先是根目次下的CMakeLists,修改如下部分的版本号为3.2即可
  1. # ORB_SLAM3/CMakeLists.txt
  2. find_package(OpenCV 3.2)
  3.    if(NOT OpenCV_FOUND)
  4.       message(FATAL_ERROR "OpenCV > 3.2 not found.")
  5.    endif()
复制代码
然后是Examples_old/ROS/ORB_SLAM3内里的CMakeLists文件,修改如下部分为3.2.0版本
  1. # ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
  2. find_package(OpenCV 3.2.0 QUIET) # 修改为3.2.0
  3. if(NOT OpenCV_FOUND)
  4.    find_package(OpenCV 2.4.3 QUIET)
  5.    if(NOT OpenCV_FOUND)
  6.       message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
  7.    endif()
  8. endif()
复制代码
接下来就要删除全部编译缓存,重新编译一遍。
  1. rm -rf Thirdparty/g2o/build/
  2. rm -rf Thirdparty/DBoW2/build/
  3. rm -rf Thirdparty/Sophus/build/
  4. rm -rf Vocabulary/*.bin
  5. rm -rf ./build
  6. rm -rf Examples_old/ROS/ORB_SLAM3/build
复制代码
注意普通版本也需要重新编译!由于最开始编译的时间我的普通版本是基于opecv 3.4.5编译的,假如不重新基于opencv 3.2.0编译普通版本,编译ROS的时间就会提示libORB_SLAM3.so需要3.4.5版本的opencv才能正常链接,终究还是版本对不上。
3.2.4. AR代码错误(四处)

修复了opencv版本题目后,接下来就会遇到一堆由于Examples_old/ROS/ORB_SLAM3/src/AR路径下的代码题目导致的错误。假如你不需要利用MonoAR也就是单目AR功能,可以直接注释掉CMakeLists文件内里71行的如下部分,跳过AR代码的编译。
  1. # ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
  2. # Node for monocular camera (Augmented Reality Demo)
  3. rosbuild_add_executable(MonoAR
  4. src/AR/ros_mono_ar.cc
  5. src/AR/ViewerAR.h
  6. src/AR/ViewerAR.cc
  7. )
  8. target_link_libraries(MonoAR
  9. ${LIBS}
  10. )
复制代码
注释掉之后,应该就可以成功编译其他部分了
  1. [rosbuild] Including /opt/ros/melodic/share/roslisp/rosbuild/roslisp.cmake
  2. [rosbuild] Including /opt/ros/melodic/share/roscpp/rosbuild/roscpp.cmake
  3. [rosbuild] Including /opt/ros/melodic/share/rospy/rosbuild/rospy.cmake
  4. Build type: Release
  5. -- Using flag -std=c++11.
  6. -- Configuring done
  7. -- Generating done
  8. -- Build files have been written to: /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/build
  9. [  0%] Built target rospack_genmsg_libexe
  10. [  0%] Built target rosbuild_precompile
  11. [ 40%] Built target RGBD
  12. [ 40%] Built target Stereo
  13. [ 80%] Built target Mono_Inertial
  14. [ 80%] Built target Stereo_Inertial
  15. [100%] Built target Mono
复制代码
假如你需要MonoAR,就需要上手改代码了。参考github.com/UZ-SLAMLab/ORB_SLAM3/issues/442,依次修复题目。
这部分修改很杂,你可以直接根据我的提交记载来修改:Fix compile error of ROS AR, used opencv 3.2.0 for ROS compile. · musnows/ORB_SLAM3@4e1cbdb · GitHub

1)范例Sophus::SE3<float>和cv::Mat不匹配
  1. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc: In member function 'void ImageGrabber::GrabImage(const ImageConstPtr&)':
  2. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc:151:41: error: conversion from 'Sophus::SE3f {aka Sophus::SE3<float>}' to non-scalar type 'cv::Mat' requested
  3.      cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
  4.                    ~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. CMakeFiles/MonoAR.dir/build.make:198: recipe for target 'CMakeFiles/MonoAR.dir/src/AR/ViewerAR.cc.o' failed
复制代码
修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc的151行,被注释掉的是源代码
  1.     // cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
  2.     cv::Mat Tcw;
  3.     Sophus::SE3f Tcw_SE3f = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
  4.     Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix();
  5.     cv::eigen2cv(Tcw_Matrix, Tcw);
复制代码
2)'eigen2cv' is not a member of 'cv' 错误
  1. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc:155:9: error: 'eigen2cv' is not a member of 'cv'
  2.      cv::eigen2cv(Tcw_Matrix, Tcw);
  3.          ^~~~~~~~
  4. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc:155:9: note: suggested alternative: 'eigen'
  5.      cv::eigen2cv(Tcw_Matrix, Tcw);
  6.          ^~~~~~~~
  7.          eigen
复制代码
在ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ros_mono_ar.cc和ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.h顶部添加三个头文件
  1. #include <Eigen/Dense>
  2. #include <opencv2/core/eigen.hpp>
  3. #include <opencv2/opencv.hpp>
复制代码
3)范例Eigen::Matrix<float, 3, 1>和cv::Mat不匹配
  1. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc: In member function 'void ORB_SLAM3::Plane::Recompute()':
  2. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:530:42: error: conversion from 'Eigen::Vector3f {aka Eigen::Matrix<float, 3, 1>}' to non-scalar type 'cv::Mat' requested
  3.              cv::Mat Xw = pMP->GetWorldPos();
  4.                           ~~~~~~~~~~~~~~~~^~
复制代码
修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:530处代码
  1. // cv::Mat Xw = pMP->GetWorldPos();
  2. cv::Mat Xw;
  3. cv::eigen2cv(pMP->GetWorldPos(), Xw);
复制代码
4)尾插错误 no matching function for call to 'std::vector<cv::Mat>::push_back(Eigen::Vector3f)'
这个题目也是范例不匹配
  1. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc: In member function 'ORB_SLAM3::Plane* ORB_SLAM3::ViewerAR::DetectPlane(cv::Mat, const std::vector<ORB_SLAM3::MapPoint*>&, int)':
  2. /work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:405:53: error: no matching function for call to 'std::vector<cv::Mat>::push_back(Eigen::Vector3f)'
  3.                  vPoints.push_back(pMP->GetWorldPos());
  4.                                                      ^
复制代码
修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR/ViewerAR.cc:405的代码
  1. // vPoints.push_back(pMP->GetWorldPos());
  2. cv::Mat WorldPos;
  3. cv::eigen2cv(pMP->GetWorldPos(), WorldPos);
  4. vPoints.push_back(WorldPos);
复制代码
3.3. 成功编译

修改完毕上述四个题目后,就应该可以编译成功了。

编译完成后会多出很多可执行文件。
  1. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3# ls
  2. Asus.yaml  CMakeLists.txt  Mono  MonoAR  Mono_Inertial  RGBD  Stereo  Stereo_Inertial  build  lib  manifest.xml  src
复制代码
注意这些可执行文件是不能直接运行的,由于它们是针对ROS计划的文件。
  1. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3# ./Mono
  2. [ERROR] [1739083807.698375008]: [registerPublisher] Failed to contact master at [localhost:11311].  Retrying...
  3. ^C
  4. Usage: rosrun ORB_SLAM3 Mono path_to_vocabulary path_to_settings
复制代码
4. 在ROS下运行项目

参考博客:ORB-SLAM3的CMake与ROS编译以及测试;ORB SLAM 2 demo 复现(普通模式 + ROS 模式) - 简书;
4.1. 下载TUM和EuRoC数据集

由于是在ROS情况下运行,所以数据集不能用之前下载的tgz格式的了,必须利用ROS专门的bag格式的数据集。


  • TUM RGB-D数据集:cvg.cit.tum.de/data/datasets/rgbd-dataset/download;
  • EuRoC双目数据集:robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_ha…
在TUM数据集的下载页面中,往下滑可以看到每个数据集的简单介绍,这里就能下载到bag格式的数据集。

下载完毕后,可以利用rosbag info命令查察数据集中有的topic信息:


  • Topic是一个命名的通讯管道,用于在差异的ROS节点之间通报信息;
  • 每个Topic都有一个唯一的名称,节点可以通过这个名称来订阅这个topic的信息;
  • Topic中的数据以message的格式传输,message是ROS中界说好的数据结构,如 sensor_msgs/Image、geometry_msgs/Pose 等;
举个例子,fr1/desk数据集的Topic信息如下,此中depth就是深度数据,rgb就是普通的彩色录像数据。
  1. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3# rosbag info datasets/TUM/rgbd_dataset_freiburg1_desk.bag
  2. path:         datasets/TUM/rgbd_dataset_freiburg1_desk.bag
  3. version:      2.0
  4. duration:     23.8s
  5. start:        May 10 2011 20:44:09.56 (1305031449.56)
  6. end:          May 10 2011 20:44:33.32 (1305031473.32)
  7. size:         371.7 MB
  8. messages:     19893
  9. compression:  bz2 [1210/1210 chunks; 29.85%]
  10. uncompressed:   1.2 GB @ 52.3 MB/s
  11. compressed:   370.9 MB @ 15.6 MB/s (29.85%)
  12. types:        sensor_msgs/CameraInfo         [c9a58c1b0b154e0e6da7578cb991d214]
  13.               sensor_msgs/Image              [060021388200f6f0f447d0fcd9c64743]
  14.               sensor_msgs/Imu                [6a62c6daae103f4ff57a132d6f95cec2]
  15.               tf/tfMessage                   [94810edda583a504dfda3829e70d7eec]
  16.               visualization_msgs/MarkerArray [f10fe193d6fac1bf68fad5d31da421a7]
  17. topics:       /camera/depth/camera_info     595 msgs    : sensor_msgs/CameraInfo        
  18.               /camera/depth/image           595 msgs    : sensor_msgs/Image            
  19.               /camera/rgb/camera_info       613 msgs    : sensor_msgs/CameraInfo        
  20.               /camera/rgb/image_color       613 msgs    : sensor_msgs/Image            
  21.               /cortex_marker_array         2360 msgs    : visualization_msgs/MarkerArray
  22.               /imu                        11815 msgs    : sensor_msgs/Imu               
  23.               /tf                          3302 msgs    : tf/tfMessage
复制代码
而给出的EuRoC双目数据集的Topic如下,有两个cam就对应了左侧和右侧的两个相机。
  1. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/datasets# rosbag info MH_01_easy.bag
  2. path:        MH_01_easy.bag
  3. version:     2.0
  4. duration:    3:06s (186s)
  5. start:       Jun 25 2014 03:02:59.81 (1403636579.81)
  6. end:         Jun 25 2014 03:06:06.70 (1403636766.70)
  7. size:        2.5 GB
  8. messages:    47283
  9. compression: none [2456/2456 chunks]
  10. types:       geometry_msgs/PointStamped [c63aecb41bfdfd6b7e1fac37c7cbe7bf]
  11.              sensor_msgs/Image          [060021388200f6f0f447d0fcd9c64743]
  12.              sensor_msgs/Imu            [6a62c6daae103f4ff57a132d6f95cec2]
  13. topics:      /cam0/image_raw    3682 msgs    : sensor_msgs/Image         
  14.              /cam1/image_raw    3682 msgs    : sensor_msgs/Image         
  15.              /imu0             36820 msgs    : sensor_msgs/Imu           
  16.              /leica/position    3099 msgs    : geometry_msgs/PointStamped
复制代码
假设我们利用自己的摄像头的话,也是利用ROS的工具将我们摄像头的数据输入到一个Topic中,这样就可以供系统的其他组件,比如SLAM系统来读取,以此实现在ROS系统上硬件输入和软件的读取。这便是利用ROS模式和普通模式的最大区别,普通模式下我们必须要直接提供程序的数据输入源,才能让程序运行起来;而ROS模式下我们可以先把整个SLAM系统启动起来,再通过我们想要的方式往SLAM系统订阅的Topic内里喂数据即可。
4.2. 单目运行

刚刚我们下载的TUM fr1/desk的数据集,即可以用作RGB-D模式的输入,又可以做单目摄像头的输入,由于深度数据是独立于RGB单目数据的。
刚刚我们直接运行Mono的时间,就打印出了一个Usage
  1. root@ubuntu-linux-22-04-02-desktop:/work/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3# ./Mono
  2. [ERROR] [1739083807.698375008]: [registerPublisher] Failed to contact master at [localhost:11311].  Retrying...
  3. ^C
  4. Usage: rosrun ORB_SLAM3 Mono path_to_vocabulary path_to_settings
复制代码
我们要利用的就是这个命令,rosrun代表启动一个节点,ORB_SLAM3是我们当前利用的包名称,也就是CMakeLists内里注册的项目名称,Mono是我们要执行的可执行文件名称。背面的两个参数分别是词袋文件和相机的配置文件。
终极执行的命令如下,需要在两个终端中执行(在项目根目次执行)
  1. # 打开终端A
  2. roscore
  3. # 打开终端B
  4. rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples_old/Monocular/TUM1.yaml
复制代码
执行了之后,就会启动ORB_SLAM3的Map Viewer,此时是黑屏的,由于么有任何数据被送到ORB_SLAM3订阅的Topic中。


再新建一个终端,执行如下命令,将TUM数据集bag文件内里的Topic绑定到ORB_SLAM3订阅的Topic上,这样就能获取到数据了。
  1. rosbag play \
  2.         datasets/TUM/rgbd_dataset_freiburg1_desk.bag \
  3.         /camera/rgb/image_color:=/camera/image_raw
复制代码
此中,末了一个参数/camera/rgb/image_color:=/camera/image_raw指代将bag文件中的/camera/rgb/image_color绑定到/camera/image_raw上,后者就是ORB_SLAM3订阅的相机原始数据的Topic,相当于将bag中已有的图像数据重新喂给了我们的SLAM系统。
由于ROS的Topic机制,这种喂进去的数据集和接一个摄像头得到的实时数据,对于订阅这个Topic的SLAM系统而言是完全一样的!
执行这个命令后,就能在GUI内里看到相机的数据流和SLAM的建图了

4.3. RGB-D运行

RGB-D相机也是利用相同的命令来执行,先在另外一个终端执行roscore,然后执行如下命令
  1. rosrun ORB_SLAM3 RGBD Vocabulary/ORBvoc.txt Examples_old/RGB-D/TUM1.yaml
复制代码
刚启动的时间也是黑屏

再开另外一个终端,开始喂我们的数据集,这里用了两个:=号,分别绑定了原始的RGB相机数据到/camera/rgb/image_raw ,绑定了深度数据到/camera/depth_registered/image_raw上
  1. rosbag play \
  2.         datasets/TUM/rgbd_dataset_freiburg1_desk.bag \
  3.         /camera/rgb/image_color:=/camera/rgb/image_raw \
  4.         /camera/depth/image:=/camera/depth_registered/image_raw
复制代码
随后GUI内里也开始表现图像了

等运行结束后,会发现此时SLAM的建图结果是不对的,全部的点都在很小的一块区域中

作为对比,下图为当地虚拟机在普通模式下运行时的RGB-D建图结果,很明显和上图完全不一样。

这是由于Examples_old/RGB-D/TUM1.yaml数据配置有题目。在TUM官网上提到了这两个数据集在ROS和非ROS中是不一样的,实际上这个文件内里也有注释
  1. # Deptmap values factor
  2. DepthMapFactor: 5000 # 1.0 for ROS_bag
复制代码
官网说明:cvg.cit.tum.de/data/datasets/rgbd-dataset/file_formats#intrinsic…
   Color images and depth maps
  We provide the time-stamped color and depth images as a gzipped tar file (TGZ).
  

  • The color images are stored as 640x480 8-bit RGB images in PNG format.
  • The depth maps are stored as 640x480 16-bit monochrome images in PNG format.
  • The color and depth images are already pre-registered using the OpenNI driver from PrimeSense, i.e., the pixels in the color and depth images correspond already 1:1.
  • The depth images are scaled by a factor of 5000, i.e., a pixel value of 5000 in the depth image corresponds to a distance of 1 meter from the camera, 10000 to 2 meter distance, etc. A pixel value of 0 means missing value/no data.
  这里是深度值的校正系数(factor),利用时的盘算公式为Z = depth_image[v,u] / factor,在ROS中要把它改成1才可以。
  1. factor = 5000 # for the 16-bit PNG files
  2. factor = 1    # for the 32-bit float images in the ROS bag files
复制代码
将DepthMapFactor修改为1.0之后的建图就正常一些了

4.4. 双目运行

下载EuRoC对应的rosbag:MH_01_easy.bag,上文已经给出过该数据集对应的Topic了,此中要用到的 Topic 是左右两个摄像头的数据 /cam0/image_raw 和 /cam1/image_raw。ORB_SLAM3 中双目 Stereo 接收的 Topic 分别为 /camera/left/image_raw 和 /camera/right/image_raw,因此在运行时也需要绑定一下 Topic。
  1. topics:      /cam0/image_raw    3682 msgs    : sensor_msgs/Image         
  2.              /cam1/image_raw    3682 msgs    : sensor_msgs/Image         
  3.              /imu0             36820 msgs    : sensor_msgs/Imu           
  4.              /leica/position    3099 msgs    : geometry_msgs/PointStamped
复制代码
双目标rosrun命令末了多了一个bool范例参数do_rectify,含义为是否进行改正,根据需要选择true或false。
  1. Usage: rosrun ORB_SLAM3 Stereo path_to_vocabulary path_to_settings do_rectify
复制代码
执行如下命令,先启动Stereo双目模式下的SLAM,然后开始播放数据集,同样是利用:=分别绑定左侧和右侧两个摄像头的数据。
  1. # 终端a
  2. roscore
  3. # 终端b
  4. rosrun ORB_SLAM3 Stereo Vocabulary/ORBvoc.txt Examples_old/Stereo/EuRoC.yaml true
  5. # 终端c
  6. rosbag play MH_01_easy.bag /cam0/image_raw:=/camera/left/image_raw /cam1/image_raw:=/camera/right/image_raw
复制代码
也是成功运行起来了


5. The end

本文介绍了如何在ROS情况下编译ORB_SLAM3,并利用TUM和EuRoC数据集测试单目、双目、RGB-D三种模式在ROS下运行的结果。希望对你有帮助!
更新:ORB_SLAM2的ROS运行命令和本文记载的完全同等,只需要把rosrun内里的包名改成ORB_SLAM2就可以了。下图是在ROS模式下运行ORB_SLAM2的RGB-D的截图。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

前进之路

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表