0


关于在ubuntu18.04中运行ORB_SLAM3时遇到的报错:段错误(核心已转储)的解决方法(踩坑记录)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


一、段错误(核心已转储)

1. 已放弃(核心已转储)

(1) 问题描述

使用rosrunORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM3/Asus.yaml指令,在运行ROS版本的ORB时,出现的Opencv相关的报错:

在这里插入图片描述

(2)原因分析

在ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt和ORB_SLAM3/CMakeLists.txt中,使用的是opencv4版本,而在ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt中,要求使用的是OpenCV3的版本,所以最后导致segmentation fault(段错误)。

二、解决方法

1. 解决方法一

修改opencv版本,改成统一的opencv3版本
注意:以下是在v0.4-beta版本的ORB_SLAM源码中进行

(1) 修改CMakeLists.txt文件的代码
在ORB_SLAM3/CMakeLists.txt修改为:

在这里插入图片描述

在ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt中修改为:

在这里插入图片描述

在ROS/ORB_SLAM3/CMakeLists.txt中不变,如下

在这里插入图片描述

(2) 再次编译ORB_SLAM3
经过上述的修改之后,再次运行./build.sh编译代码时出现报错:no match for ‘operator’,具体的报错的信息如下所示:

在这里插入图片描述

解决
1)修改LocalMapping.cc文件
在src/ORB_SLAM3/src目录下的LocalMapping.cc文件,大概在628行,修改为:

x3D = cv::Matx31f(x3D_h.get_minor<3,1>(0,0)(0)/x3D_h(3), x3D_h.get_minor<3,1>(0,0)(1)/x3D_h(3), x3D_h.get_minor<3,1>(0,0)(2)/x3D_h(3));

修改位置如下图所示:
在这里插入图片描述
2)再次运行./build.sh
报错页面信息如下

在这里插入图片描述
解决:
修改src/ORB_SLAM3/src/CameraModels目录下的KannalaBrandt8.cpp文件,大概在534行,修改为:

namespace cv
{template<typename_Tp,int m,int n>staticinline
Matx<_Tp, m, n>operator/(const Matx<_Tp, m, n>&a,float alpha){returnMatx<_Tp, m, n>(a,1.f/ alpha,Matx_ScaleOp());}}

修改的位置如下:
在这里插入图片描述

再次执行./build.sh,./build_ros.sh,即可编译完成。
最后,再次运行ORBSLAM:

rosrunORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM3/Asus.yaml

即可解决段错误的问题

2. 解决方法二

更换ROB_SLAM3版本:ORB_SLAM3-master的安装(这版本的ROS文件在Examples_old中),具体的环境配置和在v0.4的版本的源码一样:

(1) 运行./build_ros.sh出现报错
1)问题描述
报错的页面信息如下所示:

在这里插入图片描述
在这里插入图片描述

2)解决
1.在ROS/ORB_SLAM3/src/AR目录下,修改ViewerAR.cc文件
添加Converter.h头文件:

#include"../../../include/Converter.h"

添加的位置如图:
在这里插入图片描述
大概405行,修改为:

vPoints.push_back(ORB_SLAM3::Converter::toCvMat(pMP->GetWorldPos()));

修改位置如图所示:
在这里插入图片描述
大概在530行,修改为:

cv::Mat Xw = ORB_SLAM3::Converter::toCvMat(pMP->GetWorldPos());

修改位置如图所示:
在这里插入图片描述

(2) 再次运行./build_ros.sh出现报错
1)问题描述
报错的页面信息如下所示:

在这里插入图片描述

2)解决
1.在ROS/ORB_SLAM3/src/AR目录下,修改ros_mono_ar.cc文件
添加Converter.h头文件:

#include"../../../include/Converter.h"

添加位置如下:
在这里插入图片描述

大概在151行,修改为:

cv::Mat Tcw=ORB_SLAM3::Converter::toCvMat(mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec()).matrix());

修改的位置如下:
在这里插入图片描述

修改上述文件后,删除build文件,再次运行./build_ros.sh,不出意外,这次就会编译成功。

(3) 运行ROS的例程或实时运行单目相机
1)问题描述
rosrun官方数据集和自己摄像头出现还是报错:段错误(核心已转储),具体的报错的信息如下:

在这里插入图片描述
2)解决
全部修改成/ROS/ORB_SLAM3/CMakeLists.txt中要求的opencv3版本。
1. 修改CMakeLists.txt文件的代码
在ORB_SLAM3/CMakeLists.txt修改为:

在这里插入图片描述

在ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt中修改为:

在这里插入图片描述

在ROS/ORB_SLAM3/CMakeLists.txt中不变

在这里插入图片描述

修改之后,再次编译./build_ros.sh即可编译成功!!!
附上一张运行成功的截图:

在这里插入图片描述

总结

到此为止,以上所有段错误(核心已转储)的问题已经完全解决。就可以实时运行单目相机进行测试了,完结撒花!!!!


本文转载自: https://blog.csdn.net/2401_82458959/article/details/138438979
版权归原作者 啥也不会的研究僧 所有, 如有侵权,请联系我们删除。

“关于在ubuntu18.04中运行ORB_SLAM3时遇到的报错:段错误(核心已转储)的解决方法(踩坑记录)”的评论:

还没有评论