视觉学习笔记4——ORB-SLAM3的地图保存与使用

ORB系列文章目录

前言:视觉学习笔记4——学习研究ORB-SLAM3



前言

ORB-SLAM3基本搭建完成,具体可以看开头的系列文章目录,接下来需要研究如何自定义自己的地图,也就是实时地图的保存与运用。


一、地图保存

方法1(使用自带OSA保存):

按照开源说明来看,地图保存与加载在V1.0已经实现了,需要修改相应的yaml文件即可,也就是相机yaml文件,例如单目测试就需要修改ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/Asus.yaml文件。

  • 1、修改yaml文件
    在该文件中的末尾添加以下代码:
System.SaveAtlasToFile: "map.osa"
  • 2、ORB-SLAM3编译运行:
    重新编译后再运行单目实例,这时就会自动保存点云了,点云信息保存在.osa文件中。
sudo ./build.sh
sudo ./build_ros.sh
  • 3、加载
    按道理此时地图已经保存成功,也确实有.osa文件出现在主目录里,可是我却没有很好办法来查看和调用这个文件,所以就修改为pcd文件来使用。

方法2(保存为PCD文件):

经过查询找到这位博主的文章

  • 1、安装PCL库
sudo apt-get install libpcl-dev pcl-tools
  • 2、修改MapDrawer.cc 文件
    在这里插入图片描述

第一步,先加入 pcl 保存点云所需的头文件:

#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>

第二步,找到 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);

第三步在ORB-SLAM3下的 CMakeLists.txt文件中添加 PCL 库

注意每一段代码放的位置,一共三段、
1find_package(PCL REQUIRED)
 
 2include_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}
)
 
 3target_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
)
  • 4、ORB-SLAM3编译运行:
    重新编译后再运行单目实例,这时就会自动保存点云了,.pcd文件保存在主目录下。想要修改保存位置可以参考这篇博客
sudo ./build.sh
sudo ./build_ros.sh
  • 5、使用 pcl_viewer 进行查看.pcd文件
pcl_viewer map.pcd

在这里插入图片描述

二、地图调用

1.修改PCD文件

接下来需要把建图的点云集用meshlab导成dae格式的
MeshLab支持的输入输出格式:.ply, .stl, .obj, .qobj, off, .ptx, .vmi, .bre, .dae, .ctm, .pts, .apts, .xyz, .gts, .pdb, .tri, .asc, .txt, .x3d, .x3dv, .wrl,它不支持PLC格式,所以需要改一下代码,改成.ply。
再次魔改之前修改的MapDrawer.cc

//多加上一个头函数
#include <pcl/io/ply_io.h>


//修改之前的DrawMapPoints 函数
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);
}

 for (int i = 0; i < cloud_saved->points.size(); i++)
    {
        if (isnan(cloud_saved->points[i].x))
        {
            cloud_saved->points[i].x = 0;
            cloud_saved->points[i].y = 0;
            cloud_saved->points[i].z = 0;
        }
    }

if (cloud_saved->points.size())
    pcl::io::savePLYFileBinary("map.ply", *cloud_saved);

ORB-SLAM3重新编译

sudo ./build.sh
sudo ./build_ros.sh

再运行单目实例

第1个终端:
roscore
第2个终端:
roslaunch usb_cam-test.launch
第3个终端:
rosrun ORB_SLAM3 Mono /home/xxx/Guide_blind/ORB_SLAM3-1.0/Vocabulary/ORBvoc.txt /home/xxx/Guide_blind/ORB_SLAM3-1.0/Examples_old/ROS/ORB_SLAM3/Asus.yaml
第4个终端:
rqt_graph

这时就会自动保存点云.cly文件了。文件保存在主目录下,想要修改文件保存位置可以参考这篇博客

2.安装使用meshlab

非常简单,打开【Ubuntu软件】,右上角点击搜索,输入meshlab回车,然后点击安装,只需10s即可安装成功!

在这里插入图片描述

然后找到应用图标,打开meshlab,然后打开文件选择打开的保存的map.ply文件,成功显示!

请添加图片描述

未完待续···

  • 6
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值