当前位置:   article > 正文

Ubuntu18.04:ORB-SLAM3使用数据集构建地图和保存点云地图_orbslam3保存pcd点云图

orbslam3保存pcd点云图


在前一篇文章的Ubuntu18.04版本下配置ORB-SLAM3和数据集测试方法中,Ubuntu18.04的系统下成功配置完成了ORB-SLAM3,在ORB_SLAM3目录下输入命令:

./Examples/Monocular-Inertial/mono_inertial_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular-Inertial/EuRoC.yaml ./dataset/V102 ./Examples/Monocular-Inertial/EuRoC_TimeStamps/V102.txt dataset-V102_monoi
  • 1

即可在线构建地图,但是即使程序运行完成,也看不见地图文件,它在哪里?

原因:ORB-SLAM3并不会自己保存构建的点云地图文件。

若是想要将其构建的点云地图文件保存下来,则需要自己修改一些文件


保存地图方法一:使用ORB-SLAM3自带的保存方法(oea后缀文件)

仔细观察之前运行测试集的命令中,有一个EuRoc.yaml出现,这是运行ORB-SLAM3必要的配置文件,内含一些相机的内参数据等资料,必不可少。

若是需要使用ORB-SLAM3自带的保存方法,我们则需要修改类似的运行调用配置文件。
在yaml文件末尾加入以下语句,即可保存地图文件

System.LoadAtlasFromFile: "map"
  • 1

地图文件后缀为osa,文件名为“map”,文件名这个部分可以根据需求自行更改
生成的地图文件在ORB_SLAM3的主目录下

暂时不知道osa后缀的文件能否用在其他地方,但是我目前只在ORB-SLAM3中遇到过这种后缀类型的文件,所以我更推荐使用第二种保存为PCD类型的地图文件

若是需要在ORB-SLAM3运行时加载osa后缀的地图文件,可以在yaml文件末尾加上

System.LoadAtlasFromFile: "map"
  • 1

需要存在名为“map”的后缀为osa的地图文件才能成功加载地图

注意:同时使用会报错,需要使用哪个时,另一个记得删除或者注释
修改yaml后缀的配置文件无需进行重新编译,改完即可直接使用运行指令运行

保存地图方法二:使用PCL库保存为PCD类型地图文件

若要了解PCD类型文件,可以查看PCD(点云数据)文件格式这篇文章

安装PCL库:

sudo apt-get install libpcl-dev pcl-tools
  • 1

取巧方法:

如果没有对ORB-SLAM3的 CMakeLists.txt 文件和 src目录下的MapDrawer.cc 文件进行修改,则可以采取一些取巧的方法,下载上传至github项目中的 CMakeLists.txt 文件和 MapDrawer.cc 文件,直接进行覆盖即可

CMakeLists.txt 文件修改内容:(向该文件内添加PCL库)

find_package(PCL REQUIRED)
 
include_directories(
${PROJECT_SOURCE_DIR}
${PROJECT_SOURCE_DIR}/include
${PROJECT_SOURCE_DIR}/include/CameraModels
${PROJECT_SOURCE_DIR}/Thirdparty/Sophus
${EIGEN3_INCLUDE_DIR}
${Pangolin_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
 
target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${EIGEN3_LIBS}
${Pangolin_LIBRARIES}
${PCL_LIBRARIES}
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
-lboost_serialization
-lcrypto
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

src目录下的MapDrawer.cc 文件修改内容:

1、添加头文件:

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
  • 1
  • 2
  • 3

2、找到 DrawMapPoints 函数中的如下代码:

for(set<MapPoint*>::iterator sit=spRefMPs.begin(), send=spRefMPs.end(); sit!=send; sit++)
{
    if((*sit)->isBad())
        continue;
    Eigen::Matrix<float,3,1> pos = (*sit)->GetWorldPos();
    glVertex3f(pos(0),pos(1),pos(2));
 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

将其修改为如下代码:

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_saved(new pcl::PointCloud<pcl::PointXYZ>());
for(set<MapPoint*>::iterator sit=spRefMPs.begin(), send=spRefMPs.end(); sit!=send; sit++)
{
    if((*sit)->isBad())
        continue;
    Eigen::Matrix<float,3,1> pos = (*sit)->GetWorldPos();
    glVertex3f(pos(0),pos(1),pos(2));
 
    //modified by Awei
    pcl::PointXYZ p;
    p.x = pos(0);
    p.y = pos(1);
    p.z = pos(2);
    cloud_saved->points.push_back(p);
}
if (cloud_saved->points.size())
    pcl::io::savePCDFileBinary("map.pcd", *cloud_saved);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3、 找到以下代码段

for(size_t i=0, iend=vpMPs.size(); i<iend;i++)
{
    if(vpMPs[i]->isBad() || spRefMPs.count(vpMPs[i]))
        continue;
    Eigen::Matrix<float,3,1> pos = vpMPs[i]->GetWorldPos();
    glVertex3f(pos(0),pos(1),pos(2));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

将其修改为

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_saved(new pcl::PointCloud<pcl::PointXYZ>());
for(size_t i=0, iend=vpMPs.size(); i<iend;i++)
{
    if(vpMPs[i]->isBad() || spRefMPs.count(vpMPs[i]))
        continue;
    Eigen::Matrix<float,3,1> pos = vpMPs[i]->GetWorldPos();
    glVertex3f(pos(0),pos(1),pos(2));
        
    //modified by Awei
    pcl::PointXYZ p;
    p.x = pos(0);
    p.y = pos(1);
    p.z = pos(2);
    cloud_saved->points.push_back(p);
}
if (cloud_saved->points.size() > pre_num)
{
    pcl::io::savePCDFileBinary("map.pcd", *cloud_saved);
    pre_num = cloud_saved->points.size();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

并在 MapDrawer.cc 开头加入全局变量 pre_num

extern int pre_num = 0;
  • 1

在修改完之后,再次运行数据集命令构建点云地图,即可在ORB_SLAM3目录下生成map.pcd文件

在ORB_SLAM3目录下启动终端,输入下列命令,即可查看地图文件

pcl_viewer map.pcd
  • 1

若是在虚拟机中,想把地图文件转移至宿主机中,但是无法自由移动文件或是vmware-tools无效,可以参考这篇文章

若是想把pcd文件修改为其他后缀类型的地图文件,可以查看视觉学习笔记4——ORB-SLAM3的地图保存与使用这篇文章中地图调用这一部分


至此,结束


参考链接:
orb_slam3实现保存/加载地图功能and发布位姿功能
ORB SLAM3 点云地图保存

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/683860
推荐阅读
相关标签
  

闽ICP备14008679号