Ubuntu18.04:ORB-SLAM3使用数据集构建地图和保存点云地图
文章目录
- 保存地图方法一:使用ORB-SLAM3自带的保存方法(oea后缀文件)
- 保存地图方法二:使用PCL库保存为PCD类型地图文件
- 安装PCL库:
- 取巧方法:
- CMakeLists.txt 文件修改内容:(向该文件内添加PCL库)
- src目录下的MapDrawer.cc 文件修改内容:
在前一篇文章的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并不会自己保存构建的点云地图文件。
若是想要将其构建的点云地图文件保存下来,则需要自己修改一些文件
保存地图方法一:使用ORB-SLAM3自带的保存方法(oea后缀文件)
仔细观察之前运行测试集的命令中,有一个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后缀的配置文件无需进行重新编译,改完即可直接使用运行指令运行
保存地图方法二:使用PCL库保存为PCD类型地图文件
若要了解PCD类型文件,可以查看PCD(点云数据)文件格式这篇文章
安装PCL库:
sudo apt-get install libpcl-dev pcl-tools
取巧方法:
如果没有对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
)
src目录下的MapDrawer.cc 文件修改内容:
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 Aweipcl::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 Aweipcl::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的地图保存与使用这篇文章中地图调用这一部分
至此,结束
参考链接:
orb_slam3实现保存/加载地图功能and发布位姿功能
ORB SLAM3 点云地图保存
相关文章:
Ubuntu18.04:ORB-SLAM3使用数据集构建地图和保存点云地图
文章目录 保存地图方法一:使用ORB-SLAM3自带的保存方法(oea后缀文件)保存地图方法二:使用PCL库保存为PCD类型地图文件安装PCL库:取巧方法:CMakeLists.txt 文件修改内容:(向该文件内添…...
找到自制电子杂志的方法了,快来看看?
终于找到自制电子杂志的方法了,这真是令人兴奋啊!现在,我们可以利用这个方法来创造属于自己的电子杂志,将我们的想法和创意以独特的方式展现给世界。 1.需要一个电子杂志制作工具 市面上有许多专门用于制作电子杂志的工具&#x…...
Django请求的生命周期
Django请求的生命周期是指: 当用户在浏览器上输入URL到用户看到网页的这个时间段内,Django后台所发生的事情。 直白的来说就是当请求来的时候和请求走的阶段中,Django的执行轨迹。 一个完整的Django生命周期: 用户从客户端发出一条请求以后ÿ…...
Kotlin 中 OkHttp 使用及解析
build.gradle dependencies {//OkHttpimplementation com.squareup.okhttp3:okhttp:4.9.0 } 简单使用例子 val okHttpClient OkHttpClient.Builder().connectTimeout(Duration.ofSeconds(10)).readTimeout(Duration.ofSeconds(10)).writeTimeout(Duration.ofSeconds(10)).re…...
【C++代码】用栈实现队列,用队列实现栈--代码随想录
队列是先进先出,栈是先进后出。卡哥给了关于C方向关于栈和队列的4个问题: C中stack 是容器么? 使用的stack是属于哪个版本的STL? 使用的STL中stack是如何实现的? stack 提供迭代器来遍历stack空间么? …...
肖sir__linux详解__001
linux详解: 1、ifconfig 查看ip地址 2、6版本:防火墙的命令: service iptables status 查看防火墙状态 service iptables statrt 开启防火墙 service iptables stop 关闭防火墙 service iptables restart 重启防火墙状态 7版本: systemctl s…...
【Android Framework系列】第12章 RecycleView相关原理及四级缓存策略分析
1 RecyclerView简介 RecyclerView是一款非常强大的widget,它可以帮助您灵活地显示列表数据。当我开始学习 RecyclerView的时候,我发现对于复杂的列表界面有很多资源可以参考,但是对于简单的列表展现就鲜有可参考的资源了。虽然RecyclerView的…...
P1886 滑动窗口 /【模板】(双端队列)+双端队列用法
例题 有一个长为 n 的序列 a,以及一个大小为 k 的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。 例如: The array is [1,3,−1,−3,5,3,6,7],and k3。 输入格式 输入一共有两行…...
网络渗透day6-面试01
😉 和渗透测试相关的面试问题。 介绍 如果您想自学网络渗透,有许多在线平台和资源可以帮助您获得相关的知识和技能。以下是一些受欢迎的自学网络渗透的平台和资源: Hack The Box: Hack The Box(HTB)是一个受欢迎的平…...
Docker 及 Docker Compose 安装指南
Docker 是一个开源的容器化平台,可以帮助我们快速构建、打包和运行应用程序。而 Docker Compose 则是用于管理多个容器应用的工具,可以轻松定义和管理多个容器之间的关系。现在,让我们开始安装过程吧! docker 安装 apt安装 sudo…...
Gitlab创建一个空项目
1. 创建项目 Project slug是访问地址的后缀,跟前边的ProjectUrl拼在一起,就是此项目的首页地址; Visibility Level选择默认私有即可,选择内部或者公开,就会暴露代码。 勾选Readme选项,这样项目内默认会带…...
C语言-内存分布(STM32内存分析)
C/C内存分布 一、内存组成二、静态区域文本段 (Text / 只读区域 RO)已初始化读写数据段(RW data -- Initialized Data Segment)未初始化数据段(BSS -- Block Started by Symbol) 三、动态区域堆(…...
Linux上配置NAT
Linux系统上实现NAT上网是一个挑战性的任务,需要对操作系统进行合理的配置。本文将概述在Linux上实现NAT上网,并给出相应的工作步骤。 NAT,即Network Address Translation,是一种网络部署技术,可以在peivate network&…...
springboot实现简单的消息对话
目录 一、前言 二、实战步骤 步骤 1: 步骤 2: 步骤 3: 步骤 4: 一、前言 要在Spring Boot项目中实现消息对话,你可以使用WebSocket技术。WebSocket是一种在客户端和服务器之间提供实时双向通信的协议。 二、实…...
「Tech初见」Linux驱动之blkdev
目录 一、Motivation二、SolutionS1 - 块设备驱动框架(1)注册块设备(2)注销块设备(3)申请 gendisk(4)删除 gendisk(5)将 gendisk 加入 kernel(6&a…...
ssh配置(二、登录服务器)
一. 登录 linux 服务器的两种方式 使用 ssh用户名密码 的方式登录,但这种方式不安全,密码太简单容易被暴力破解,密码太复杂又不容易记。使用 ssh公私钥 的方式登录。 以上两种方式都可以在图形化软件工具中配置,例如 finalshell…...
pytorch异常——RuntimeError:Given groups=1, weight of size..., expected of...
文章目录 省流异常报错异常截图异常代码原因解释修正代码执行结果 省流 nn.Conv2d 需要的输入张量格式为 (batch_size, channels, height, width),但您的示例输入张量 x 是 (batch_size, height, width, channels)。因此,需要对输入张量进行转置。 注意…...
【FPGA项目】沙盘演练——基础版报文收发
第1个虚拟项目 前言 点灯开启了我们的FPGA之路,那么我们来继续沙盘演练。 用一个虚拟项目,来入门练习,以此步入数字逻辑的…...
【C++技能树】继承概念与解析
Halo,这里是Ppeua。平时主要更新C,数据结构算法,Linux与ROS…感兴趣就关注我bua! 继承 0. 继承概念0.1 继承访问限定符 1. 基类和派生类对象赋值兼容转换2. 继承中的作用域3. 派生类中的默认成员函数4.友元5.继承中的静态成员6.菱…...
计算机网络 第二节
目录 一,计算机网络的分类 1.按照覆盖范围分 2.按照所属用途分 二,计算机网络逻辑组成部分 1.核心部分 (通信子网) 1.1电路交换 1.2 分组交换 两种方式的特点 重点 2.边缘部分 (资源子网) 进程通信的方…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
