环境:ubuntu16
vinsfusion源码:
https://github.com/HKUST-Aerial-Robotics/VINS-Fusion
一、BUG
报错中指出 Assertion "!px=0" failed。仔细阅读内容发现是一个 share_ptr(智能指针出现错误),这个指针指向的类型是Cmera类。到这里只想说好家伙,不给具体出错文件的位置,得要我一个一个文件找,这个visnfusion的作者能不能上传一个没有错误的源码啊,心累。
debug过程我在第二部分讲,最终的解决方案我放在第三部分(不想听我啰嗦的,直接看第三部分就可)
二、debug过程
camera类是定义在camera.h文件中,命名了两个指针指向camera类:
翻阅每个文件找到最初的指针初始化位置。结果是在feature_tracker.h头文件中定义了一个装cameraptr指针的容器,在feature_tracker.cpp文件中readparameters函数中中对指针做了初始化赋值,通过输出调试发现这哥函数并没有出错
既然不是智能指针初始化出错,那就不好办了,所以我就用最笨的方法去定位出错的代码行,最终找到程序终止的地方 camera类中的liftprojective函数,我这里是用的鱼眼相机所以执行的是catacamera中的liftprojective函数。
但是发现这个cam指针根本无法执行liftproject函数,所以还是指针的赋值问题,那么找到这里的cam究竟赋值成了什么。然后发现指针赋值的时候,有一个配置文件无法读取,返回一个空指针。
那么找到配置文件是如何读取的,最终发现它的文件路径包含了两个文件,一个是配置文件和相机标定文件,这样肯定不行,怎么可能打开两个文件的,然后发现他是要打开相机的标定文件,因为配置文件已经读取成功了。
三、解决方案
对parameter.cpp文件中的157行和165行的文件路径做修改,这个文件路径只需要相机的标定文件,他这里不知道咋回事把配置文件合在一起,读取的时候又不分开。
去掉congfigpath和/,只留下cam0calib
std::string cam0Path=cam0Calib;
std::string cam1Path=cam1Calib;
然后就可以成功运行了!