赞
踩
在前一篇文章的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
即可在线构建地图,但是即使程序运行完成,也看不见地图文件,它在哪里?
原因:ORB-SLAM3并不会自己保存构建的点云地图文件。
若是想要将其构建的点云地图文件保存下来,则需要自己修改一些文件
仔细观察之前运行测试集的命令中,有一个EuRoc.yaml出现,这是运行ORB-SLAM3必要的配置文件,内含一些相机的内参数据等资料,必不可少。
若是需要使用ORB-SLAM3自带的保存方法,我们则需要修改类似的运行调用配置文件。
在yaml文件末尾加入以下语句,即可保存地图文件
System.LoadAtlasFromFile: "map"
地图文件后缀为osa,文件名为“map”,文件名这个部分可以根据需求自行更改
生成的地图文件在ORB_SLAM3的主目录下
暂时不知道osa后缀的文件能否用在其他地方,但是我目前只在ORB-SLAM3中遇到过这种后缀类型的文件,所以我更推荐使用第二种保存为PCD类型的地图文件
若是需要在ORB-SLAM3运行时加载osa后缀的地图文件,可以在yaml文件末尾加上
System.LoadAtlasFromFile: "map"
需要存在名为“map”的后缀为osa的地图文件才能成功加载地图
注意:同时使用会报错,需要使用哪个时,另一个记得删除或者注释
修改yaml后缀的配置文件无需进行重新编译,改完即可直接使用运行指令运行
若要了解PCD类型文件,可以查看PCD(点云数据)文件格式这篇文章
sudo apt-get install libpcl-dev pcl-tools
如果没有对ORB-SLAM3的 CMakeLists.txt 文件和 src目录下的MapDrawer.cc 文件进行修改,则可以采取一些取巧的方法,下载上传至github项目中的 CMakeLists.txt 文件和 MapDrawer.cc 文件,直接进行覆盖即可
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、添加头文件:
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
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));
}
将其修改为如下代码:
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、 找到以下代码段
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));
}
将其修改为
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
extern int pre_num = 0;
在修改完之后,再次运行数据集命令构建点云地图,即可在ORB_SLAM3目录下生成map.pcd文件
在ORB_SLAM3目录下启动终端,输入下列命令,即可查看地图文件
pcl_viewer map.pcd
若是在虚拟机中,想把地图文件转移至宿主机中,但是无法自由移动文件或是vmware-tools无效,可以参考这篇文章
若是想把pcd文件修改为其他后缀类型的地图文件,可以查看视觉学习笔记4——ORB-SLAM3的地图保存与使用这篇文章中地图调用这一部分
至此,结束
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。