ORB SLAM3 点云地图保存

这篇具有很好参考价值的文章主要介绍了ORB SLAM3 点云地图保存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目前 ORB_SLAM3 已经提供了地图保存功能。

方法是在 yaml 文件中以下这行配置:

System.SaveAtlasToFile: "map.osa"

保存下来的地图可以在下次运行 ORB_SLAM3 时加载。

然而,我经过搜索,没能找到关于 .osa 文件离线加载和可视化的方法,于是对 ORB_SLAM3 的代码进行了简单的修改,使其可以保存 pcd 格式的点云地图。

修改代码的已发布至:GitHub - DioVei/ORB_SLAM3_with_save: Modify the orb-slam3 code to save the keypoints per frame and the map in PCD format.

代码中仅使用到 PCL 基础的点云保存功能,因此应该兼容不同版本的 PCL 库。

sudo apt-get install libpcl-dev pcl-tools

首先,我们找到代码绘制点云的部分,即 src 文件夹下的 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);

代码修改部分十分简单,最后一步就是在 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
)

最终,保存下来的地图可以使用 pcl_viewer 进行查看:

pcl_viewer map.pcd

提醒读者一下,保存下来的map.pcd是在终端运行命令时所在的路径下的,所以建议各位可以新建一个文件夹,在该文件夹下运行命令,这样方便找到和整理点云地图。


更新

        以上改法是Stereo模式在EuRoC V1_01_easy数据集下不使用ROS测试有效的,最终保存下来的点云地图如下

ORB SLAM3 点云地图保存

        但是,后来我也尝试了自己的数据集,并发现在大型数据集下用上面的改法不能保存完整地图,因此代码按照以下方式修改。

        找到以下代码段

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;

        另外,若不想每一关键帧都覆盖掉原来的map.pcd,则可以将KeyFrame ID传入MapDrawer::DrawMapPoints()函数,以ID作为文件名进行保存,此处不贴出代码,读者可以找到调用该函数的地方进行修改。文章来源地址https://www.toymoban.com/news/detail-463991.html

到了这里,关于ORB SLAM3 点云地图保存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ROS2安装ORB—SLAM3并用电脑摄像头运行

    安装环境: Ubuntu22.04 ros2 humble 安装参考链接 1、准备工作 1.1安装依赖 1.2源码下载 原版本: ROB-SLAM3源码下载 修改版本: 下面链接是适用ROS2的ORB-SLAM3修改版 ORB-SLAM3-STEREO-FIXED ,本文下载的是此版本 ORB-SLAM3-STEREO-FIXED下载 2、安装Eugen3 3、安装 Pangolin 原博客说使用0.6,但实测报错

    2024年03月15日
    浏览(64)
  • orb_slam3实现保存/加载地图功能and发布位姿功能

    先说方法:在加载的相机参数文件.yaml的最前面加上下面两行就行。 第一行表示从本地加载名为\\\"MH01_to_MH05_stereo_inertial.osa\\\"的地图文件,第二行表示保存名为\\\"MH01_to_MH05_stereo_inertial.osa\\\"的地图到本地。第一次运行建图时注释掉第一行,只使用第二行,加载地图重定位时反过来,

    2024年02月15日
    浏览(43)
  • ORB-SLAM稠密点云地图构建(黑白+彩色)+ pcd文件以八叉树形式表示

    pcl1.8.1 VTK 7.1.1 版本一定要对好,如果安装了不符的版本如我之前安的pcl1.1.3和VTK8.2 一定要卸载干净不然会一直报错 ,不同版本的pcl和vtk是无法共存的,并且光把包删除是不够的,要去/usr下面使用命令行(先搜索再一起删掉) 使用高翔老师的源码ORB-SLAM2-modified 运行前要先把

    2024年02月07日
    浏览(62)
  • ORB-SLAM2的布置(四)ORB-SLAM2构建点云

    高博的工作是对基本 ORB SLAM2 的扩展,基本思想是为每个关键帧构造相应的点云,然后依据从 ORB SLAM2 中获取的关键帧位置信息将所有的点云拼接起来,形成一个全局点云地图。 https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map 具体的依赖包括: OpenCV (推荐 3.2 版本) DBoW2 和 g2o(源

    2024年02月05日
    浏览(58)
  • ORB_SLAM3配置及修改——将图像、点云用ROS消息发布(基于无人机仿真)

            本文有点长,可以根据目录跳转到想看的部分。因为仿真和应用环境不同,可能例程的运行方式(输入话题等)有所不同,但第三部分有关ORB_SLAM3相机仿真标定、第四部分有关ORB_SLAM3源码修改的部分是通用的。 目录 一、仿真环境配置 1.双系统安装 ① 工具准备 ②

    2024年04月10日
    浏览(49)
  • Netty是一个由JBOSS提供的开源Java框架,目前已经成为Github上的独立项目

    Netty是一个由JBOSS提供的开源Java框架,目前已经成为Github上的独立项目。它提供了一个异步、事件驱动的网络应用程序框架和工具,用于快速开发高性能、高可靠性的网络服务器和客户端程序。 Netty是一个基于NIO的客户、服务器端的编程框架,使用Netty可以确保快速和简单地开

    2024年01月16日
    浏览(52)
  • 8. 《自动驾驶与机器人中的SLAM技术》基于保存的自定义NDT地图文件进行自动驾驶车辆的激光定位

    目录 1. 为 NDT 设计一个匹配度评估指标,利用该指标可以判断 NDT 匹配的好坏。 2. 利用第 1 题的指标,修改程序,实现 mapping 部分的回环检测。 3. 将建图结果导出为 NDT map,即将 NDT 体素内的均值和协方差都存储成文件。 4. 实现基于 NDT map 的激光定位。根据车辆实时位姿,

    2024年02月02日
    浏览(38)
  • 【ORB_SLAM】Ubuntu20.04 配置ORB_SLAM3

    本文主要记录基于Ubuntu20.04环境下,对普通的ORB_SLAM3和稠密版本的ORB_SLAM3进行环境的配置。 这里采用鱼香ros的一键安装,感谢小鱼的一键安装。 Pangolin:链接: https://pan.baidu.com/s/1FXYLsEK1W3xmX0m_Vqylag 提取码: jgz2 (基于小六的注释后的ORB_SLAM3代码) https://github.com/electech6/ORB_SLAM3_d

    2024年02月15日
    浏览(53)
  • 【视觉SLAM】ORB-SLAM2S: A Fast ORB-SLAM2 System with Sparse Optical Flow Tracking

    Citations: Y. Diao, R. Cen, F. Xue.ORB-SLAM2S: A Fast ORB-SLAM2 System with Sparse Optical Flow Tracking[C].2021 13th International Conference on Advanced Computational Intelligence (ICACI). Wanzhou,China.2021:160-165. Keywords: Visualization,Simultaneous localization and mapping,Cameras,Real-time systems,Aircraft navigation,Central Processing Unit,Traje

    2023年04月08日
    浏览(64)
  • SLAM ORB-SLAM2(22)分解基础矩阵

    在 《SLAM ORB-SLAM2(12)估算运动并初始地图点》 中了解到 估算两帧间相对运动过程: 记录特征点对的匹配关系 RANSAC 采样准备 计算H矩阵或者F矩阵 判断并选取模型求位姿过程 在

    2024年04月15日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包