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

文章目录


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

bash 复制代码
./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

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

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

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


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

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

若是需要使用ORB-SLAM3自带的保存方法,我们则需要修改类似的运行调用配置文件。

在yaml文件末尾加入以下语句,即可保存地图文件

bash 复制代码
System.LoadAtlasFromFile: "map"

地图文件后缀为osa,文件名为"map",文件名这个部分可以根据需求自行更改

生成的地图文件在ORB_SLAM3的主目录下

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

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

bash 复制代码
System.LoadAtlasFromFile: "map"

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

注意:同时使用会报错,需要使用哪个时,另一个记得删除或者注释

修改yaml后缀的配置文件无需进行重新编译,改完即可直接使用运行指令运行

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

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

安装PCL库:

bash 复制代码
sudo apt-get install libpcl-dev pcl-tools

取巧方法:

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

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

cpp 复制代码
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
)

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

1、添加头文件:

cpp 复制代码
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>

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

cpp 复制代码
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));
 
}

将其修改为如下代码:

cpp 复制代码
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);

3、 找到以下代码段

cpp 复制代码
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));
}

将其修改为

cpp 复制代码
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();
}

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

cpp 复制代码
extern int pre_num = 0;

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

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

bash 复制代码
pcl_viewer map.pcd

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

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


至此,结束


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

相关推荐
ac.char25 分钟前
在 Ubuntu 上安装 Yarn 环境
linux·运维·服务器·ubuntu
布说在见1 小时前
个人实施工作的一天 —— 繁琐的数据输入与未来的句里录数据
经验分享·实习实施
梅见十柒1 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
入 梦皆星河1 小时前
在 Ubuntu/Debian 上安装 Go
ubuntu·golang·debian
IT果果日记2 小时前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教2 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
管家婆客服中心3 小时前
提成制是什么?如何高效管理提成制?
经验分享·管家婆软件
梓仁沐白7 小时前
ubuntu+windows双系统切换后蓝牙设备无法连接
windows·ubuntu
zy张起灵9 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
写点什么啦18 小时前
[debug]不同的window连接ubuntu的vscode后无法正常加载kernel
linux·vscode·ubuntu·debug