0%

GVINS程序部署

1 简介

最近在看GNSS/Vision/IMU组合导航的相关内容,其中GVINS是一个跳不过的项目,而且经过一番调研之后发现,目前开源的GNSS/Vision/IMU紧组合系统似乎还只有GVINS这一家,所以想要对这个项目进行学习,并在此基础上做一些改进。由于GVINS是基于ROS Kinetic开发的,而我的电脑安装的是ROS Noetic,安装过程中存在一些兼容性问题,在此记录一下。

2 安装问题记录

进入GVINS项目之后先将项目下载下来,如果基于ROS Noetic一点不改直接编译的话肯定是会报错的,接下来对遇到的问题进行记录。

ROS版本查询方式:

1
2
❯ echo $ROS_DISTRO
noetic

2.1 问题一:ROS版本适配

该部分内容参考该文章

2.1.1 C++编译版本

GVINS采用的Ceres是1.12.0版本的,是用C++11编译的,而Ceres2.0.0以上版本是用C++14编译的,所以需要将GVINS中所有CMakeLists.txt改为C++14编译:

1
set(CMAKE_CXX_FLAGS "-std=c++14")

2.1.2 适配OpenCV4

ROS noetic版本中的OpenCV4.2与GVINS中需要使用的OpenCV3冲突,所以需要修改GVINS代码兼容openCV4:

  1. 在头文件GVINS/camera_model/include/camodocal/chessboard/Chessboard.h中添加:

    1
    2
    #include <opencv2/imgproc/types_c.h>
    #include <opencv2/calib3d/calib3d_c.h>
  2. 在头文件GVINS/camera_model/include/camodocal/calib/CameraCalibration.h中添加:

    1
    2
    #include <opencv2/imgproc/types_c.h>
    #include <opencv2/imgproc/imgproc_c.h>

2.2 问题二:em

在处理上个问题之后,编译过程出现报错:

1
2
import em
ModuleNotFoundError: No module named ‘em’

第一次遇到这个问题之后,尝试直接安装em:

1
pip install empy

重新编译时,继续报错:

1
AttributeError:module ‘em‘ has no attribute ‘RAW_OPT‘

查询之后发现是empy版本不匹配,在4.0版本上可能会出现这个错误(参考链接)。相对应的解决方案就是卸载当前版本、安装4.0以下的版本:

1
2
pip uninstall empy
pip install empy==3.3.4

然后重新编译这部分就没有问题了。

2.3 问题三:shared_mutex

解决上个问题后出现了新的报错:

1
error: ‘shared_mutex’ in namespace ‘std’ does not name a type

该问题的解决方案参考该文章,解决方法为修改下面的文件:

1
vi /usr/include/log4cxx/boost-std-configuration.h

修改之前的代码:

1
2
#define STD_SHARED_MUTEX_FOUND 1
#define Boost_SHARED_MUTEX_FOUND 0

修改之后的代码:

1
2
#define STD_SHARED_MUTEX_FOUND 0
#define Boost_SHARED_MUTEX_FOUND 1

然后,问题就解决了(很神奇)…

3 VINS-Fusion安装过程记录

由于GVINSVINS-Fusion这两个工程极其相似,遇到的问题也是大同小异,所以就在一起记录了。此处主要参考该文章

首先还是要对C++版本进行修改,将-std=c++11修改为-std=c++14,此处不再赘述,可参考2.1.1小节。

然后还是适配OpenCV4的问题:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1.camera_model 头文件中 Chessboard.h添加
#include <opencv2/imgproc/types_c.h>
#include <opencv2/calib3d/balib3d_c.h>

2.CameraCalibration.h添加
#include <opencv2/imgproc/types_c.h>
#include <opencv2/imgproc/imgproc_c.h>

3.loop_fusion/src/VRIEF.h添加
#include <opencv2/imgproc/types_c.h>

4.loop_fusion/src/pose_graph.cpp
* 修改 CV_FONT_HERSHEY_SIMPLEX -> cv::FONT_HERSHEY_SIMPLEX

5. vins_estimator/src/feature_tracker.h 添加
#include <opencv2/highgui.hpp>
#include <opencv2/cvconfig.h> // 该头文件我在自己的库文件中没找到,所以就将该句注释掉了,不影响后续编译。
#include <opencv2/imgproc/types_c.h>

6. vins_estimator/src/KITTIOdomTest.cpp KITTIGPSTest.cpp
* 修改 CV_LOAD_IMAGE_GRAYSCALE -> cv::IMREAD_GRAYSCALE

最后,在编译过程中由于OpenCV版本问题,还会出现一些小错误,如:

1
error: ‘CV_GRAY2BGR’ was not declared in this scope

可以将其修改为:cv::COLOR_GRAY2BGR。其他类似情况不再赘述。