AnyCam2Ros:将任意摄像头一键接入 ROS2 图像话题

📷 一个开源工具,解决 VLA 真机部署和数据采集中最头疼的相机配置问题

背景:相机配置的痛点

如果你正在做具身智能(Embodied AI)相关的研究,尤其是部署 VLA(Vision-Language-Action)模型,比如:

  • π₀ (pi-zero) - Physical Intelligence 的通用机器人策略
  • OpenVLA - 开源的视觉-语言-动作模型
  • ACT - Action Chunking with Transformers

或者正在采集 SFT 演示数据 用于模仿学习,你一定遇到过这些问题:

场景一:想复现别人的数据集

“论文里用的是 RealSense D435,我手头只有 Insta360 GO 3S 和几个 USB 摄像头,怎么对齐相机配置?”

场景二:多相机配置噩梦

“我有 3 个摄像头,每次重启电脑后 /dev/video0、video1、video2 的顺序就变了,launch 文件又得改…”

场景三:重复劳动

“给每个摄像头写 cam2image 的启动脚本,配置 namespace、frame_id、topic… 太繁琐了”

场景四:团队协作

“队友在另一台机器上,怎么让他的相机配置和我一样?”


AnyCam2Ros:统一的解决方案

AnyCam2Ros 是一个开源工具,提供统一的相机配置流程:

1
2
3
4
5
6
7
任意相机设备                        统一配置                    ROS2 话题
┌─────────────────┐ ┌─────────────┐ ┌─────────────────┐
│ Insta360 GO 3S │──┐ │ │ │ /camera_front/ │
│ RealSense D435 │──┼──▶ /dev/ │ AnyCam2Ros │──▶ 生成 ──▶│ image_raw │
│ USB Webcam │──┤ video* │ CLI │ 脚本 │ /camera_wrist/ │
│ 手机 (DroidCam) │──┘ │ │ │ image_raw │
└─────────────────┘ └─────────────┘ └─────────────────┘

核心特性

特性 说明
🔍 自动发现 扫描所有 /dev/video* 设备,显示分辨率、硬件信息
🛡️ 稳定路径 使用 /dev/v4l/by-id 稳定路径,重启后顺序不变
🎨 交互式 CLI 基于 Rich 的精美界面,引导式配置体验
📦 配置可复用 JSON 格式配置文件,跨机器、跨团队共享
开箱即用 生成的脚本已自动 chmod +x,直接运行

支持的设备

在 Linux 中,一切皆文件。只要设备能被识别为 /dev/video*,就能接入 ROS2:

设备类型 示例 支持?
运动相机 Insta360 GO 3S, GoPro
深度相机 RealSense D435 (RGB)
USB 摄像头 Logitech C920, 通用 UVC
工业相机 FLIR, Basler (V4L2 驱动)
手机 Android USB Webcam, DroidCam
采集卡 Elgato, HDMI 采集器
虚拟摄像头 OBS Virtual Cam, v4l2loopback

使用演示

1. 安装

1
2
3
git clone https://github.com/ly-geming/AnyCam2Ros.git
cd AnyCam2Ros
pip install rich

2. 运行 CLI

1
python3 scripts/camera_cli.py

3. 交互式配置

CLI 会引导你完成:

  1. 扫描 — 自动检测所有已连接的摄像头
  2. 选择 — 选择要配置的设备(支持多选)
  3. 配置 — 设置分辨率、帧率、ROS namespace
  4. 生成 — 创建启动脚本

4. 生成的文件结构

1
2
3
4
generated_cameras/
├── start_cam_front.sh # 前置摄像头启动脚本
├── start_cam_wrist.sh # 腕部摄像头启动脚本
└── start_all_cams.sh # 一键启动所有摄像头

5. 启动并验证

1
2
3
4
5
# 启动所有摄像头
./generated_cameras/start_all_cams.sh

# 用 image_view 验证
ros2 run image_view image_view --ros-args -r image:=/hdas/camera_front/color/image_raw

配置复用:跨机器共享

配置完成后会生成 configs/cameras.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"generated_at": "2026-02-04T12:00:00+00:00",
"cameras": [
{
"name": "front",
"device_path": "/dev/v4l/by-id/usb-Insta360_GO_3S-video-index0",
"width": 1920,
"height": 1080,
"fps": 30.0,
"namespace": "/hdas/camera_front",
"frame_id": "front_camera",
"image_topic": "color/image_raw"
}
]
}

队友拿到这个文件后,只需:

1
python3 scripts/camera_cli.py --from-config

即可生成完全相同配置的启动脚本,即使他们的硬件不同(设备路径会在本地重新扫描匹配)。


适用场景

场景 AnyCam2Ros 如何帮助
VLA 模型部署 快速配置真机相机,测试 π₀、OpenVLA
SFT 数据采集 统一多相机配置,采集操作演示数据
数据集对齐 复现别人数据集的相机设置
DIY 机械臂 在自制机器人上快速接入任意摄像头
团队协作 共享配置文件,确保多人配置一致

开源地址

GitHub: https://github.com/ly-geming/AnyCam2Ros

欢迎 Star ⭐、Fork、提 Issue 和 PR!


总结

AnyCam2Ros 从实际科研痛点出发,解决了相机配置中最繁琐的环节:

Before After
每个相机单独写 launch 文件 交互式 CLI 一键生成
重启后设备顺序乱掉 稳定路径,永不乱序
团队配置不一致 JSON 配置文件共享
换硬件要重新配置 扫描 + 匹配,自动适配

如果你正在做具身智能相关的研究,希望这个工具能帮你省下宝贵的时间,专注于更重要的事情。


作者注:这个项目还在持续迭代中,欢迎在 GitHub Issues 中提出建议和反馈!