vins-fusion环境配置、安装与测试

本文主要介绍如何搭建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节,段错误在 第七部分

一、安装OpenCV-3.4.11

1.1 配置依赖环境

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

1.2 下载OpenCV-3.4.11

下载地址:https://opencv.org/releases/
点击 Sources 下载自己需要的版本
在这里插入图片描述

1.3 将压缩包复制到Ubuntu的主目录下

在浏览器下载压缩包,将压缩包复制到Ubunt系统的主目录下
在这里插入图片描述

1.4 解压压缩包

键入Ctrl+Alt+T ,打开终端,在命令行输入unzip opencv-3.4.11
在这里插入图片描述

1.5 更改工作路径并创建build文件

运行命令:

cd opencv-3.4.11
mkdir build
cd build

1.6 cmake

运行命令:

sudo cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

在这里插入图片描述

1.7 使用make编译

运行命令:sudo make -j4
可以使用sudo make -j8sudo make -j4sudo make
注:单线程编译:sudo make ,这会等待比较长的时间,如果你想更快编译完,可以使用命令:sudo make -j4sudo make -j8 ,而 -j4 表示使用 4 个线程进行编译,而 -j8 表示使用 8 个线程进行编译。
在这里插入图片描述

1.8 进行安装

运行命令:sudo make install
在这里插入图片描述

1.9 完成配置

  • 1.用gedit打开/etc/ld.so.conf

  • 2.在文件中加上一行include /usr/local/lib
    其中/usr/local/libOpenCV 安装路径也就是 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

在这里插入图片描述

  • 6.保存并退出,然后执行如下命令使得配置生效:
source /etc/bash.bashrc

在这里插入图片描述

  • 7.更新一下:
sudo updatedb

在这里插入图片描述

  • 这个时候发现找不到命令,因为我这个Ubuntu系统刚装好,上面什么都没有

  • 执行命令:

sudo su
apt-get install mlocate

在这里插入图片描述

  • 现在更新一下
    在这里插入图片描述

1.10 检查

接下来查看 OpenCV 的版本信息是否匹配:

pkg-config --modversion opencv

在这里插入图片描述

1.11 安装ros与opencv的桥接工具包

sudo apt-get install ros-noetic-cv-bridge ros-noetic-tf ros-noetic-message-filters ros-noetic-image-transport

在这里插入图片描述

到这里就完成了OpenCV的安装

二、安装eigen3

下面是两种安装方式,二选一即可

2.1 终端apt命令安装

sudo apt-get install libeigen3-dev

在这里插入图片描述

Eigen 只包含头文件,因此它不需要实现编译,只需要引入头文件即可编译项目。
Eigen 头文件的默认安装位置是:/usr/local/include/eigen3;在很多程序中 include 时经常使用 #include <Eigen/Dense> 而不是使用 #include <eigen3/Eigen/Dense>所以要做下处理:

sudo cp -r /usr/local/include/eigen3/Eigen /usr/local/include

2.2 源码编译安装

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 的安装

三、安装ceres-solver库

1.在 ceres-solverGit 上下载需要的版本,我用 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

在这里插入图片描述
在这里插入图片描述
到这里就完成了 ceres-solver 的安装

四、下载VINS-FUSION的代码库

4.1 下载编译

下载,先在可视化界面的主目录下创一个vins-fusion的文件夹,再在这个文件夹内部创建一个src文件,然后执行下面两条命令:

cd ~/vins-fusion/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git

在这里插入图片描述

返回上一级目录,执行catkin_make

cd ../
catkin_make

在这里插入图片描述

编译这一步会遇到大量的错误,要耐心地一步一步解决。

4.2 解决错误

编译过程中遇到大量错误,但是好多都是同一个错误,只需要逐个解决就行了。
在这里插入图片描述

  • 1.首先,ROS noetic 版本中自带的 OpenCV4VINS-mono 中需要使用的 OpenCV3 冲突的问题。修改vins-mono代码兼容 opencv4。其实主要修改的是 camera_model 这个包,直接包含缺失的头文件即可。
//在camera_model包中的头文件Chessboard.h中添加
#include <opencv2/imgproc/types_c.h>
#include <opencv2/calib3d/calib3d_c.h>
//在CameraCalibration.h中添加
#include <opencv2/imgproc/types_c.h>
#include <opencv2/imgproc/imgproc_c.h>

在这里插入图片描述在这里插入图片描述

  • 2.报如下错误:
/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_fusioncamera_modelsloop_fusionvins_estimator 文件下的 CMakeLists ,如下图所示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3.编译时,遇到如下错误:
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 <opencv2/highgui.hpp>
#include <opencv2/cvconfig.h>
#include <opencv2/imgproc/types_c.h>

在这里插入图片描述

  • 4.编译时遇到报错
error: ‘CV_FONT_HERSHEY_SIMPLEX’ was not declared in this scope

在这里插入图片描述

解决方法 :将报错文件上的 CV_FONT_HERSHEY_SIMPLEX 参数改为 cv::FONT_HERSHEY_SIMPLEX;由报错信息可知,这里主要是pose_graph.cppkeyframe.cpp这两个文件需要修改;最好使用文本编辑的 查找和替换 完成,以免遗漏

在这里插入图片描述
在这里插入图片描述

  • 5.报如下错误:
error: ‘CV_RGB2GRAY’ was not declared in this scope
   53 |       cv::cvtColor(image, aux, CV_RGB2GRAY);
      |                                ^~~~~~~~~~~

在这里插入图片描述

解决方案:在报错头文件里添加

#include <opencv2/imgproc/types_c.h>

在这里插入图片描述

  • 6.报如下错误:
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.cppKITTIOdomTest.cpp

在这里插入图片描述
在这里插入图片描述

4.3 完成编译安装

cd ~/vins-fusion
catkin_make

在这里插入图片描述

五、添加到bash配置文件

执行命令:

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
段错误(核心已转储)

第四条跑起来没有任何结果

在这里插入图片描述
这里由于 noeticopencv4 头文件和参数名与 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的全部内容。

可以在浏览器里面打开 CSDNmarkdown编辑器 ,输入 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

八、运行VINS

8.1 Monocualr camera + 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

在这里插入图片描述
在这里插入图片描述

实现效果:
在这里插入图片描述

完整流程:

vins-fusion 上跑单目+imu数据集

8.2 Stereo cameras + 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数据集

8.3 Stereo cameras

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

猜你喜欢

转载自blog.csdn.net/qq_52068373/article/details/127871743
今日推荐