ORB-SLAM2实时稠密地图,解决运行报段错误(核心已转储)运行数据集时出现段错误,出现可视化界面后闪退(添加实时彩色点云地图+保存点云地图)

news2024/11/26 15:45:48

高翔的稠密建图仓库

1. git clone https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map.git

2. 去ORB SLAM2里拷贝Vocabulary/home/cgm/ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified文件夹下

3. 删除一些build文件夹

删除ORB_SLAM2_modified/Thirdparty/DBoW2/build、ORB_SLAM2_modified/Thirdparty/g2o/build以及ORB_SLAM2_modified/Examples/ROS/ORB_SLAM2/build这3个 build 文件夹

4. 尝试运行./build.sh看看报什么错,再解决;

chmod +x build.sh
./build.sh

5. 报错如下:

/usr/include/pcl-1.10/pcl/pcl_config.h:7:4: error: #error PCL requires C++14 or above
7 | #error PCL requires C++14 or above

**原因:**错误消息 PCL requires C++14 or above 表明您正在使用的点云库 (PCL) 需要至少 C++14 的 C++ 标准版本才能编译。您的项目可能使用较旧的 C++ 标准,从而导致此问题。
**解决:**修改ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/CMakeLists.txt文件-std=c++11换成-std=c++14

下面的这是原来的


# # Check C++11 or C++0x support
# include(CheckCXXCompilerFlag)
# CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
# CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
# if(COMPILER_SUPPORTS_CXX11)
#    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
#    add_definitions(-DCOMPILEDWITHC11)
#    message(STATUS "Using flag -std=c++11.")
# elseif(COMPILER_SUPPORTS_CXX0X)
#    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
#    add_definitions(-DCOMPILEDWITHC0X)
#    message(STATUS "Using flag -std=c++0x.")
# else()
#    message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
# endif()

修改为:


# Check C++14 or C++0x support  好像PCL1.10版本需要C++14
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++14" COMPILER_SUPPORTS_CXX14)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX14)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
   add_definitions(-DCOMPILEDWITHC14)
   message(STATUS "Using flag -std=c++14.")
elseif(COMPILER_SUPPORTS_CXX0X)
   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
   add_definitions(-DCOMPILEDWITHC0X)
   message(STATUS "Using flag -std=c++0x.")
else()
   message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++14 support. Please use a different C++ compiler.")
endif()

在这里插入图片描述

6. 修改ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/CMakeLists.txt文件之后再次运行./build.sh看看报什么错,

/usr/include/c++/9/bits/stl_map.h:122:71: error: static assertion failed: std::map must have the same value_type as its allocator
  122 |       static_assert(is_same<typename _Alloc::value_type, value_type>::value,

解决办法: 打开LoopClosing.h,将

typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<const KeyFrame*, g2o::Sim3> > > KeyFrameAndPose;
        
替换为

typedef map<KeyFrame*,g2o::Sim3,std::less<KeyFrame*>,
        Eigen::aligned_allocator<std::pair<KeyFrame *const, g2o::Sim3> > > KeyFrameAndPose;

7. 报错:

/home/cgm/ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/Examples/Monocular/mono_tum.cc:81:22: error: ‘std::chrono::monotonic_clock’ has not been declared
81 | std::chrono::monotonic_clock::time_point t1 = std::chrono::monotonic_clock::now();
ORB_SLAM安装问题error: ‘std::chrono::monotonic_clock’ has not been declared

解决办法:将代码中所有使用 `std::chrono::monotonic_clock` 的地方替换为 `std::chrono::steady_clock`。

8. 成功编译截图

在这里插入图片描述

9. 运行TUM数据集

使用如下命令./rgbd_tum path_to_vocabulary path_to_settings path_to_sequence path_to_association
我的命令如下:

./bin/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml /home/cgm/DataSet/TUM_Dataset/rgbd_dataset_freiburg1_xyz Examples/RGB-D/associations/fr1_xyz.txt

10. 报错分析

(1) 编译出现参数未声明问题,参考代码中有些未在头文件中声明,要完整声明才能正确编译。
(2) 运行数据集时出现段错误,出现可视化界面后闪退

ORB Extractor Parameters: 
- Number of Features: 1000
- Scale Levels: 8
- Scale Factor: 1.2
- Initial Fast Threshold: 20
- Minimum Fast Threshold: 7

Depth Threshold (Close/Far Points): 3.09294

-------
Start processing sequence ...
Images in the sequence: 792

New map created with 834 points
receive a keyframe, id = 1
generate point cloud for kf 1, size=25153
show global map, size=14971
receive a keyframe, id = 2
generate point cloud for kf 2, size=25597
段错误 (核心已转储)
  • 有的说:将其中的PCL 1.7 REQUIRED中的1.7删掉(我的是1.10.0,不用删)
find_package(Eigen3 3.1.0 REQUIRED)
find_package(Pangolin REQUIRED)
# adding for point cloud viewer and mapper
# find_package( PCL 1.7 REQUIRED )#修改这行
find_package( PCL REQUIRED )#改为这行
message("PCL version: " ${PCL_VERSION})#增加这行代码可查看PCL版本信息

注意:我的PCL版本是1.10.0,我没有改动这个代码
在这里插入图片描述

  • 出现这个原因是你没有把 -march=native 删干净,你是手动删除的 -march=native
  • 出现这个原因是你没有把 -march=native 删干净,你是手动删除的 -march=native
  • 出现这个原因是你没有把 -march=native 删干净,你是手动删除的 -march=native
  • -出现这个原因是你没有把 -march=native 删干净,你是手动删除的 -march=native
  • 出现这个原因是你没有把 -march=native 删干净,你是手动删除的 -march=native
  • 出现这个原因是你没有把 -march=native 删干净,你是手动删除的 -march=native

如果手动删的话,要删除这四个CMakeLists.txt文件里的-march=native

  • ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/Examples/ROS/ORB_SLAM2/CMakeLists.txt
  • ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/CMakeLists.txt
  • ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/Thirdparty/DBoW2/CMakeLists.txt
  • ORBSLAM2_with_pointcloud_map/ORB_SLAM2_modified/Thirdparty/g2o/CMakeLists.txt

建议使用 CTRL+SHIFT+F进行搜索全替换,将所有的-march=native替换为空格
在这里插入图片描述

成功运行截图(灰色点云)
在这里插入图片描述

11. 使用ORB-SLAM2保存彩色点云地图

ORB-SLAM2是一个用于实时单目、双目和RGB-D相机SLAM的流行开源库。如果您想要修改ORB-SLAM2以保存彩色点云地图,以下是一些您需要进行的修改步骤。

  • 步骤1: 在Tracking.h中添加成员变量

在ORB-SLAM2的include/Tracking.h文件中,您需要添加以下成员变量,以保存当前帧的彩色图像:

// Current Frame
Frame mCurrentFrame;
cv::Mat mImRGB; // 添加这行
cv::Mat mImGray;
cv::Mat mImDepth;
  • 步骤2: 在Tracking.cc中修改代码

在ORB-SLAM2的src/Tracking.cc文件中,需要修改两个地方。

第一处修改

cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB, const cv::Mat &imD, const double &timestamp)
{
    mImRGB = imRGB; // 添加这行
    mImGray = imRGB;
    mImDepth = imD;

第二处修改

// insert Key Frame into point cloud viewer
//mpPointCloudMapping->insertKeyFrame( pKF, this->mImGray, this->mImDepth );
mpPointCloudMapping->insertKeyFrame( pKF, this->mImRGB, this->mImDepth ); // 修改地方

  • 步骤3: 保存彩色点云地图

修改ORB-SLAM2的src/pointcloudmapping.cc文件,在其中调用PCL库的 pcl::io::savePCDFileBinary 函数来保存点云地图。

首先,添加以下头文件:

#include <pcl/io/pcd_io.h>

然后,在 void PointCloudMapping::viewer() 函数中,大约在第123行附近加入保存地图的命令:

for (size_t i = lastKeyframeSize; i < N; i++)
{
    PointCloud::Ptr p = generatePointCloud(keyframes[i], colorImgs[i], depthImgs[i]);
    *globalMap += *p;
}

 // pcl::io::savePCDFileBinary("vslam.pcd", *globalMap); // 只需要加入这一句
 //我用的下面的
 // 存储点云
 string save_path = "./resultPointCloudFile.pcd";
 pcl::io::savePCDFile(save_path, *globalMap);
 cout << "save pcd files to :  " << save_path << endl;

  • 步骤4: 重新编译程序

修改代码后,您需要重新编译以使更改生效。

  • 步骤5: 安装PCL工具并查看生成的文件

为了查看保存的彩色点云地图,您需要安装PCL工具,并使用pcl_viewer工具来查看生成的文件。您可以使用以下命令来安装和查看:

# 安装PCL工具
sudo apt-get install pcl-tools

# 查看保存的点云地图文件
pcl_viewer vslam.pcd

现在,您已经修改了ORB-SLAM2以保存彩色点云地图,并且可以使用PCL工具来查看生成的地图文件。
在这里插入图片描述
按住shift+鼠标滚轮可以上下移动点云;
按住ctrl+鼠标坐标可以顺时针逆时针拖动点云;

高动态环境的数据集rgbd_dataset_freiburg3_walking_xyz

./bin/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUM3.yaml /home/cgm/DataSet/TUM_Dataset/rgbd_dataset_freiburg3_walking_xyz/ Examples/RGB-D/associations/fr3_walking_xyz.txt 

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1023646.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产手机芯片4G方案_紫光展锐安卓核心板虎贲4G智能模块方案定制

元器件清单即BOM物料清单&#xff0c;不同行业领域的BOM表侧重点不一样。安卓主板的BOM表则侧重点在于元器件物料的清单&#xff0c;也就是安卓电路板的PCBA清单&#xff0c;精密的安卓板有上千个物料&#xff0c;可以帮助我们估算物料成本&#xff0c;建立生产计划&#xff0c…

Ftp服务器、 Samba服务器、NFS服务器的区别

根据使用的方式来看&#xff0c;可以分为3种类别的文件服务器&#xff1a;ftp服务器&#xff08;ftp/tftp&#xff09;、 Samba服务器、NFS服务器。ftp的客户可以是任意平台&#xff0c;samba是专门针对windows客户&#xff0c;而NFS则是面向linux/unix用户的。下面是三种服务器…

CRM软件系统价格不同的原因

很多人在了解CRM系统时&#xff0c;发现不同品牌的CRM价格有着很大的区别。一些CRM系统只需要几千块钱&#xff0c;一些CRM系统的报价却要上万&#xff0c;甚至十几万。为什么CRM系统价格不同&#xff1f;下面我们就来说说。 1、功能不同 从功能方面来说&#xff0c;一些CRM系…

OpenCV Series : Slope + Radian + Degree

def lineSlope(p1, p2):slope (p2[1] - p1[1]) / (p2[0] - p1[0])return slopedef slopeAngle(p1, p2):slope lineSlope(p1, p2)radian np.arctan(slope)return radiandef angleDegree(radian):theta int(radian * 180 / np.pi) % 360return theta

【LeetCode热题100】--3.无重复字符的最长子串

3.无重复字符的最长子串 使用滑动窗口&#xff1a; 使用两个指针表示字符串中的某个子串&#xff08;或窗口&#xff09;的左右边界&#xff0c;其中左指针代表着枚举字串的起始位置&#xff0c;而右指针即为 r k r_k rk​在每一步操作中&#xff0c;我们会将左指针向右移动一…

Python类练习

文章目录 题目要求步骤 题目要求 1)创建一个 Kid 类&#xff0c;包含姓名&#xff0c;性别&#xff0c;年龄属性和 play 方法 2) 创建一个 Stu 类&#xff0c;继承 Kid 类&#xff0c;同时包含成绩属性&#xff0c;获取成绩方法&#xff0c;努力学习方法&#xff0c;play方法&…

RocketMQ核心编程模型以及生产环境最佳实践

⼀、回顾 RocketMQ 的消息模型 ⼆、深⼊理解 RocketMQ 的消息模型 1 、 RocketMQ 客户端基本流程 RocketMQ 基于 Maven 提供了客户端的核⼼依赖&#xff1a; 使⽤客户端进⾏编程时&#xff0c;添加这⼀个核⼼依赖就够了。 另外还有⼀个与权限控制相关的核⼼依赖也需要了解。尽…

「聊设计模式」之迭代器模式(Iterator)

&#x1f3c6;本文收录于《聊设计模式》专栏&#xff0c;专门攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎持续关注&&收藏&&订阅&#xff01; 前言 设计模式是软件开发中经验的总结&#xff0c;是一种被反复…

开学季什么触控笔好用又便宜?推荐平价的电容笔

由于iPad平板的强大功能&#xff0c;才让iPad拥有了更多的用户。拿来画画、记笔记什么的体验都是很不错。但是仅仅是拿来看电视、玩游戏&#xff0c;似乎作用不大。如果你不是想要一支昂贵的苹果电容笔&#xff0c;或者只是想要在日常生活中做笔记&#xff0c;那么你可以考虑一…

springcloud3 分布式事务解决方案seata之TCC模式6

一 TCC模式 1.1 TCC的逻辑 TCC模式与AT模式非常相似&#xff0c;每阶段都是独立事务&#xff0c;不同的是TCC需要人工干预编写代码。需要实现三个方法&#xff1a; Try&#xff1a;资源的检测和预留&#xff1b; Confirm&#xff1a;完成资源操作业务&#xff1b;要求 Try 成…

three.js——几何体划分顶点添加不同的材质

几何体划分顶点添加不同的材质 前言效果图.addGroup(顶点的下标, 获取几个顶点, 选择材质的下标)在vue中使用 前言 上篇文章讲解了怎样通过索引划分顶点&#xff0c;通过顶点绘制图形,本章通过addGroup方法讲解根据划分的顶点来添加不同的材质 效果图 .addGroup(‘顶点的下标’…

精品SpringCloud电影院购票系统-微服务-分布式

《[含文档PPT源码等]精品基于SpringCloud实现的电影院购票系统设计的设计与实现-微服务-分布式》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;springcloud JDK版…

【JDK 8-集合框架进阶】6.1 parallelStream 并行流

一、parallelStream 并行流 1.1 串行 和 并行的区别 > 执行结果 二、问题 2.1 paralleStream 并行是否一定比 Stream 串行快? 2.2 是否可以都用并行&#xff1f; > 报错 三、实战 > 执行结果 四、总结 一、parallelStream 并行流 多线程并发处理&#xff…

视频号:平均一场裂变7965人,电商增长玩法全揭秘!

我们整理了几何裂变平台上电商行业近3个月的视频号裂变活动&#xff0c;发现用的最多的玩法是粉丝裂变&#xff0c;其次是直播裂变。 平均一场视频号粉丝裂变活动涨粉7965人&#xff0c;裂变层级9级&#xff0c;裂变率872%&#xff0c;即1个老用户能带来8.72个新用户关注视频号…

数字孪生基础设施需求分析

数字孪生基础设施需求分析 “基础设施”&#xff08;infrastructure&#xff09;新型基础设施建设 “基础设施”&#xff08;infrastructure&#xff09; 一词最早于1875年在法文中出现&#xff0c;但该词汇由拉丁文构成&#xff0c;infrastructure分为infra&#xff08;拉丁文…

汽车电子——产品标准规范汇总和梳理(适应可靠性)

文章目录 前言 一、电气性能要求 二、机械性能要求 三、气候性能要求 四、材料性能要求 五、耐久性能要求 六、防护性能要求 总结 前言 见《汽车电子——产品标准规范汇总和梳理》 一、电气性能要求 《GB/T 28046.2-2019&#xff08;ISO 16750-2&#xff1a;2012&#…

算法简述-串和串的匹配、排序、深度/广度优先搜索、动态规划、分治、贪心、回溯、分支限界

目录 算法简述 基本 典型算法列举 串和串的匹配 排序 深度/广度优先搜索 动态规划 分治 贪心 回溯 分支限界 算法简述 基本 咳咳嗯…算法嘛&#xff0c;咱也不是 CS 科班学生&#xff0c;咱就说&#xff0c;算法是对已经建模后的问题的解决的具体途径和方法&#x…

A-小美种果树(二分)-- 牛客周赛 Round 12

输入 1 2 10 输出 6 解析&#xff1a; 二分&#xff0c;注意两端端点L、R的取值&#xff01;&#xff01;&#xff01; #include<bits/stdc.h> using namespace std; #define int long long int x,y,z; signed main(){scanf("%lld%lld%lld",&x,&y,…

链表反转-两两交换链表中的节点

LeetCode24.给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。必须在不修改节点内部的值的情况下完成本题(即&#xff0c;只能进行节点交换) 如果原始顺序是 dummyHead -> node1 -> node2&#xff0c;交换后面两个节点关系要变成 …

【深度学习实验】前馈神经网络(一):使用PyTorch构建神经网络的基本步骤

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 定义x,w,b 2. 计算净活性值z 3. 实例化线性层并进行前向传播 4. 打印结果 5. 代码整合 一、实验介绍 本实验使用了PyTorch库来构建和操作神经网络模型&#xff0c;主要是关…