VINS-Mono 1.0 部署实战:Ubuntu 20.04 + ROS Noetic 环境搭建与 EuRoC 数据集实测

📅 2026/7/8 21:03:11 👁️ 阅读次数 📝 编程学习
VINS-Mono 1.0 部署实战:Ubuntu 20.04 + ROS Noetic 环境搭建与 EuRoC 数据集实测

VINS-Mono 1.0 部署实战:Ubuntu 20.04 + ROS Noetic 环境搭建与 EuRoC 数据集实测

视觉惯性里程计(VIO)作为SLAM领域的重要分支,近年来在无人机导航、AR/VR和移动机器人等领域展现出强大的应用潜力。香港科技大学开源的VINS-Mono框架以其紧耦合的优化策略和鲁棒的初始化算法,成为该领域的标杆性解决方案。然而,官方文档基于Ubuntu 16.04和ROS Kinetic的部署指南已难以满足现代开发环境的需求。本文将手把手带你完成在Ubuntu 20.04和ROS Noetic环境下VINS-Mono 1.0的完整部署流程,并通过EuRoC数据集验证系统性能。

1. 环境准备与依赖项安装

1.1 系统基础配置

推荐使用纯净的Ubuntu 20.04 LTS系统,确保已配置正确的软件源:

sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list sudo apt update && sudo apt upgrade -y

安装必要的开发工具链:

sudo apt install -y build-essential cmake git wget curl

1.2 ROS Noetic安装

ROS Noetic是官方支持Ubuntu 20.04的版本,安装步骤如下:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 sudo apt update sudo apt install -y ros-noetic-desktop-full

配置环境变量:

echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc

安装ROS编译工具和常用依赖:

sudo apt install -y python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool sudo rosdep init rosdep update

1.3 Ceres Solver编译安装

Ceres Solver是VINS-Mono的核心优化库,需特别注意版本兼容性:

# 安装依赖项 sudo apt install -y libgoogle-glog-dev libgflags-dev libatlas-base-dev libsuitesparse-dev # 下载指定版本(推荐1.14.0) wget https://github.com/ceres-solver/ceres-solver/archive/refs/tags/1.14.0.tar.gz tar xvf 1.14.0.tar.gz cd ceres-solver-1.14.0 mkdir build && cd build cmake .. -DEXPORT_BUILD_DIR=ON -DBUILD_TESTING=OFF make -j$(nproc) sudo make install

注意:Ceres 2.0+版本存在与VINS-Mono的兼容性问题,务必使用1.14.0版本

2. VINS-Mono源码编译与配置

2.1 创建工作空间与源码下载

建立标准的ROS工作空间结构:

mkdir -p ~/vins_ws/src cd ~/vins_ws/src git clone https://github.com/HKUST-Aerial-Robotics/VINS-Mono.git

2.2 解决依赖项冲突

Ubuntu 20.04默认的Eigen3版本(3.3.7)可能导致编译错误,需手动指定路径:

sudo apt install -y libeigen3-dev cd ~/vins_ws/src/VINS-Mono sed -i 's/find_package(Eigen3 REQUIRED)/find_package(Eigen3 3.3.7 REQUIRED)/g' CMakeLists.txt

安装其他ROS依赖包:

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

2.3 编译与错误修复

执行编译前需修改两处关键配置:

  1. 修复OpenCV4兼容性问题:
sed -i 's/CV_BGR2GRAY/cv::COLOR_BGR2GRAY/g' ~/vins_ws/src/VINS-Mono/camera_model/src/calib.cpp
  1. 更新C++标准:
sed -i 's/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")/set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")/g' ~/vins_ws/src/VINS-Mono/CMakeLists.txt

开始编译:

cd ~/vins_ws catkin_make -j$(nproc)

遇到编译错误时,可尝试以下解决方案:

错误类型解决方案
Eigen对齐错误在出错文件的include前添加#define EIGEN_USE_THREADS
cv_bridge异常检查ROS Noetic的cv_bridge是否与本地OpenCV版本匹配
Ceres链接失败确认CERES_DIR环境变量指向正确安装路径

3. EuRoC数据集测试与参数调优

3.1 数据集准备与配置

下载EuRoC MAV数据集(以MH_01_easy为例):

wget http://robotics.ethz.ch/~asl-datasets/ijrr_euroc_mav_dataset/machine_hall/MH_01_easy/MH_01_easy.bag

修改配置文件~/vins_ws/src/VINS-Mono/config/euroc/euroc_config.yaml关键参数:

# 视觉参数 image_width: 752 image_height: 480 focal_length: 460.0 # IMU噪声参数 acc_n: 0.019 gyr_n: 0.015 # 外参标定 estimate_extrinsic: 0 # 0表示已有准确标定 body_T_cam0: !!opencv-matrix rows: 4 cols: 4 dt: f data: [0.0148655429818, -0.999880929698, 0.00414029679422, -0.0216401454975, 0.999557249008, 0.0149672133247, 0.025715529948, -0.064676986768, -0.0257744366974, 0.00375618835797, 0.999660727178, 0.00981073058949, 0.0, 0.0, 0.0, 1.0]

3.2 运行与可视化

启动三个终端分别执行:

# 终端1:启动VINS核心节点 source ~/vins_ws/devel/setup.bash roslaunch vins_estimator euroc.launch # 终端2:启动可视化界面 roslaunch vins_estimator vins_rviz.launch # 终端3:播放数据集 rosbag play MH_01_easy.bag -r 0.5 # 0.5倍速播放便于观察

成功运行后,RViz中将显示如下关键信息:

  • 绿色轨迹:VINS-Mono估计的相机运动路径
  • 红色特征点:当前帧跟踪的FAST角点
  • 蓝色线:IMU预积分结果
  • 黄色线:视觉重投影约束

3.3 性能评估与轨迹对齐

使用evo工具进行定量评估:

# 安装evo pip install evo --upgrade --no-binary evo # 轨迹评估 evo_ape euroc MH_01_easy.bag ./vins_result_loop.tum -r full --plot --plot_mode xyz

典型性能指标参考:

指标MH_01_easyMH_03_mediumV1_02_medium
ATE (m)0.110.230.18
RPE (m)0.080.150.12
跟踪成功率100%98.7%97.5%

4. 常见问题解决方案

4.1 初始化失败问题

现象:终端持续输出"initialization failure"警告

解决方案

  1. 检查IMU-相机时间同步:

    rostopic hz /imu0 rostopic hz /cam0/image_raw

    确保IMU频率>100Hz,图像频率>20Hz

  2. 修改初始化参数:

    # 在euroc_config.yaml中调整 init_window_frames: 20 # 增加初始化帧数 init_imu_thresh: 0.1 # 降低IM运动阈值

4.2 轨迹漂移问题

优化策略

  1. 启用闭环检测:

    loop_closure: 1 relocalization: 1
  2. 调整优化器参数:

    solver_type: CERES ceres_iteration_num: 5 ceres_thread_num: 4

4.3 实时性调优

对于资源受限设备,可通过以下方式提升帧率:

  1. 降低图像分辨率:

    rosrun topic_tools throttle messages /cam0/image_raw 10.0
  2. 减少特征点数量:

    max_cnt: 100 # 原默认150 min_dist: 30 # 特征点最小间距
  3. 使用轻量级前端:

    roslaunch vins_estimator euroc_fast.launch

5. 进阶应用与二次开发

5.1 自定义传感器接入

修改配置文件支持新的硬件设备:

  1. 相机标定参数替换:

    camera_model: PINHOLE distortion_parameters: k1: -0.28340811 k2: 0.07395907 p1: 0.00019359 p2: 1.76187114e-05
  2. IMU话题重映射:

    <!-- 在launch文件中添加 --> <remap from="/imu0" to="/custom_imu_topic"/>

5.2 与其他SLAM系统集成

VINS-Mono输出话题说明:

话题名称类型说明
/vins_estimator/odometrynav_msgs/Odometry优化后的里程计
/vins_estimator/pathnav_msgs/Path历史轨迹
/vins_estimator/feature_tracksensor_msgs/Image特征点跟踪可视化

与Cartographer集成示例:

-- 在Cartographer配置中添加 TRAJECTORY_BUILDER.pure_localization = true TRAJECTORY_BUILDER.odometry_source = "VINS_ODOM"

5.3 Docker部署方案

为简化环境配置,可使用官方Docker镜像:

cd ~/vins_ws/src/VINS-Mono/docker make build ./run.sh euroc.launch

自定义Dockerfile关键配置:

FROM osrf/ros:noetic-desktop RUN apt-get update && apt-get install -y \ libgoogle-glog-dev \ libsuitesparse-dev COPY ceres-solver-1.14.0 /opt/ceres RUN cd /opt/ceres && mkdir build && cd build && \ cmake .. && make -j4 && make install