ROS2 Humble + OpenVINS 源码编译:混合安装最佳实践
在 Ubuntu 22.04 + ROS2 Humble 环境下,你可以:
- ✅ 用
apt安装ros-humble-desktop(提供核心通信、rviz2、工具链等) - ✅ 同时从源码编译 OpenVINS(获取最新功能、便于调试、支持自定义修改)
这是非常推荐的开发模式:底层依赖用系统包(稳定),上层算法用源码(灵活)。
📋 目录
- 为什么可以混合使用?
- 从源码编译 OpenVINS
- OpenVINS 是否用于"显示 SLAM"?
- 推荐工作流:D455 + OpenVINS + rviz2
- D455 专用配置文件模板
- 常见问题排查
为什么可以混合使用?
| 组件 | 来源 | 说明 |
|---|---|---|
| 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_msckf、ov_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 标定参数不准确
解决方案:
问题 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