本文主要介绍如何搭建vins-fusion的运行环境,以及解决vins-fusion编译运行时遇到的环境冲突问题,并在此基础上实现例程的运行。
本文是在已经安装好 ROS 的基础上,在 Ubuntu20.04 系统下,完成 vins-fusion 的环境搭建,主要涉及到 opencv3.4.11、ceres-solver2.0.0、eigen3 的安装,解决了 vins对ros自带的opencv4不兼容
、 ceres对c++的版本要求
、以及一些 常见编译错误
的问题,还解决了运行vins-fusion时出现 ==段错误(核心已转储)==的问题。
注意按照目录查找,解决编译问题在 4.2节,段错误在 第七部分
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install pkg-config
下载地址:https://opencv.org/releases/
点击 Sources 下载自己需要的版本
键入Ctrl+Alt+T
,打开终端,在命令行输入unzip opencv-3.4.11
运行命令:
cd opencv-3.4.11
mkdir build
cd build
运行命令:
sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
运行命令:sudo make -j4
可以使用sudo make -j8
、sudo make -j4
、sudo make
注:单线程编译:sudo make
,这会等待比较长的时间,如果你想更快编译完,可以使用命令:sudo make -j4
或 sudo make -j8
,而 -j4
表示使用 4 个线程进行编译,而 -j8
表示使用 8 个线程进行编译。
1.用gedit
打开/etc/ld.so.conf
2.在文件中加上一行include /usr/local/lib
其中/usr/local/lib
是 OpenCV 安装路径也就是 makefile 中指定的安装路径
运行命令:sudo gedit /etc/ld.so.conf
3.修改完成后点击右上角的保存,保存后会看到之前的警告信息,这是正常情况。
4.更新系统共享链接库: sudo ldconfig
;
5.配置bash,修改 bash.bashrc 文件:
sudo gedit /etc/bash.bashrc
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
source /etc/bash.bashrc
sudo updatedb
这个时候发现找不到命令,因为我这个Ubuntu系统刚装好,上面什么都没有
执行命令:
sudo su
apt-get install mlocate
接下来查看 OpenCV 的版本信息是否匹配:
pkg-config --modversion opencv
sudo apt-get install ros-noetic-cv-bridge ros-noetic-tf ros-noetic-message-filters ros-noetic-image-transport
到这里就完成了OpenCV的安装
下面是两种安装方式,二选一即可
sudo apt-get install libeigen3-dev
Eigen 只包含头文件,因此它不需要实现编译,只需要引入头文件即可编译项目。
Eigen 头文件的默认安装位置是:/usr/local/include/eigen3
;在很多程序中 include 时经常使用 #include
而不是使用 #include
所以要做下处理:
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include
1、移动到指定目录下:
git clone https://github.com/eigenteam/eigen-git-mirror
这里由于网络不好下了5、6次
2、安装,执行下面的命令:
cd eigen-git-mirror
mkdir build
cd build
cmake ..
3、执行命令:
sudo make install
4、安装后,头文件安装在/usr/local/include/eigen3/
,需要执行下面的命令移动头文件
sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include
到这里就完成了 eigen3
的安装
1.在 ceres-solver 的 Git 上下载需要的版本,我用 2.0.0
链接:https://github.com/ceres-solver/ceres-solver/releases/tag/2.0.0
2.解压后移动到主目录下
3.安装相关依赖
sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev
检查一下
4.解压并创建build
cd ceres-solver-2.0.0
mkdir build
cd build
cmake ..
make -j4
5.安装
sudo make install
下载,先在可视化界面的主目录下创一个vins-fusion的文件夹,再在这个文件夹内部创建一个src文件,然后执行下面两条命令:
cd ~/vins-fusion/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
返回上一级目录,执行
catkin_make
cd ../
catkin_make
编译这一步会遇到大量的错误,要耐心地一步一步解决。
编译过程中遇到大量错误,但是好多都是同一个错误,只需要逐个解决就行了。
//在camera_model包中的头文件Chessboard.h中添加
#include
#include
//在CameraCalibration.h中添加
#include
#include
/usr/local/include/ceres/internal/integer_sequence_algorithm.h:64:21: error: ‘integer_sequence’ is not a member of ‘std’
64 | struct SumImpl<std::integer_sequence<T, N, Ns...>> {
| ^~~~~~~~~~~~~~~~
在报错的项目的 CMakeList 里的
set(CMAKE_CXX_FLAGS “-std=c++11”)
改成
set(CMAKE_CXX_STANDARD 14)
这里需要修改 global_fusion
、camera_models
、loop_fusion
、vins_estimator
文件下的 CMakeLists ,如下图所示:
make[2]: *** [VINS-Fusion/vins_estimator/CMakeFiles/vins_lib.dir/build.make:258:VINS-Fusion/vins_estimator/CMakeFiles/vins_lib.dir/src/featureTracker/feature_tracker.cpp.o] 错误 1
make[2]: *** 正在等待未完成的任务....
在 vins_estimator/src/feature_tracker.h
添加
#include
#include
#include
error: ‘CV_FONT_HERSHEY_SIMPLEX’ was not declared in this scope
解决方法 :将报错文件上的 CV_FONT_HERSHEY_SIMPLEX
参数改为 cv::FONT_HERSHEY_SIMPLEX
;由报错信息可知,这里主要是pose_graph.cpp
、keyframe.cpp
这两个文件需要修改;最好使用文本编辑的 查找和替换
完成,以免遗漏
error: ‘CV_RGB2GRAY’ was not declared in this scope
53 | cv::cvtColor(image, aux, CV_RGB2GRAY);
| ^~~~~~~~~~~
解决方案:在报错头文件里添加
#include
error: ‘CV_LOAD_IMAGE_GRAYSCALE’ was not declared in this scope
125 | imLeft = cv::imread(leftImagePath, CV_LOAD_IMAGE_GRAYSCALE );
| ^~~~~~~~~~~~~~~~~~~~~~~
这里是因为在 Opencv4 中,CV_LOAD_IMAGE_GRAYSCALE
找不到;需要将CV_LOAD_IMAGE_GRAYSCALE
改为 cv::IMREAD_GRAYSCALE
;由错误提示信息可知,这里需要修改的地方有 KITTIGPSTest.cpp
、KITTIOdomTest.cpp
cd ~/vins-fusion
catkin_make
执行命令:
source ~/vins-fusion/devel/setup.bash
sudo vi ~/.bashrc
最后一行加
source ~/vins-fusion/devel/setup.bash
按Esc
。输入 :wq!
,保存并退出
为了验证vins-fusion是否正确安装以及环境是否搭建完成,需要下载数据集来进行验证。这里建议大家可以事先下载好数据集,因为比较大会比较费时间,故而建议提前下好这样 VINS 安好后就可以立马验证编译运行了。
链接 :https://projects.asl.ethz.ch/datasets/doku.php?id=kmavvisualinertialdatasets#the_euroc_mav_dataset
我这里下载的是 MH_04_difficult.bag
将它放在主目录的 SLAM/test_data 下
我先用 单目+IMU 的方式跑数据集,命令如下
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/vins-fusion/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
rosrun loop_fusion loop_fusion_node ~/vins-fusion/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
rosbag play ~/SLAM/test_data/MH_04_difficult.bag
运行到第二条的时候报错:
[INFO][1669097501.814593790]: reading paramerter of camera /home/xwj/vins-fusion/src/VINS-Fusion/config/euroc/camo_mei.yaml
段错误(核心已转储)
第三条会报错:
cam calib path:/home/xwj/vins-fusion/src/VINS-Fusion/config/euroc/camo_mei.yaml
段错误(核心已转储)
第四条跑起来没有任何结果
这里由于 noetic 的 opencv4 头文件和参数名与 vins-fusion 所使用的 opencv3 不同造成的,需要使用非 ROS Noetic 自带 OPENCV 版本编译工程,通过修改 cv_bridge 配置文件来把 vins-fusion工程链接到 opencv3 库上
首先找到 cv_bridge 配置文件所在位置
cd /opt/ros/noetic/share/cv_bridge/cmake
sudo gedit cv_bridgeConfig.cmake
在94-96行,修改成如下内容
if(NOT "include;/usr/include;/usr/include/opencv " STREQUAL " ")
set(cv_bridge_INCLUDE_DIRS "")
set(_include_dirs "include;/usr/include;/usr/local/include/opencv")
之后将指定库文件也修改为自己安装的opencv库文件,需要对
set(libraries "cv_bridge;/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_dnn.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_features2d.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_flann.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_highgui.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_ml.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_objdetect.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_photo.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_stitching.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_video.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_videoio.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_aruco.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_bgsegm.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_bioinspired.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_ccalib.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_datasets.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_dnn_objdetect.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_dnn_superres.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_dpm.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_face.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_freetype.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_fuzzy.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_hdf.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_hfs.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_img_hash.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_line_descriptor.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_optflow.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_phase_unwrapping.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_plot.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_quality.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_reg.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_rgbd.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_saliency.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_shape.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_stereo.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_structured_light.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_superres.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_surface_matching.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_text.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_tracking.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_videostab.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_viz.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_ximgproc.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_xobjdetect.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_xphoto.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_core.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.4.2.0")
需要把"cv_bridge;…到 …")之间的内容换成自己的库文件,这里如果要一点一点的修改比较麻烦,可以使用 locate命令
来查看自己的库文件,输入Ctrl+Alt+T
打开新的一个终端,在命令行输入
locate opencv
向下滑动到 /usr/local/lib
开头的文件,复制/usr/local/lib/libopencv_calib3d.so
到 /usr/local/lib/libopencv_viz.so.3.4.11
的全部内容。
可以在浏览器里面打开 CSDN 的 markdown编辑器 ,输入 Ctrl+Shift+K
,在代码段里面粘贴刚刚复制的东西,然后在第一行全面加上 set(libraries "cv_bridge;
,在最后一行后面加上")
,然后再在每一行后面加上;
(注意是英文输入状态下),然后从第二行开始,将光标移动到一行的最前面,按一下 Backspace,把所有的换行符去掉 ,最终编辑完后所有的内容在CSDN的编辑器的预览模式下看起来应该是一行,像下面这样
然后把代码片里面的内容复制下来,将119行(主要是看内容,行数不一定准确,大致在附近)的内容替换掉
set(libraries "cv_bridge;usr/local/lib/libopencv_calib3d.so;/usr/local/lib/libopencv_calib3d.so.3.4;/usr/local/lib/libopencv_calib3d.so.3.4.11;/usr/local/lib/libopencv_core.so;/usr/local/lib/libopencv_core.so.3.4;/usr/local/lib/libopencv_core.so.3.4.11;/usr/local/lib/libopencv_dnn.so;/usr/local/lib/libopencv_dnn.so.3.4;/usr/local/lib/libopencv_dnn.so.3.4.11;/usr/local/lib/libopencv_features2d.so;/usr/local/lib/libopencv_features2d.so.3.4;/usr/local/lib/libopencv_features2d.so.3.4.11;/usr/local/lib/libopencv_flann.so;/usr/local/lib/libopencv_flann.so.3.4;/usr/local/lib/libopencv_flann.so.3.4.11;/usr/local/lib/libopencv_highgui.so;/usr/local/lib/libopencv_highgui.so.3.4;/usr/local/lib/libopencv_highgui.so.3.4.11;/usr/local/lib/libopencv_imgcodecs.so;/usr/local/lib/libopencv_imgcodecs.so.3.4;/usr/local/lib/libopencv_imgcodecs.so.3.4.11;/usr/local/lib/libopencv_imgproc.so;/usr/local/lib/libopencv_imgproc.so.3.4;/usr/local/lib/libopencv_imgproc.so.3.4.11;/usr/local/lib/libopencv_ml.so;/usr/local/lib/libopencv_ml.so.3.4;/usr/local/lib/libopencv_ml.so.3.4.11;/usr/local/lib/libopencv_objdetect.so;/usr/local/lib/libopencv_objdetect.so.3.4;/usr/local/lib/libopencv_objdetect.so.3.4.11;/usr/local/lib/libopencv_photo.so;/usr/local/lib/libopencv_photo.so.3.4;/usr/local/lib/libopencv_photo.so.3.4.11;/usr/local/lib/libopencv_shape.so;/usr/local/lib/libopencv_shape.so.3.4;/usr/local/lib/libopencv_shape.so.3.4.11;/usr/local/lib/libopencv_stitching.so;/usr/local/lib/libopencv_stitching.so.3.4;/usr/local/lib/libopencv_stitching.so.3.4.11;/usr/local/lib/libopencv_superres.so;/usr/local/lib/libopencv_superres.so.3.4;/usr/local/lib/libopencv_superres.so.3.4.11;/usr/local/lib/libopencv_video.so;/usr/local/lib/libopencv_video.so.3.4;/usr/local/lib/libopencv_video.so.3.4.11;/usr/local/lib/libopencv_videoio.so;/usr/local/lib/libopencv_videoio.so.3.4;/usr/local/lib/libopencv_videoio.so.3.4.11;/usr/local/lib/libopencv_videostab.so;/usr/local/lib/libopencv_videostab.so.3.4;/usr/local/lib/libopencv_videostab.so.3.4.11;/usr/local/lib/libopencv_viz.so;/usr/local/lib/libopencv_viz.so.3.4;/usr/local/lib/libopencv_viz.so.3.4.11")
修改完后,切换路径
cd ~/vins-fusion
catkin_make
就可以正常运行 vins-fusion
了
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/vins-fusion/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
rosrun loop_fusion loop_fusion_node ~/vins-fusion/src/VINS-Fusion/config/euroc/euroc_mono_imu_config.yaml
rosbag play ~/SLAM/test_data/MH_04_difficult.bag
完整流程:
vins-fusion 上跑单目+imu数据集
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/vins-fusion/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml
rosbag play ~/SLAM/test_data/MH_04_difficult.bag
完整流程:
vins-fusion上跑双目+imu数据集
roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/vins-fusion/src/VINS-Fusion/config/euroc/euroc_stereo_config.yaml
rosbag play ~/SLAM/test_data/MH_04_difficult.bag
实现效果:
完整流程:
vins-fusion跑双目数据集
本文主要记录我在搭建vins-fusion环境时遇到的问题,以及如何去解决这些问题的方法和思路,由于本人也刚开始接触这方面的知识,对一些理论知识的认识和对为什么出现这些错误没有深入的思考。主要是对自己遇到的问题的总结,写出来是希望能够帮助到那些和我一样遇到相同问题的同学,在搭建环境时可以少浪费时间,不会像我花了几天才弄好,将更多的精力放在对相关知识的学习上。
本文主要借鉴了参考列表里面的两篇博客,本文仅用作学习总结以及为那些遇到相同问题的同学提供帮助。
希望能够帮助到各位读者,祝你们搭建环境顺利!欢迎各位读者提出本文存在的错误!谢谢!
参考列表:
1.ubuntu20.04安装eigen3.4.0(两种方式)和ceres-solver2.0.0
2.Ubuntu20.04运行Vins-fusion