VINS-mono的编译与运行

简介:VINS-mono是香港科技大学一个计算机视觉实验室的科研结果,是要是基于单目视觉惯性里程计的一个slam系统,整个项目都是内嵌于ros。非常感谢这群勤劳刻苦创新的研究者开源了这个项目。

在此我记录下我自己的编译运行过程中遇到的问题,前前后后也花了一些时间才能编译并成功运行。

我的计算机环境:Ubuntu14.04
1.首先看到了他们项目的说明文档,需要安装ros,根据自己的Ubuntu版本,我需要安装indigo(其他更高版本的Ubuntu可能就是安装kinetic),然后上ros的官网:添加链接描述,看看具体如何安装。整个过程直到安装才出现问题,应该是几个依赖包一直没安装上,所以ros-indigo-desktop-full安装不成功,然后自己边百度问题边捣鼓,甚至用到aptitude命令安装依赖项,也没有成功,后来可能看到这篇博客:添加链接描述,里面有一个小说明,重复执行第三步(即重复update更新和安装依赖项),最后解决了。后面就按ros官网上的步骤去初始化等,最后成功安装ros。
2.然后是创建ros工作空间catkin_ws
(1)mkdir -p ~/catkin_ws/src # 创建这样一个目录文件夹,最终位置在/home/catkin_ws/src

(2)cd ~/catkin_ws/src # 进入/src文件夹里
(3)catkin_init_workspace # src里就会有个CMakeLists.txt文件
3.然后按项目的说明文档用git命令把项目下载到/src目录里
4.安装其他库ceres等(当时看slam十四讲的时候就装过了)
5.返回/catkin_ws目录,在此目录下编译项目catkin_make。
编译结果:时间虽然有点久但是成功了,但有几个警告:
/usr/bin/ld: warning: libopencv_features2d.so.3.4, needed by /usr/local/lib/libopencv_sfm.so.3.4.0, may conflict with libopencv_features2d.so.2.4
警告都是opencv库的冲突问题,我也没太在意,警告而已,开始下数据集,运行。结果果然出问题:
Bad argument (Invalid pointer to file storage) in cvGetFileNodeByName, file /build/opencv-_msWgW/opencv-2.4.8+dfsg1/modules/core/src/persistence.cpp, line 740
terminate called after throwing an instance of ‘cv::Exception’
what(): /build/opencv-_msWgW/opencv-2.4.8+dfsg1/modules/core/src/persistence.cpp:740: error: (-5) Invalid pointer to file storage in function cvGetFileNodeByName
然后首先想到该项目的issue,查看了一下,发现也有小伙伴遇到这个问题,是因为ros本身自带了opencv2.4.8,然后我自己原来安装了opencv3.4.0,两者冲突了,另外还有说是因为cv3要转到cv2需要cv_bridge去连接,连接出了问题(可能是版本低了)。然后疯狂百度但是总共有两种方法:一是修改CMakeLists.txt文件中的:
find_package(OpenCV REQUIRED)
改为:
find_package(OpenCV 2.4.8 REQUIRED)
或者改为:
set(OpenCV_DIR /usr/lib/x86_64-linux-gnu/pkgconfig)
find_package(OpenCV REQUIRED)
项目里所有的CMakeLists.txt凡是有这句都改了。
方法二:下载最新的cv_bridge和image_pipeline放到/catkin_ws/src/目录下(和项目文件在同一级目录)。下载地址:添加链接描述,只需要cv_bridge,另外image_pipeline下载地址为:添加链接描述,只需要image_pipeline。
总结:上面的方法一浪费我大量时间,因为一修改又重新编译,需要很久时间,而且还不成功,各种修改文件,包括修改涉及环境变量的文件(/etc/profile、~/.bashrc、/etc/bash.bashrc等)。还有说卸载opencv3.4.0,不过我不想这样,opencv3.4.0以后还要用呢,又不是仅仅为了这个项目存在。
最后成功的是方法二,但是在方法二之前,我把环境变量设置了一下,把原来用opencv3.4.0,改成了用opencv2.4.8
sudo gedit /etc/profile

# set opencv-3.4.0 enviroment
#export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
#export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

# set opencv2.4.8 enviroment
export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

source /etc/profile

测试一下当前系统生效的版本:

diangong@diangong-Lenovo-Product:~$ pkg-config --modversion opencv
2.4.8

完成这项工作后,开始编译,编译没有了原来的警告,打开三个终端运行,成功。

我也看到一篇博客:添加链接描述,有点类似方法二,但他要卸载旧版的cv_bridge,讲实话我不敢随意卸载,怕又要重新安装ros,有时间可以试一下。
VINS-mono的编译与运行_第1张图片
我发现一个问题,在安装ros时候会设置ros环境变量,它的环境变量是添加到:/home/.bashrc里面(.bashrc文件一般不可见,可以设置显示隐藏文件就可以看到来),如果我把这句设置环境变量的代码:

source /opt/ros/indigo/setup.bash

放到/etc/profile文件中,原来的用“#”号注释,当使用命令:

rosbag play /home/diangong/下载/MH_01_easy.bag

会提示:rosbag: commond not find,然后我又做死的改回来到原来的环境变量,又可以用了。

你可能感兴趣的:(视觉SLAM)