x86_64架构的VINS-fusion-GPU部署

news2024/9/22 1:10:12

x86_64架构的VINS-fusion-GPU部署

1. 环境配置(Ubuntu 18.04

(0)CUDA 10.2 安装

由于笔记本的GPU太老(GeForce 840M),只能使用较低版本的 CUDA,但是也能有个好处就是能够同时兼顾 ARM 架构的 GPU 部署。

1.0.1 安装合适的新驱动

windows 系统中有驱动:

460.89-notebook-win8-win7-64bit-international-whql.exe
474.11-notebook-win8-win7-64bit-international-whql.exe
cuda_10.2.1_win10.exe
cuda_10.2.2_win10.exe
cuda_10.2.89_441.22_windows.exe
GeForce_Experience_v3.26.0.160_requires_win10.exe

以及和 pytorchpython 等对应的 CUDAcudnn-tools 等安装包。为了在 pytorch中使用 GPU 的安装包。

torchvision-0.9.1-py38_cu102.tar.bz2	# 0.9.1, 0.8.1 二种任选一
torchvision-0.8.1-py38_cu102.tar.bz2	# 0.9.1, 0.8.1 二种任选一
pytorch-1.8.0-py3.8_cuda10.2_cudnn7_0.tar.bz2	# py3.6, py3.8, py3.9 三种任选一
pytorch-1.8.0-py3.9_cuda10.2_cudnn7_0.tar.bz2	# py3.6, py3.8, py3.9 三种任选一
pytorch-1.8.0-py3.6_cuda10.2_cudnn7_0.tar.bz2	# py3.6, py3.8, py3.9 三种任选一

首先,安装 cuda-toolkit-10-2 工具包:

sudo apt-get update
sudo apt-get install cuda-toolkit-10-2

安装好之后,在 .bashrc中配置环境变量。source之后,nvcc -- version 即可查看cuda版本。

export PATH=/usr/local/cuda-10.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-10.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_ROOT=/usr/local/cuda

(1)Eigen 安装与配置

#  Remove pre-built Eigen

sudo apt-get remove libeigen3-dev 
cd ~/Downloads/
wget -O eigen-3.3.7.zip https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.zip #check version
unzip eigen-3.3.7.zip
mkdir eigen-build && cd eigen-build
cmake ../eigen-3.3.7/ && sudo make install
pkg-config --modversion eigen3 # Check Eigen Version

(2)Ceres solver 安装与配置

cd ~/Downloads/
sudo apt-get install -y cmake libgoogle-glog-dev libatlas-base-dev libsuitesparse-dev
wget http://ceres-solver.org/ceres-solver-1.14.0.tar.gz
tar zxf ceres-solver-1.14.0.tar.gz
mkdir ceres-bin
mkdir solver && cd ceres-bin
cmake ../ceres-solver-1.14.0 -DEXPORT_BUILD_DIR=ON -DCMAKE_INSTALL_PREFIX="../solver" 
 
  #good for build without being root privileged and at wanted directory
  
make -j3 # 6 : number of cores
make install
# 可如下进行测试:
bin/simple_bundle_adjuster ../ceres-solver-1.14.0/data/problem-16-22106-pre.txt # to check version

显示的输出结果为:
在这里插入图片描述

(3) OpenCV 安装与配置

关于 OpenCV 的安装需要特别谨慎,不建议频繁删除以前的库,因为多个项目使用的版本可能不同,所以可以将常用的版本安装在 /usr/local下,将其余版本安装在自己Download 或者 home 下。
如果需要删除原来的版本,执行以下命令:

# remove prebuilt opencv
sudo apt-get purge libopencv* python-opencv 
sudo apt-get update
sudo apt-get install -y build-essential pkg-config
 
## libeigen3-dev # recommend to build from source
 
sudo apt-get install -y cmake libavcodec-dev libavformat-dev libavutil-dev \
    libglew-dev libgtk2.0-dev libgtk-3-dev libjpeg-dev libpng-dev libpostproc-dev \
    libswscale-dev libtbb-dev libtiff5-dev libv4l-dev libxvidcore-dev \
    libx264-dev qt5-default zlib1g-dev libgl1 libglvnd-dev pkg-config \
    libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev mesa-utils     
 
sudo apt-get install python2.7-dev python3-dev python-numpy python3-numpy
# To fix OpenGL related compilation problems 
 
cd /usr/lib/aarch64-linux-gnu/
sudo ln -sf libGL.so.1.0.0 libGL.so
sudo vim /usr/local/cuda/include/cuda_gl_interop.h
 
# Comment (line #62~68) of cuda_gl_interop.h 
 
//#if defined(__arm__) || defined(__aarch64__)
//#ifndef GL_VERSION
//#error Please include the appropriate gl headers before including cuda_gl_interop.h
//#endif
//#else
 #include <GL/gl.h>
//#endif

安装新的版本(因为 VINS-FUSION-GPU 版本需要支持CUDAOpenCV,所以选择3.4.1 版本)

# Then once linking is done, go to Downloads to begin opencv installation
cd ~/Downloads/
wget -O opencv.zip https://github.com/opencv/opencv/archive/3.4.1.zip # check version
unzip opencv.zip
cd opencv-3.4.1/ && mkdir build && cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D WITH_CUDA=ON \
        -D CUDA_ARCH_BIN=6.2 \
        -D CUDA_ARCH_PTX="" \
        -D ENABLE_FAST_MATH=ON \
        -D CUDA_FAST_MATH=ON \
        -D WITH_CUBLAS=ON \
        -D WITH_LIBV4L=ON \
        -D WITH_GSTREAMER=ON \
        -D WITH_GSTREAMER_0_10=OFF \
        -D WITH_QT=ON \
        -D WITH_OPENGL=ON \
        -D CUDA_NVCC_FLAGS="--expt-relaxed-constexpr" \
        -D WITH_TBB=ON \
         ../
make  # running in single core is good to resolve the compilation issues         
sudo make install
cd ../../ && sudo rm -rf opencv-3.4.1 # optional (can save 10GB Disk Space)
pkg-config --modversion opencv # Check opencv Version

在这里插入图片描述
OpenCVJeston NX上的安装比较慢,差不多需要1个小时。OpenCV 安装好以后,需要进一步编译 cv_bridge ( cv_bridge 是在ROS 图像消息和 OpenCV 图像之间进行转换的一个功能包)。

(4)cv_bridge的编译 (ARM架构适用)

cv_bridge 的安装需要下载对应的版本,由于 Jeston NX 是基于 Ubuntu 18.04ARM 系统,因此下载 melodic 版本的 cv_bridge。首先,通过以下连接进入下载页面:

https://github.com/ros-perception/vision_opencv

在这里插入图片描述
选择下载 melodic 版本到 catkin_ws/src 目录下,并安装:

gedit vision_opencv/cv_bridge/CMakeLists.txt
# Edit OpenCV PATHS in CMakeLists and include cmake file
# /usr/local/share/OpenCV 选择自己安装的OpenCV对应路径
find_package(OpenCV 3 REQUIRED PATHS /usr/local/share/OpenCV NO_DEFAULT_PATH 
  COMPONENTS
    opencv_core
    opencv_imgproc
    opencv_imgcodecs
  CONFIG
)
include(/usr/local/share/OpenCV/OpenCVConfig.cmake)  #under catkin_python_setup()
# Save and close CMakeLists
#  Build the package
cd .. && catkin_make

(5) ROS 安装与配置

参考ros.org 网站自行安装。此处与教程(vins-fusion-gpu-tx2-nano)略有差异,我直接使用了ros内置的cv_bridge。因为涉及到源码安装opencvcv_bridgeConfig.cmakeinclude的地址要做修改,否则后续编译报错,可以参考这一篇文章。

3. VINS-Fusion-GPU 安装及编译

具体参数可看源文档 https://github.com/pjrambo/VINS-Fusion-gpu。
具体操作如下:

(1)下载和更改 cmake 文件

cd ~/catkin_ws/src && git clone https://github.com/pjrambo/VINS-Fusion-gpu #GPU
 
sudo apt-get install ros-melodic-tf
sudo apt-get install ros-melodic-image-transport
sudo apt-get install ros-melodic-rviz

下载完之后,需要更改vins_estimator/CMakeLists.txt第20行,把OpenCV路径改成自己的安装路径

# 
# Edit CMakeLists.txt for loop_fusion and vins_estimator
cd ~/catkin_ws/src/VINS-Fusion-gpu/loop_fusion && gedit CMakeLists.txt

需要更改的还有 loop_fusion/CMakeLists.txt,同样也需要更改路径

##For loop_fusion : line 19
#find_package(OpenCV)
include(/usr/local/share/OpenCV/OpenCVConfig.cmake)
 
cd ~/catkin_ws/src/VINS-Fusion-gpu/vins_estimator && gedit CMakeLists.txt
 
##For vins_estimator : line 20
#find_package(OpenCV REQUIRED)
include(/usr/local/share/OpenCV/OpenCVConfig.cmake)

更改完之后,开始编译。

cd ~/catkin_ws/
source devel/setup.bash
catkin_make

如果OpenCVCUDA环境安装不对,这里就会报错。

(2) 更改配置参数

config 配置文件中,有两个 gpu 加速 参数。

use_gpu: 0 # 0 for off, 1 for on
use_gpu_acc_flow: 0 # 0 for off, 1 for on

GPU 资源受限或者程序需要使用 GPU 进行其他计算时,可以设置为:

use_gpu: 1
use_gpu_acc_flow: 0 

否者,可以设置为:

use_gpu: 1
use_gpu_acc_flow: 1 

Jeston TX2 中后者可能会占用 20%GPU 使用率。
IMU的数据需要由事先的测试试验标定得到。
需要注意在线估计IMU与相机之间的时间差,虽然说Intel D435i已经做好硬件同步,但是用Kalibr标定出来还是会有1.5ms左右的时间误差。
在这里插入图片描述

(3) 启动VINS

前期的参数配置工作完成后,我们就可以启动 VINS

3-1 启动D435i

修改D435i的发布频率,建议为15Hz,这样NX上不会有较大的延迟。路径还是你自己安装 realsense_ros 的路径。
在这里插入图片描述
启动 D435i方式:realsense2_camera rs_camera.launch
需要查看下 D435i 是否发布 IMU 数据,主要是X、Y、Z三个轴的线速度。
rostopic echo /camera/imu

3-1 启动VINS

启动方式:rosrun vins vins_node + D435i配置文件的路径
例如:

rosrun vins vins_node ~/vins_gpu/src/VINS-Fusion-gpu-master/config/realsense/realsense1.yaml 

可以显示出当前位姿信息。
在这里插入图片描述
然后启动RVIZ

roslaunch vins vins_rviz.launch 

启动完之后,可以拿着飞机走两圈,看看定位精度以及延时情况。如果没有问题就可以接入Prometheus中了。

4. 数据测试

4.1 公开数据集测试

EuRoCStereo cameras + IMU)为例,

 roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 
(optional) rosrun loop_fusion loop_fusion_node ~/catkin_ws/src/VINS-Fusion/config/euroc/euroc_stereo_imu_config.yaml 
rosbag play YOUR_DATASET_FOLDER/MH_01_easy.bag

数据可以通过这个链接在百度网盘下载到。

4.2 测试设备(D435i+P450

在配置参数文件中加入以下参数,使得GPU起作用。

imu_topic: "/mavris/imu/data_raw"
image0_topic: "/camera/infra1/image_rect_raw"
image1_topic: "/camera/infra2/image_rect_raw"

IMU相机外参标定可以通过VINS实时在线标定或者使用Kalibr工具包进行标定。

5. 接入Prometheus

5.1 修改px4_pos_estimator.cpp

Prometheus/Modules/control/src文件夹中修改文件px4_pos_estimator.cpp
主要修改内容如下:回调函数中,主要是VINS发布数据格式为YXZ,而Prometheus需要ENU,所以这里做一个变换。VINS的四元数虚部在前,这里也需要调整下。
在这里插入图片描述

5.2 修改p450_vio的启动文件

Amov_lab/src/P450_expriments/launch_basic 中找到 p450_vio的启动文件 p450_vio_onboard.launch。修改位姿数据来源,因为我们不再依赖T265

5.3 修改订阅话题

最后,需要修改主函数里面的订阅话题
在这里插入图片描述

6. 启动VINSPrometheus配置文件

roslaunch realsense2_camera rs_camera.launch
rosrun vins vins_node + D435i配置文件路径 # 具体应该是在VINS 包下面
roslaunch p230_expriments p230_vio_onboard.launch

查看下 rqt_graph,可以看到 VINS 发布的位姿已经被px4_pos_estimator 订阅,类似于T265发布的 odom/sample,通信链路正常。
在这里插入图片描述
我们还可以看到终端可以正确打印位姿数据,即代表VINS接入Prometheus成功。
在这里插入图片描述
在这里插入图片描述
至此,我们已经成功把 VINS 接入到 Prometheus 中。

文献参考

1、无人机自主导航(ARM架构的vins-fusion-GPU部署)
2、安装环境OpenCV
3、调内外参数
4、带你具体部署VINS_FUSION_GPU版本
5、NVIDIA Jetson Xavier NX部署VINS-fusion-GPU版本
6、VINS-Fusion-GPU-TX2-nano的github技术说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/132923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux TCP 拥塞正反馈 bad case

前置知识&#xff0c;TCP thin stream&#xff0c;参见&#xff1a; 该文档中搜索 tcp_thin_linear_timeoutsTCP-thin-stream 看图说话&#xff1a; 参见 tcp_retransmit_timer 函数&#xff0c;着重看下面段落&#xff1a; if (sk->sk_state TCP_ESTABLISHED &&am…

视觉SLAM学习路线

导师让我了解SLAM&#xff0c;SLAM原本是比较小众的方向&#xff0c;最近自动驾驶火起来&#xff0c;做这个SLAM的人也多了&#xff0c;反过来也会推动机器人感知的发展。希望未来学成的时候&#xff0c;能赶上机器人大规模普及&#xff0c;就业一片蓝海。学SLAM方向跟motion p…

RabbitMQ延迟列队的使用

目录 1. 延迟队列使用场景 2. RabbitMQ中的延迟队列实现思路 3. 实现示例 3。运行项目测试 1. 延迟队列使用场景 延迟队列一般可用于具有时间限制的任务&#xff0c;例如&#xff1a;限时优惠&#xff0c;超时的订单处理等。 对于这种场景&#xff0c;传统的处理方式是任…

Ceph: ceph基础知识

ceph基础知识 一、基础概念 ceph官方文档 http://docs.ceph.org.cn/ ceph中文开源社区 http://ceph.org.cn/ 1、概述 Ceph是可靠的、可扩展的、统一的、开源分布式的存储系统。 Ceph是一个统一的分布式存储系统&#xff0c;设计初衷是提供较好的性能、可靠性和可扩展性。 C…

Python基础知识(一)

目录 输入输出函数 输入函数&#xff1a;input() 输出函数&#xff1a;print() 算术运算符 关系运算符 逻辑运算符 变量 1.命名规则 2.变量类型 3.动态类型特性 输入输出函数 输入函数&#xff1a;input() name input("请输入&#xff1a;") print(nam…

第二证券|北向资金全年净买入约900亿元 哪些行业和个股成“香饽饽”

2022年A股收官。回顾这一年&#xff0c;面临复杂严峻的国内外环境&#xff0c;A股商场推动完善多元融资支撑机制&#xff0c;加大了对实体经济的金融支撑力度&#xff0c;为中国经济V形复苏做出了奉献。这一年&#xff0c;A股IPO融资规划创出历史新高&#xff0c;存量上市公司打…

驱动的并发和竞争

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、什么是并发&#xff1f;并发并行并发并行模式二、什么是竞争三、如何解决竞争1、原子操作整形原子操作&#xff1a;原子位操作2.自旋锁3.信号量4.互斥锁5.如…

mysql批量更新方法

mysql批量更新方法 实验mysql版本为5.7.20 隔离级别为rr&#xff0c;加锁场景的问题在mysql8.0.18中为复现 方法一 replace into 批量更新 原理&#xff1a;replace into table (col1,col2) values (x1,x2), 操作本质是对重复的记录先delete 后insert 缺点&#xff1a;1、如…

特斯拉Model S及Model X 2023上半年交付,1月6日公布售价

特斯拉Model S及Model X终于快要交付了。 2022年12月30日&#xff0c;广州国际车展盛大开幕。众多车企带来了旗舰车型&#xff0c;让观众直呼太过瘾&#xff0c;其中&#xff0c;人流量爆火的莫过于特斯拉展台。此次&#xff0c;特斯拉携旗下S3XY家族重磅出击&#xff0c;全新车…

【C++基础】08:模板

模板 OVERVIEW模板一、函数模板1.func template基本使用&#xff1a;2.func template案例&#xff1a;数组排序3.函数与函数模板的区别&调用规则&#xff1a;4.func template的局限性&#xff1a;二、类模板1.类模板基本使用&#xff1a;2.类模板与函数模板的区别&#xff…

AOA估计中的MUSIC算法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着阵列信号处理技术的不断发展,到达角估计(Angle Of Arrival)的研究在移动通信系统中具有重要意义。通过分析经典MUSIC算法,…

golang 自定义命令行flag包简单使用

一、为什么需要使用golang自定义命令行 不恰当的比喻&#xff0c;当我们写了一个服务代码后&#xff0c;按照简单的思维&#xff0c;我们会在业务代码中将要连接的数据库 用户名、主机名、端口号、密码写死。 那么也就意味着我们启动该服务后都只能固定连接某一个数据库&#x…

etcd快速入门

etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。 etcd内部采用raft协议作为一致性算法&#xff0c;etcd基于Go语言实现。 etcd作为服务发现系统&#xff0c;有以下的特点&#xff1a; 1.简单&#…

分享67个PHP源码,总有一款适合您

链接&#xff1a;https://pan.baidu.com/s/1MzKN0bLDRv0i290R2erMHQ?pwdbo2i 提取码&#xff1a;bo2i PHP源码 分享67个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载…

寒假每日一题W1D3——上课睡觉

题目描述 有 N 堆石子&#xff0c;每堆的石子数量分别为 a1,a2,…,aN。 你可以对石子堆进行合并操作&#xff0c;将两个相邻的石子堆合并为一个石子堆&#xff0c;例如&#xff0c;如果 a[1,2,3,4,5]&#xff0c;合并第 2,3 堆石子&#xff0c;则石子堆集合变为 a[1,5,4,5]。…

【学习】backdoor attacks、Adversarial Attack on Images、Adversarial Attack on Audio

文章目录一、后门攻击backdoor attacks1、data poisoning2、backdoored PLM3、defenseONION4、后门攻击:绕过ONION防御5、摘要二、Adversarial Attack on Imagesone pixel attackdifferential evolution三、Adversarial Attack on Audio一、后门攻击backdoor attacks 什么是后…

进程的终止和等待

目录 进程终止 如何获取退出码呢&#xff1f; 进程退出方法有哪些&#xff1f; 对于进程退出&#xff0c;内核OS做了什么&#xff1f; 进程等待 为什么要进行进程等待&#xff1f; 如何进行进程等待&#xff1f; 什么是阻塞和非阻塞等待&#xff1f; 进程终止 对于进程…

飞依诺冲刺科创板上市:上半年出现亏损,因商业秘密纠纷被起诉

近日&#xff0c;飞依诺科技股份有限公司&#xff08;下称“飞依诺”&#xff09;在上海证券交易所递交招股书&#xff0c;准备在科创板上市。本次冲刺上市&#xff0c;飞依诺计划募资11.22亿元&#xff0c;将用于生产基地升级项目、新产品研发与总部基地建设项目、营销网络建设…

【Linux】一文掌握Linux基本指令(下)

本章命令大致总结命令功能cat打印文件内容echo打印文件内容> 输出重定向 >>追加重定向< 输入重定向 more 查看文本内容 less等价于morehead打印文本前n行tail 打印文本后n行 |管道date时间相关cal日历sort文本排序uniq相邻文本降重zip打包压缩unzip解包tar打包/解包…

蓝桥杯寒假集训第四天(全球变暖DFS)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 有一个正方形区域&#xff0c;里面有大陆和海洋&#xff0c;暂且用‘.’表示海洋&#xff0c;用‘#’表示大陆。我们把上下左右都连在一起的大陆称之为岛屿。但是随着气温…