ROS1 Ubuntu系统运行ORB_SLAM3报段错误(核心已转储)

文章描述了在使用ROS和ORB_SLAM3时遇到cv_bridge与自安装OpenCV版本冲突的问题,尝试了多种解决办法,包括修改ros的cv_bridge路径、重新编译cv_bridge包、卸载并安装新版本cv_bridge等。最终通过覆盖ros默认的libcv_bridge.so并修改CMakeLists.txt配置成功解决了问题。

<先看后面的重要提醒!!!!!!>
运行单目+IMU案例

1.第一个终端

roscore

2.第二个终端
在SLAM3工程文件夹下进入终端:

rosrun ORB_SLAM3 Mono_Inertial Vocabulary/ORBvoc.txt Examples_old/Monocular-Inertial/EuRoC.yaml true

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

查询原因说是cv_bridge对opencv指向问题,cv_bridge默认指向ros安装自带的opencv3.2.0,就会与自己安装的opencv产生冲突

**

cv_bridge与opencv指向解决方法:

**

  • 第一种
    修改ros安装路径中的cv_bridge相关文件的路径,指向自己安装的opencv
sudo gedit /opt/ros/melodic/share/cv_bridge/cmake/cv_bridgeConfig.cmake

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

使用sudo apt install ros-melodic-desktop-full安装的ros,会默认安装opencv3.2.0版本到/usr/include,/usr/lib,/usr/share三个目录。
但是如果自己从opencv官网源码编译安装的,opencv会默认安装到usr/local下对应的三个子目录。

将路径改成自己安装opencv默认的对应的子目录。

sudo gedit /opt/ros/melodic/share/cv_bridge/cmake/cv_bridge-extras.cmake

在这里插入图片描述

将版本号改为自己安装的版本号

cd /opt/ros/melodic/lib/
sudo gedit pkgconfig/cv_bridge.pc

在这里插入图片描述

同样,将相关路径改成自己的
最后catkin_make项目即可。
但在实操中,还是警告了
在这里插入图片描述在这里插入图片描述

发现还是关联到ros默认的安装版本,感觉应该是重新编译ros才生效,然后再重新catkin_make项目。

  • 第二种
    下载cv_bridge包编译
    下载网址:https://gitee.com/bingobinlw/cv_bridge
mkdir -p cv_bridge_ws/src
cd cv_bridge_ws/src
git clone https://gitee.com/bingobinlw/cv_bridge //此链接适用于18.04
cd ..

在这里插入图片描述

将自己安装的opencv编译生成的build文件路径加入CMakeLists.txt
在这里插入图片描述在这里插入图片描述在这里插入图片描述

修改为
在这里插入图片描述

编译cv_bridge包:

catkin_make

最后,在所需要使用cv_bridge的ros包里的CMakeLists.txt文件中添加opencv路径以及cv_bridge路径

set(OpenCV_DIR "your-path/opencv-x.x.x/build")
set(cv_bridge_DIR your-path/cv_bridge_ws/devel/share/cv_bridge/cmake)

例如:此处修改SLAM3中ros包中slam3的CMakeLists.txt
在这里插入图片描述在这里插入图片描述

删除之前编译产生的文件,重新编译项目。真是很糟糕,白忙活一场,这方法对我的还是不起效果,还是报如下错误。
在这里插入图片描述

  • 第三种
    卸载ROS自动安装的cv_bridge,重新安装
    1)卸载原版本cv_bridge
sudo apt-get remove ros-melodic-cv-bridge

2)下载新版本cv_bridge
网址:https://github.com/ros-perception/vision_opencv
选择melodic对应的cv_bridge
3)修改cv_bridge中的cmakelists.txt
在这里插入图片描述在这里插入图片描述

将find_package(OpenCV 3.4.5 REQUIRED中的版本号改成你安装的版本号
4)cmake单独编译cv_bridge
在cv_bridge文件夹下,进入终端

mkdir build
cd build
cmake ..
make
sudo make install

5)在项目中需要的cmaklist.txt中添加cv_bridge的cmake路径

set(cv_bridge_DIR /usr/local/share/cv_bridge/cmake)  //在find_package前面

在这里插入图片描述

我在以下三个CMakeLists.txt都添加了cv_bridge的cmake路:
/home/fei/ORB_SLAM3/CMakeLists.txt
/home/fei/ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt
/home/fei/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt
6)重新编译ros版本的ORB_SLAM3
编译时报错:

– Configuring incomplete, errors occurred!
See also “/home/fei/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/build/CMakeFiles/CMakeOutput.log”.

make: *** 没有指明目标并且找不到 makefile。 停止.
首先,我在.bashrc文件添加了该ROS项目的路径,所以不是该原因造成的。
应该是删除了ROS自安装的cv_bridge,而在编译时,系统还是自动从ROS路径查找,所以,将自己的安装的cv_bridge包复制粘贴到ROS的安装对应路径下。
根目录无法复制文件夹,所以终端输入:

sudo nautilus

在弹出的文件界面将/usr/local/share/中的cv_bridge
在这里插入图片描述

复制到/opt/ros/melodic/share中
在这里插入图片描述

删除刚编译产生的文件,再次编译:

chmod +x ./build_ros.sh
./build_ros.sh

没有再报版本冲突警告
继续前面的案例运行到第二个终端:
在这里插入图片描述

测试其他项目是否正常
测试ORB_SLAM2:
第一个终端:roscore
第二个终端:roslaunch usb_cam usb_cam-test.launch
在这里插入图片描述

果然报错,解决方案依次运行以下指令:

sudo apt-get install ros-melodic-usb-cam
sudo apt-get install ros-melodic-camera-calibration
sudo apt-get install ros-melodic-image-view

第三个终端:

rosrun ORB_SLAM2 Mono /home/fei/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/fei/ORB_SLAM2/ost.yaml

结果正常。
测试VINs_Mono:结果也正常
但是我返回来测试ORB_SLAM3时又不行了,又是冲突,核心已转储。原因是为解决相机问题安装的三个包,又再一次装回了原来的cv_bridge。

  • 第四种
    前言:不用卸载ros自安装的cv_bridge,按照上述第三种中cv_bridge安装方法编译,或者这里可以参考下面的安装方法,两种方法随便一种都可以。
    另一种cv_bridge安装编译方法:
    (1)下载安装包
    网址:https://github.com/ros-perception/vision_opencv
    在这里插入图片描述

选择对应ros版本的vision_opencv

(2)修改cv_bridge的CMakeLists.txt
在这里插入图片描述

在vision_opencv/cv_bridge中打开CMakeLists.txt,将其中的opencv版本改成自己安装的版本
在这里插入图片描述

(3)编译
在cv_bridge文件夹下进入终端:

mkdir build
cd build
cmake ..
make
sudo make install

(4)覆盖ros默认安装的libcv_bridge.so
终端输入sudo nautilus
在这里插入图片描述

将我们刚安装的cv_bridge中产生的libcv_bridge.so复制,粘贴到ros该lib的路径中,覆盖原来的libcv_bridge.so
在这里插入图片描述

该方法是在各种尝试后,又返回警告,仔细观察:
usr/bin/ld: warning: libopencv_core.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so,may conflict with libopencv_core.so.3.4
usr/bin/ld: warning: libopencv_imgproc.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so, may conflict with libopencv_imgproc.so.3.4
usr/bin/ld: warning: libopencv_core.so.3.2, needed by /opt/ros/melodic/lib/libcv_bridge.so,may conflict with libopencv_core.so.3.4

把需要的这几个libopencv_core.so.3.4、libopencv_imgproc.so.3.4、libopencv_imgproc.so.3.4放入跟3.2一样的路径中,再把第一种方法中的cv_bridgeConfig.cmake文件只修改set_libraries中的版本号,重新编译slam3项目还是报一样的错误。随后根据/opt/ros/melodic/lib/libcv_bridge.so,将其覆盖成自己安装的libcv_bridge.so,重新编译slam3通过了。

(5)测试
重新编译slam3 ros版本

chmod +x ./build_ros.sh
./build_ros.sh

在这里插入图片描述

没有警告,运行带imu的也没有报核心已转储。
测试ORB_SLAM2和VINs_Mono也没有任何问题。

重要提醒:
不是前三种对我不行,而是项目的CMakeLists.txt中引用ROS的方式不一样。
1)如果是:
在这里插入图片描述

则使用第四种方法有效

2)如果是:
在这里插入图片描述

则前三种都有效

3.第三个终端:
在有目标数据包文件夹下进入终端:

rosbag play MH_01_easy.bag /cam0/image_raw:=/camera/image_raw /imu0:=/imu

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

<think>嗯,用户遇到了ORB_SLAM3在RGB-D模式下运行时出现的段错误,也就是“核心已转”的问题。这个问题看起来和之前ORB_SLAM2的情况类似,可能有一些共同的解决方法。首先,我需要回忆一下ORB_SLAM系列常见的错误原因。 根据引用[^1]和[^2],之前用户运行ORB_SLAM2时也遇到了段错误,可能的原因包括参数文件配置错误、路径问题或者依赖库版本不兼容。而引用[^5]提到删除build目录并重新编译可以解决某些问题,这可能是因为旧的编译缓存导致的问题。 接下来,用户现在的问题是ORB_SLAM3,虽然版本不同,但框架可能类似。首先应该检查参数文件是否正确,比如YAML配置文件中的相机参数是否与使用的RGB-D相机匹配。例如,D435i的配置可能需要特定的参数,如分辨率、内参等。如果配置文件路径错误或者参数不正确,程序可能在初始化时崩溃。 然后,检查数据关联文件是否正确。引用[^3]提到运行命令时需要关联文件,如果用户的数据文件夹路径或关联文件有误,也可能导致段错误。例如,图像路径不存在或者文件名不匹配,程序读取不到数据就会崩溃。 依赖项的问题也很重要。ORB_SLAM3需要特定的库版本,比如OpenCV、Eigen、Pangolin等。如果用户升级了系统或库,可能会导致兼容性问题。需要确认所有依赖库的版本是否符合ORB_SLAM3的要求,并重新编译安装。 编译过程中的问题也不能忽视。引用[^5]中的解决方法是删除build目录并重新编译,这可以清除可能存在的编译缓存错误。用户应该尝试清理项目,重新运行cmake和make,确保编译过程没有错误或警告。 此外,ROS环境配置是否正确也是一个因素。如果用户是通过ROS运行ORB_SLAM3,需要检查ROS的话题名称是否匹配,相机数据是否正确发布。使用rostopic list和rostopic echo确认图像和深度信息是否正常传输。 还有可能是硬件问题,比如相机驱动未正确安装,或者USB带宽不足导致数据传输不稳定。尝试使用不同的USB端口或降低相机分辨率看看是否解决问题。 如果以上方法都无效,可能需要查看核心文件,使用gdb调试工具分析崩溃的具体位置。通过回溯追踪,可以定位到代码中的哪一部分导致了段错误,从而进一步排查。 总结一下,解决方案应该分步骤进行,从简单的清理和重新编译开始,逐步检查配置文件和依赖项,最后利用调试工具深入分析。用户需要按照这些步骤逐一排除可能的原因,直到问题解决。</think>### ORB_SLAM3 RGB-D段错误解决方案分析 #### 一、问题排查思路 1. **参数文件验证** 检查YAML配置文件路径和内容是否正确,例如相机参数需与硬件匹配(如D435i的`MyD435i.yaml`)。特别注意`Camera.fps`、`Camera.bf`和`DepthMapFactor`等关键参数[^4]。 2. **数据关联文件完整性** 确保使用的`ASSOCIATIONS_FILE`格式正确,时间戳和文件路径需严格对齐。例如: ```bash ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml PATH_TO_SEQUENCE_FOLDER ASSOCIATIONS_FILE ``` 路径中的`PATH_TO_SEQUENCE_FOLDER`需替换为实际数据集路径[^3]。 3. **编译缓存清理** 删除旧编译文件并重新编译(此方法在ORB_SLAM2中有效): ```bash rm -rf build/ mkdir build && cd build cmake .. -DCMAKE_BUILD_TYPE=Release make -j4 ``` 这一步骤可解决因编译残留文件导致的段错误。 --- #### 二、进阶解决方案 1. **依赖库版本验证** ORB_SLAM3依赖的库(如OpenCV≥4.4.0、Eigen33.1.0)需版本匹配。使用`pkg-config --modversion opencv`检查版本,若版本过低需升级。 2. **ROS话题对齐** 通过`rostopic list`确认RGB和深度图像话题是否与代码订阅的话题名一致。例如,深度相机可能发布`/camera/depth/image_raw`,而配置文件需对应修改订阅名称。 3. **硬件兼容性测试** 使用`realsense-viewer`验证相机是否能正常输出数据。若出现帧丢失,可能是USB带宽不足,建议更换USB3.0接口或降低分辨率。 --- #### 三、调试工具使用 通过GDB定位崩溃点: ```bash gdb --args ./Examples/RGB-D/rgbd_tum Vocabulary/ORBvoc.txt Examples/RGB-D/TUMX.yaml dataset_path (gdb) run (gdb) bt # 查看调用栈 ``` 若崩溃在`System::TrackRGBD()`,可能是特征提取异常,需检查ORB特征参数`ORBextractor.nFeatures`是否过大导致内存溢出。 --- #### 四、特殊案例参考 某案例中,段错误由`libDBoW2.so`未正确链接引起,需在CMakeLists.txt中添加: ```cmake target_link_libraries(${PROJECT_NAME} DBoW2) ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值