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

平台: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”可以查看崩溃的程序位置:

VINS-Fusion运行时的段错误(核心已转储)解决方法_第1张图片

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

此处gdb在ROS下调试具体可参看: https://blog.csdn.net/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才可以

VINS-Fusion运行时的段错误(核心已转储)解决方法_第2张图片

VINS-Fusion运行时的段错误(核心已转储)解决方法_第3张图片

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

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

VINS-Fusion运行时的段错误(核心已转储)解决方法_第4张图片 (图自网络)
这表示版本是3.3.4。我的版本是“3.2.92”,抱着试试的态度,决定对eigen3的库版本进行修改。此处可参看: https://blog.csdn.net/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.csdn.net/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产影响)。正常运行后的图如下所示:

你可能感兴趣的:(SLAM)