VINS-Fusion运行时的段错误(核心已转储)解决方法

本文详细记录了解决VINS-Fusion在Ubuntu16.04+ROS环境下运行时出现的段错误问题过程。通过调整栈空间大小、使用gdb调试并定位到Eigen库版本冲突,最终通过更换Eigen库版本成功解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平台:ubuntu16.04 + ROS

问题描述:前两天VINS的原作者开源了VINS-Fusion的双目版以及给出了和GPS融合的一个demo,所以试着运行下数据集。每次单目运行10s左右,双目1-2s时VINS的vins_node节点便会出现“断错误(核心已转储)”导致程序中断,其他RVIZ和数据发送节点都正常。

问题解决路径:

1、起初在网上查询段错误的解决方法,大部分都指明与内存有关,尤其是程序已经运行起来了,所以初步怀疑是栈空间不够,于是采用“ulimite -a”查看当前的栈空间大小是8M,于是将各个终端的临时栈空间修改为“ulimite –s 102400”(100M)然后运行程序依旧不行。又和别人(能正常运行)对比了“ulimite -a”下的各项指标,表明我的电脑没有问题。

2、接着在网上看到可以采用gdb对程序进行调试,可以找出发生段错误的程序位置。于是首先安装gdb,这个直接在网上搜教程即可。

安装完gdb之后,首先对ROS程序进行重新编译得到Debug版本,命令为:

catkin_make -DCMAKE_BUILD_TYPE=Debug

下一步基于gdb启动ROS程序“rosrun --prefix 'gdb -ex run --args' package node” package表示包,node表示需要启动的节点。程序运行后当出现段错误时,对应的vins_node运行指令为(xx需要替换为自己的目录):

rosrun --prefix 'gdb -ex run --args' vins vins_node /home/xx/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml 

运行后出现错误时,便会报下面的错误信息:

然后进一步输入“bt”可以查看崩溃的程序位置:

由图中可见出问题的基本就是在“eigen3”下的文件,所以初步怀疑是Eigen库有问题。

此处gdb在ROS下调试具体可参看: https://blog.youkuaiyun.com/crazyquhezheng/article/details/79657811

上谷歌搜索Eigen库对应的错误信息,发现有别人在调试ORB_SLAM时出现过类似的问题:

https://stackoverflow.com/questions/42198557/eigen-error-while-building-orb-slam;

https://stackoverflow.com/questions/38647114/orb-slam-installation-on-ubuntu-xenial-16-04;

下面的答案都有提到是因为Eigen库版本的问题,需要安装Eigen2.8.0才可以

回到自己电脑,查看自己的Eigen库版本,首先查找eigen3的安装位置“locate eigen3”,可以看到出现了好多eigen3相关的文件位置。如图所示:

然后找到“xxx/Eigen/src/Core/util/Macros.h”对应的位置,利用gedit或者其他编辑器打开便可以看到预编译的版本定义:

(图自网络)
这表示版本是3.3.4。我的版本是“3.2.92”,抱着试试的态度,决定对eigen3的库版本进行修改。此处可参看: https://blog.youkuaiyun.com/xiaoxiao133/article/details/82705460

删除eigen3.2.92版本,首先“locate eigen3”进行定位,然后删除/usr/include和/usr/lib/cmake下的eigen3文件,采用rm –rf命令,一定要小心,此处删除后不可恢复:

sudo rm -rf /usr/include/eigen3 /usr/lib/cmake/eigen3 /usr/share/doc/libeigen3-dev /usr/share/pkgconfig/eigen3.pc /var/lib/dpkg/info/libeigen3-dev.list /var/lib/dpkg/info/libeigen3-dev.md5sums

实际测试只删除“/usr/include/eigen3 /usr/lib/cmake/eigen3”就可以了。此处可参看: https://blog.youkuaiyun.com/j_____j/article/details/80622570

需要注意的是,删除后需要执行“sudo updatedb”和“locate eigen3”查看是否已经删除,第一句必须执行,在我的电脑上不执行的话下一次查找时并不会对eigen3的文件存储地址进行更新,所以会出现明明删除了文件,但是文件显示依旧存在的怪象。

接着安装新的eigen2.8.0。安装方法采用下面任何一种即可:

1)Install eigen form here https://launchpad.net/ubuntu/trusty/amd64/libeigen3-dev/3.2.0-8

     Download the .deb file and install using

sudo dpkg -i libeigen3-dev_3.2.0-8_all.deb

2)

wget "http://bitbucket.org/eigen/eigen/get/3.2.8.tar.gz"
tar zxvf 3.2.8.tar.gz
cd eigen*
/eigen-eigen-07105f7124f9$ mkdir build
/eigen-eigen-07105f7124f9$ cd build
/eigen-eigen-07105f7124f9/build$ cmake ..
/eigen-eigen-07105f7124f9/build$ make
/eigen-eigen-07105f7124f9/build$ sudo make install

   切记:安装完后再次执行“sudo updatedb”更新库的地址。我这安装完后没更新,然后再去编译程序,一直说找不到eigen3的位置。然后我又去locate eigen3发现目录里根本没有安装的eigen3,所有一定要更新一下安装后的文件地址。

 

最后对VINS-Fusion进行catkin_make重新编译,编译时有可能会提示ceres又找不到了,若不提示直接重新编译完VINS-Fusion即可正常运行。若提示ceres找不到,对ceres重新编译,安装(因为重装了eigen3,有可能会对ceres产影响)。正常运行后的图如下所示:

<think>好的,我现在需要解决用户提到的VINS-Fusion中parameters.cpp在line 71处断点命中以及核心已转的问题。首先,我得理解用户的具体情况。用户可能在调试程序,在parameters.cpp的第71行触发了断点,并且程序崩溃,生成了核心文件。核心已转通常意味着程序发生了严重的错误,比如段错误(Segmentation Fault)或者断言失败等。 首先,我应该回顾VINS-Fusion的代码结构。根据用户提供的引用[4],parameters.cpp位于vins_estimator模块中,主要负责读取和解析配置文件中的参数。line 71可能是某个参数加载的关键部分。用户的问题可能出在参数读取过程中,比如访问了无效的内存地址,或者文件读取错误导致空指针解引用。 接下来,我需要分析可能的原因。可能的情况包括: 1. 配置文件路径错误或文件不存在,导致程序无法正确读取参数,进而引发空指针访问。 2. 参数文件中的某些字段格式不正确,导致解析数据类型不匹配或越界访问。 3. 内存分配失败,例如在读取参数动态分配内存失败,导致后续操作出错。 4. 多线程或资源竞争问题,可能在初始化多个线程同访问参数导致冲突。 5. 第三方库依赖问题,比如YAML解析库版本不兼容,导致解析错误。 根据引用[1]中提到的VINS-Fusion常见问题,配置文件路径的正确性是一个常见问题。用户需要检查是否在运行命令正确指定了配置文件路径,比如使用`config/xxx.yaml`。如果路径错误,程序可能无法找到文件,导致参数未初始化,后续访问崩溃。 另外,引用[4]指出config目录存放了运行所需的yaml文件,用户需要确保使用的配置文件与当前传感器配置(如相机类型)匹配。例如,如果使用了不同的相机模型,可能需要调整配置文件中的参数,否则解析可能出错。 针对line 71的具体代码,我需要查看parameters.cpp的源码。假设在line 71处进行的是某个参数的读取操作,比如: ```cpp std::string config_file = argv[1]; ``` 如果用户没有正确传递配置文件参数,导致argv[1]为空,此访问argv[1]会导致未定义行为,比如段错误。或者,在读取YAML节点,比如: ```cpp camodocal::CameraPtr camera = camodocal::CameraFactory::instance()->generateCameraFromYamlFile(config_file); ``` 如果config_file路径错误,生成相机模型失败,可能导致后续操作中的空指针访问。 解决方案方面,首先应验证配置文件的路径和内容是否正确。用户需要确认运行命令中是否正确指定了配置文件,例如: ```bash roslaunch vins_estimator euroc.launch ``` 并检查对应的launch文件中参数路径是否正确。其次,检查yaml文件的语法,确保没有缩进错误或字段拼写错误。例如,某些参数可能需要浮点数而非整数,或者必须存在的字段缺失。 如果问题依旧,可以尝试使用调试工具,如gdb,分析核心文件,定位具体的崩溃位置。例如: ```bash gdb vins_estimator core ``` 然后使用`bt`命令查看堆栈跟踪,确定line 71处的具体操作。如果发现是空指针解引用,可能需要检查相关变量是否已正确初始化。 此外,用户还应检查系统依赖库的版本是否与VINS-Fusion兼容,尤其是YAML-CPP库的版本。不兼容的库版本可能导致解析异常,进而引发崩溃。 最后,参考引用[2]和[4],用户可能需要查阅项目文档或社区讨论,寻找类似问题的解决方案。例如,GitHub的issue页面可能有其他开发者遇到并解决了相同的问题。 总结可能的解决步骤: 1. 检查配置文件的路径和权限。 2. 验证配置文件内容是否符合格式要求。 3. 使用调试工具分析核心,定位错误原因。 4. 确保依赖库版本正确。 5. 参考社区资源和文档,寻求进一步的帮助。</think>针对VINS-Fusion的`parameters.cpp`第71行断点命中及核心已转问题,以下是分步解决方案: --- ### **问题分析** 核心已转通常由**内存访问越界、空指针解引用、文件读取失败**等引起。结合`parameters.cpp`的功能(参数解析),可能原因包括: 1. **配置文件路径错误**:未正确指定YAML文件路径,导致文件读取失败[^1][^4]。 2. **参数格式错误**:YAML文件内容与代码预期格式不匹配(如类型错误、字段缺失)[^1]。 3. **依赖库兼容性问题**:YAML-CPP等库版本不兼容导致解析异常[^2]。 4. **多线程竞争**:参数初始化过程中资源竞争引发崩溃(较少见)。 --- ### **解决方案** #### **1. 验证配置文件路径与权限** - **检查运行命令**:确保启动命令中包含**正确的配置文件路径**,例如: ```bash roslaunch vins_estimator euroc.launch # 需确认euroc.launch中config_file参数指向正确路径 ``` - **检查文件权限**:确保YAML文件可读: ```bash chmod +r config/euroc_config.yaml ``` #### **2. 检查YAML文件内容** - **语法验证**:使用YAML在线校验工具(如[yamllint](https://yamllint.com/))检查配置文件格式。 - **关键字段检查**:确认以下字段存在且类型正确: ```yaml # 示例:相机内参字段 camera intrinsics: [458.654, 457.296, 367.215, 248.375] # 必须为4个浮点数 ``` #### **3. 调试核心文件** - **使用GDB定位崩溃点**: ```bash gdb ./vins_estimator core # 加载程序与核心文件 (gdb) bt # 查看崩溃的堆栈跟踪 ``` - **重点关注line 71**:若崩溃发生在如`camodocal::CameraFactory::generateCameraFromYamlFile()`,则需检查相机模型初始化逻辑。 #### **4. 检查依赖库版本** - **YAML-CPP版本**:VINS-Fusion依赖`yaml-cpp>=0.5.3`,若版本过低可能导致解析失败: ```bash sudo apt-get install libyaml-cpp-dev # Ubuntu安装最新版 ``` #### **5. 其他优化措施** - **启用ROS调试输出**: ```bash rosrun vins_estimator vins_estimator _config_file:=$(pwd)/config/euroc_config.yaml _output_path:=$(pwd)/output/ --log-level=debug ``` - **更新代码与依赖**: ```bash git pull origin master # 同步最新代码 catkin clean && catkin build # 重新编译 ``` --- ### **关键代码段示例** 若`parameters.cpp`第71行为**相机参数加载**,需确保YAML文件包含以下字段: ```cpp // parameters.cpp 示例代码 camodocal::CameraPtr camera = camodocal::CameraFactory::instance()->generateCameraFromYamlFile(config_file); ``` 对应的YAML文件需包含相机模型参数: ```yaml camera_model: PINHOLE # 必须与代码支持的模型一致 intrinsics: [fx, fy, cx, cy] distortion_coeffs: [k1, k2, p1, p2] ``` --- ### **相关问题** 1. VINS-Fusion如何实现多传感器数据同步? 2. 如何为VINS-Fusion添加新的传感器类型? 3. 如何优化VINS-Fusion在嵌入式设备上的性能? --- 通过以上步骤,可系统性定位并解决参数解析导致的崩溃问题。若仍无法解决,建议提交Issue至项目仓库[^2]并提供调试日志。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值