提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、段错误(核心已转储)
- 1. 已放弃(核心已转储)
- (1) 问题描述
- (2)原因分析
- 二、解决方法
- 1. 解决方法一
- 2. 解决方法二
- 总结
一、段错误(核心已转储)
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> static inline
Matx<_Tp, m, n> operator / (const Matx<_Tp, m, n> &a, float alpha)
{
return Matx<_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即可编译成功!!!
附上一张运行成功的截图:
总结
到此为止,以上所有段错误(核心已转储)的问题已经完全解决。就可以实时运行单目相机进行测试了,完结撒花!!!!