ROS2 Humble + OpenVINS 源码编译:混合安装最佳实践

Ubuntu 22.04 + ROS2 Humble 环境下,你可以:

  • ✅ 用 apt 安装 ros-humble-desktop(提供核心通信、rviz2、工具链等)
  • 同时从源码编译 OpenVINS(获取最新功能、便于调试、支持自定义修改)

这是非常推荐的开发模式:底层依赖用系统包(稳定),上层算法用源码(灵活)。


📋 目录

  1. 为什么可以混合使用?
  2. 从源码编译 OpenVINS
  3. OpenVINS 是否用于"显示 SLAM"?
  4. 推荐工作流:D455 + OpenVINS + rviz2
  5. D455 专用配置文件模板
  6. 常见问题排查

为什么可以混合使用?

组件 来源 说明
ROS2 核心(rclcpp, sensor_msgs, tf2, rviz2) apt install ros-humble-desktop 系统级依赖,稳定、免编译
OpenVINS GitHub 源码编译 算法层应用,常需调试、改参数、加日志

🔗 OpenVINS 源码编译时,会自动链接 /opt/ros/humble 中的头文件和库,无缝配合

混合安装的优势

┌─────────────────────────────────────────────────────────┐
│                    你的算法层                            │
│  ┌─────────────────────────────────────────────────┐   │
│  │  OpenVINS (源码编译)                             │   │
│  │  - 可调试、可修改、可加日志                       │   │
│  │  - 获取最新功能和 Bug 修复                       │   │
│  └─────────────────────────────────────────────────┘   │
├─────────────────────────────────────────────────────────┤
│                    ROS2 底层依赖                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │  ros-humble-desktop (apt 安装)                   │   │
│  │  - rclcpp, sensor_msgs, tf2, rviz2              │   │
│  │  - 稳定、经过测试、自动更新                       │   │
│  └─────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────┘

从源码编译 OpenVINS

前置条件

确保已安装 ROS2 Humble Desktop:

# 添加 ROS2 源
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 安装 ROS2 Humble Desktop
sudo apt update
sudo apt install ros-humble-desktop

# 安装开发工具
sudo apt install python3-colcon-common-extensions python3-rosdep

步骤 1:创建工作空间

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src

步骤 2:克隆 OpenVINS 源码(官方 ROS2 分支)

git clone https://github.com/rpng/open_vins.git

✅ 官方仓库已原生支持 ROS2(ov_msckfov_eval 等包均为 ROS2 节点)

步骤 3:安装依赖

cd ~/ros2_ws

# 初始化 rosdep(如果未初始化)
sudo rosdep init
rosdep update

# 安装依赖
rosdep install --from-paths src --ignore-src -y --rosdistro humble

额外依赖(可能需要手动安装):

sudo apt install libeigen3-dev libopencv-dev libboost-all-dev

步骤 4:编译

cd ~/ros2_ws
source /opt/ros/humble/setup.bash
colcon build --symlink-install

💡 --symlink-install 使修改配置文件后无需重新编译

步骤 5:加载环境

# Bash 用户
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

# Zsh 用户
echo "source ~/ros2_ws/install/setup.zsh" >> ~/.zshrc
source ~/.zshrc

验证安装

# 检查包是否可用
ros2 pkg list | grep ov

# 应输出:
# ov_core
# ov_eval
# ov_init
# ov_msckf

💡 此时 ros2 run ov_msckf run_subscribe_msckf 将优先使用你编译的版本(而非 apt 安装的)


OpenVINS 是否用于"显示 SLAM"?

不完全是。OpenVINS 本身是 VIO(Visual-Inertial Odometry)算法,核心输出是:

输出 话题 消息类型
实时位姿 /ov_msckf/odomimu nav_msgs/Odometry
特征点 /ov_msckf/points_slam sensor_msgs/PointCloud2
轨迹路径 /ov_msckf/pathimu nav_msgs/Path
坐标变换 /tf tf2_msgs/TFMessage

但它 不直接提供稠密建图或 3D 可视化 GUI

rviz2 才是"显示"工具

┌──────────────────┐      ┌──────────────────┐      ┌──────────────────┐
│   传感器数据      │ ───▶ │    OpenVINS      │ ───▶ │     rviz2        │
│ (相机 + IMU)     │      │   (计算轨迹)      │      │   (可视化)       │
└──────────────────┘      └──────────────────┘      └──────────────────┘

在 rviz2 中查看 SLAM 效果

rviz2

然后在 rviz2 中添加 Display:

Display 类型 话题 作用
Odometry /ov_msckf/odomimu 显示位姿箭头
Path /ov_msckf/pathimu 显示轨迹路径
PointCloud2 /ov_msckf/points_slam 显示 SLAM 特征点
TF /tf 显示坐标系关系
Image /camera/color/image_raw 显示原始图像

🔍 rviz2 才是"显示 SLAM"的工具,OpenVINS 是"计算 SLAM"的后端。


推荐工作流:D455 + OpenVINS + rviz2

整体架构

┌─────────────┐     ┌─────────────────┐     ┌─────────────┐
│ RealSense   │     │                 │     │             │
│   D455      │────▶│   OpenVINS      │────▶│   rviz2     │
│             │     │  (VIO 算法)     │     │  (可视化)   │
└─────────────┘     └─────────────────┘     └─────────────┘
      │                     │
      │  /camera/color      │  /ov_msckf/odomimu
      │  /camera/imu        │  /ov_msckf/pathimu
      │                     │  /ov_msckf/points_slam
      ▼                     ▼

1️⃣ 启动 RealSense D455

ros2 launch realsense2_camera rs_launch.py \
  depth_module.profile:=640x480x30 \
  rgb_camera.color_profile:=640x480x30 \
  unite_imu_method:=linear_interpolation \
  enable_gyro:=true \
  enable_accel:=true \
  gyro_fps:=200 \
  accel_fps:=200

⚠️ 需要先安装 RealSense ROS2 驱动:

sudo apt install ros-humble-realsense2-camera

2️⃣ 启动 OpenVINS

ros2 launch ov_msckf subscribe.launch.py config:=~/ros2_ws/src/open_vins/config/rs_d455/estimator_config.yaml

如果没有 D455 配置文件,参考下一节创建

3️⃣ 启动 rviz2 查看轨迹和特征点

# 使用 OpenVINS 自带的 rviz 配置
rviz2 -d ~/ros2_ws/src/open_vins/ov_msckf/launch/display.rviz

或手动配置 rviz2 添加上述 Display。


D455 专用配置文件模板

~/ros2_ws/src/open_vins/config/ 下创建 rs_d455/ 目录:

estimator_config.yaml

%YAML:1.0

# 话题配置
topic_imu: "/camera/imu"
topic_camera0: "/camera/color/image_raw"

# 相机数量
max_cameras: 1

# 是否使用立体视觉(D455 单目 VIO 时设为 false)
use_stereo: false

# 相机内参(D455 出厂标定值,建议通过 Kalibr 重新标定)
cam0_intrinsics:
  - 386.505   # fx
  - 386.505   # fy
  - 321.901   # cx
  - 239.168   # cy

# 相机畸变参数(D455 使用 Brown-Conrady / plumb_bob 模型)
cam0_distortion_model: "radtan"
cam0_distortion_coeffs:
  - 0.0       # k1
  - 0.0       # k2
  - 0.0       # p1
  - 0.0       # p2

# 图像分辨率
cam_wh:
  - 640
  - 480

# IMU 到相机外参(T_imu_cam: 从相机坐标系到 IMU 坐标系的变换)
T_imu_cam0:
  - [1.0, 0.0, 0.0, 0.0]
  - [0.0, 1.0, 0.0, 0.0]
  - [0.0, 0.0, 1.0, 0.0]
  - [0.0, 0.0, 0.0, 1.0]

# IMU 噪声参数(D455 BMI055 IMU 典型值)
gyroscope_noise_density: 0.005      # rad/s/sqrt(Hz)
accelerometer_noise_density: 0.01   # m/s^2/sqrt(Hz)
gyroscope_random_walk: 0.0001       # rad/s^2/sqrt(Hz)
accelerometer_random_walk: 0.0002   # m/s^3/sqrt(Hz)

# IMU 频率
imu_rate: 200.0

# 特征提取参数
num_pts: 200                        # 每帧提取的特征点数量
fast_threshold: 20                  # FAST 角点检测阈值
grid_x: 5                           # 特征网格 X 方向分块数
grid_y: 5                           # 特征网格 Y 方向分块数
min_px_dist: 15                     # 特征点最小像素距离

# MSCKF 参数
max_clones: 11                      # 最大克隆状态数
max_slam: 50                        # 最大 SLAM 特征数
max_aruco: 1024                     # 最大 ArUco 标记数
max_msckf_in_update: 40             # 单次更新最大 MSCKF 特征数

# 初始化参数
init_window_time: 1.0               # 初始化窗口时间(秒)
init_imu_thresh: 1.5                # IMU 激励阈值

# 重力
gravity_mag: 9.81

目录结构

open_vins/config/
├── rs_d455/
│   ├── estimator_config.yaml      # 主配置文件
│   └── kalibr_imu_chain.yaml      # Kalibr 标定结果(可选)
├── euroc_mav/
├── tum_vi/
└── ...

常见问题排查

问题 1:编译报错 Could not find a package configuration file provided by "XXX"

原因:缺少 ROS2 依赖包
解决方案

rosdep install --from-paths src --ignore-src -y --rosdistro humble

问题 2:运行时 [ERROR] No IMU data received

原因:IMU 话题名不匹配或未发布
解决方案

# 检查 IMU 话题
ros2 topic list | grep imu
ros2 topic echo /camera/imu

# 确保配置文件中 topic_imu 与实际话题一致

问题 3:VIO 漂移严重

原因:IMU 标定参数不准确
解决方案

  1. 使用 Kalibr 进行 IMU-相机联合标定
  2. 使用 imu_utils 估计 IMU 噪声参数
  3. 更新配置文件中的噪声参数

问题 4:特征点追踪丢失

原因:光照变化大 / 快速运动
解决方案

# 调整特征提取参数
num_pts: 300                # 增加特征点数量
fast_threshold: 15          # 降低检测阈值
min_px_dist: 10             # 减小最小距离

问题 5:时间戳不同步

原因:相机和 IMU 时间戳未对齐
解决方案

# 使用 RealSense 的硬件同步
ros2 launch realsense2_camera rs_launch.py \
  unite_imu_method:=linear_interpolation \
  enable_sync:=true

🔗 相关链接

  • [[ROS2 Humble 安装指南]]
  • [[Kalibr 相机-IMU 联合标定]]
  • [[RealSense D455 驱动配置]]
  • [[VIO 算法原理详解]]
  • [[rviz2 可视化配置]]

🔄 更新日志

  • 2025-12-22: 创建初始版本,涵盖混合安装流程和 D455 配置

最后更新: 2025-12-22
维护者: Jesse