一、前言
由于 Jetson 系列的开发板 CPU 性能不是很好,因此在处理图像数据时往往需要 GPU 加速,而 VINS-Fusion 是针对同步定位与建图(SLAM)问题中十分出色的视觉算法,但是其在图像处理过程中资源消耗较大,仅仅依靠 Jetson 开发板的 CPU 往往很难实现事实效果。
本文在此背景下介绍如何配置带有 GPU 加速的 VINS-Fusion,主要参考以下文献
https://github.com/pjrambo/VINS-Fusion-gpu
Ubuntu 20.04 配置 VINS-Fusion-gpu + OpenCV 4.6.0-CSDN博客
并且需要一些必要的准备工作,如 CUDA 的安装,带有 GPU 加速的 OpenCV 的安装,cv_bridge 功能包的安装,这些工作在上一期内容中已经介绍,详见
Jetson Orin NX 开发指南(5): 安装 OpenCV 4.6.0 并配置 CUDA 以支持 GPU 加速-CSDN博客
接下来我们开始介绍如何在 Jetson Orin NX 开发板上运行 VINS-Fusion-gpu
二、编译安装 ceres-solver-1.14.0
首先安装依赖
sudo apt-get install liblapack-dev libsuitesparse-dev libgflags-dev libgoogle-glog-dev libgtest-dev libcxsparse3 -y
然后将安装包下载在 ~/Documents/ 目录下并解压
wget ceres-solver.org/ceres-solver-1.14.0.tar.gz
tar -zxvf ceres-solver-1.14.0.tar.gz
进入 ceres-solver-1.14.0 文件夹
cd ~/Documents/ceres-solver-1.14.0
创建 build 并编译生成 Makefile 文件
mkdir build & cd build
cmake ..
最终编译并安装 ceres-solver-1.14.0
sudo make install -j8
最终结果如下
至此,ceres-solver-1.14.0 就编译安装完成了!
三、编译 VINS-Fusion-gpu
首先创建 VINS-Fusion-gpu 工作空间,
mkdir -p ~/catkin_ws/src/vinsgpu/src/
cd ~/catkin_ws/src/vinsgpu/src/
然后从 Github 上下载 VINS-Fusion-gpu 源码
git clone https://github.com/pjrambo/VINS-Fusion-gpu.git
下载完成后进入 VINS-Fusion-gpu 文件夹
(1)修改 vins_estimator/CMakeLists.txt 文件
注释一行
#include(/home/dji/opencv/build/OpenCVConfig.cmake)
设置 OpenCV 路径为带有 GPU 加速的 opencv 4.6.0 (安装方式见上一期内容)
set(OpenCV_DIR "~/Documents/opencv-4.6.0/build")
(2)修改 loop_fusion/CMakeLists.txt 文件
注释一行
#include(/home/dji/opencv/build/OpenCVConfig.cmake)
设置 OpenCV 路径为带有 GPU 加速的 opencv 4.6.0 (安装方式见上一期内容)
set(OpenCV_DIR "~/Documents/opencv-4.6.0/build")
保存并退出,最后进入 VINS-Fusion-gpu 文件夹
cd ~/catkin_ws/src/vinsgpu/
接下来开始编译,终端输入
catkin_make
出现报错
错误内容举例:
(1)编译报错 error: 'CV_FONT_HERSHEY_SIMPLEX' was not declared in this scope
(2)编译报错 error: 'CV_LOAD_IMAGE_GRAYSCALE' was not declared in this scope
(3)编译报错 error: 'CV_BGR2GRAY' was not declared in this scope
解决办法:
进入 VINS-Fusion-gpu 文件夹下
cd ~/catkin_ws/src/vinsgpu/src/VINS-Fusion-gpu
然后输入以下内容
sed -i 's/CV_FONT_HERSHEY_SIMPLEX/cv::FONT_HERSHEY_SIMPLEX/g' `grep CV_FONT_HERSHEY_SIMPLEX -rl ./`
sed -i 's/CV_LOAD_IMAGE_GRAYSCALE/cv::IMREAD_GRAYSCALE/g' `grep CV_LOAD_IMAGE_GRAYSCALE -rl ./`
sed -i 's/CV_BGR2GRAY/cv::COLOR_BGR2GRAY/g' `grep CV_BGR2GRAY -rl ./`
sed -i 's/CV_RGB2GRAY/cv::COLOR_RGB2GRAY/g' `grep CV_RGB2GRAY -rl ./`
sed -i 's/CV_GRAY2RGB/cv::COLOR_GRAY2RGB/g' `grep CV_GRAY2RGB -rl ./`
sed -i 's/CV_GRAY2BGR/cv::COLOR_GRAY2BGR/g' `grep CV_GRAY2BGR -rl ./`
sed -i 's/CV_CALIB_CB_ADAPTIVE_THRESH/cv::CALIB_CB_ADAPTIVE_THRESH/g' `grep CV_CALIB_CB_ADAPTIVE_THRESH -rl ./`
sed -i 's/CV_CALIB_CB_NORMALIZE_IMAGE/cv::CALIB_CB_NORMALIZE_IMAGE/g' `grep CV_CALIB_CB_NORMALIZE_IMAGE -rl ./`
sed -i 's/CV_CALIB_CB_FILTER_QUADS/cv::CALIB_CB_FILTER_QUADS/g' `grep CV_CALIB_CB_FILTER_QUADS -rl ./`
sed -i 's/CV_CALIB_CB_FAST_CHECK/cv::CALIB_CB_FAST_CHECK/g' `grep CV_CALIB_CB_FAST_CHECK -rl ./`
sed -i 's/CV_ADAPTIVE_THRESH_MEAN_C/cv::ADAPTIVE_THRESH_MEAN_C/g' `grep CV_ADAPTIVE_THRESH_MEAN_C -rl ./`
sed -i 's/CV_THRESH_BINARY/cv::THRESH_BINARY/g' `grep CV_THRESH_BINARY -rl ./`
sed -i 's/CV_SHAPE_CROSS/cv::MORPH_CROSS/g' `grep CV_SHAPE_CROSS -rl ./`
sed -i 's/CV_SHAPE_RECT/cv::MORPH_RECT/g' `grep CV_SHAPE_RECT -rl ./`
sed -i 's/CV_TERMCRIT_EPS/cv::TermCriteria::EPS/g' `grep CV_TERMCRIT_EPS -rl ./`
sed -i 's/CV_TERMCRIT_ITER/cv::TermCriteria::MAX_ITER/g' `grep CV_TERMCRIT_ITER -rl ./`
sed -i 's/CV_RETR_CCOMP/cv::RETR_CCOMP/g' `grep CV_RETR_CCOMP -rl ./`
sed -i 's/CV_CHAIN_APPROX_SIMPLE/cv::CHAIN_APPROX_SIMPLE/g' `grep CV_CHAIN_APPROX_SIMPLE -rl ./`
sed -i 's/CV_AA/cv::LINE_AA/g' `grep CV_AA -rl ./`
sed -i 's/CV_LOAD_IMAGE_UNCHANGED/cv::IMREAD_UNCHANGED/g' `grep CV_LOAD_IMAGE_UNCHANGED -rl ./`
sed -i 's/CV_MINMAX/cv::NORM_MINMAX/g' `grep CV_MINMAX -rl ./`
具体过程如下
其原理解释详见
Docker 制作各 ROS 版本 VINS-Fusion 镜像_docker ros 镜像_想要个小姑娘的博客-CSDN博客
简要总结:
VINS-Fusion-gpu 是在 Ubuntu 18.04 环境下写的,其对应的 ROS 版本为 melodic,对应的 OpenCV 是 3.2.0,
而 Jetson Orin NX 对应的是 Ubuntu 20.04,其对应的 ROS 版本为 noetic,对应的 OpenCV 版本为 4.2.0,
报错的关键原因就是 OpenCV 4 系列和 OpenCV 3 系列有一些变量的名称发生了改变,因此我们这里只要将相应的变量名称进行修正,就能顺利通过编译!(OpenCV 4.6.0 和 OpenCV 4.2.0 差别不大)
上面的语句通过 sed 命令和 grep 正则表达式的方式一键修改所有变量名称!
修改完成后进入工作空间,并编译
cd ~/catkin_ws/src/vinsgpu/
catkin_make
最终显示如下结果
这表明 VINS-Fusion-gpu 通过编译!