基于视觉基础模型的机器人场景三维重建与手眼标定系统
SAM3D Pipeline 是一个模块化的端到端系统,从单目视频输入出发,自动完成机器人场景的三维重建、语义分割、URDF 配准(手眼标定)以及新视角相机定位。系统集成了多个前沿视觉基础模型(GroundingDINO、SAM2、MASt3R、COLMAP、VGGT),并与机器人运动学约束相结合。
输入: 单目视频 + URDF 模型 + 关节角度
│
┌───────────────┴───────────────┐
│ Step 1: 视频预处理 │
│ GroundingDINO 检测 + SAM2 追踪│
│ MASt3R / COLMAP / VGGT 重建 │
└───────────────┬───────────────┘
│ masks + 点云 + 位姿
┌───────────────┴───────────────┐
│ Step 2: 点云分割 │
│ 多视角投票: 2D mask → 3D 语义│
└───────────────┬───────────────┘
│ 机器人点云 + 背景点云
┌───────────────┴───────────────┐
│ Step 3: URDF 配准 │
│ PCA + ICP → 尺度 + 位姿恢复 │
└───────────────┬───────────────┘
│ 标定后的相机参数
┌───────────────┴───────────────┐
│ Step 4: 相机定位 │
│ 新视角 RGB(-D) → 内外参估计 │
└───────────────────────────────┘
sam3d_pipeline/
├── run_pipeline.py # 统一入口 (编排 Step 1-4)
├── pyproject.toml # 项目依赖与构建配置
├── src/ # 源码包
│ ├── config.py # 全局共享配置 (默认值 + argparse 工具)
│ └── modules/ # 模块化视觉能力库
│ ├── base.py # 抽象基类 + 注册工厂
│ ├── grounding_dino/ # 开放词汇目标检测
│ ├── sam/ # 单帧实例分割 (SAM 1.0)
│ ├── sam2/ # 视频分割与追踪 (SAM 2.1)
│ ├── sam3/ # 文本驱动分割 (SAM 3)
│ ├── ram/ # 图像标签识别 (RAM+)
│ ├── mast3r/ # 多帧稠密重建 (MASt3R)
│ ├── colmap/ # 经典 SfM 重建 (COLMAP)
│ ├── vggt/ # Transformer 重建 (VGGT)
│ ├── kinematics/ # URDF 运动学 + 点云配准
│ └── sam3d_objects/ # 单图 3D 物体生成
├── tools/ # Pipeline 各步骤的独立脚本
│ ├── step1_reconstruct.py # Step 1: 视频→点云重建
│ ├── step2_segment_cloud.py # Step 2: 点云语义分割
│ ├── step3_calibrate.py # Step 3: URDF 配准 (手眼标定)
│ └── step4_localize.py # Step 4: 新视角相机定位
├── data/ # 示例数据
│ ├── example_00/ # 示例场景 0 (xArm6)
│ └── example_01/ # 示例场景 1 (RM75)
├── experiments/ # 实验脚本与配置
│ ├── scripts/ # baseline 方法 + 评测 + 扰动实验
│ ├── configs/ # 实验配置 JSON
│ └── references/ # Ground Truth 参考外参
├── docs/ # 文档
├── paper/ # 论文相关
├── related_works/ # 相关文献
└── 3party/ # 第三方依赖 (mast3r, vggt)
- OS: Linux x86_64 (仅支持)
- Python: 3.11.x
- GPU: NVIDIA GPU, 建议 16GB+ 显存 (CUDA 12.1)
- 包管理: uv (推荐)
# 1. 克隆仓库
git clone --recursive https://github.com/your-org/sam3d_pipeline.git
cd sam3d_pipeline
# 2. 安装依赖 (使用 uv)
uv sync
# 3. 安装第三方依赖
# MASt3R
cd 3party/mast3r && pip install -e . && cd ../..
# 4. 下载模型权重
# GroundingDINO -> src/modules/grounding_dino/checkpoints/
# SAM2 -> src/modules/sam2/checkpoints/
# MASt3R -> src/modules/mast3r/checkpoints/详细安装说明请参考 INSTALL.md。
# Step 1-3: 视频预处理 + 点云分割 + URDF 配准
python run_pipeline.py \
--video data/example_01/video.mp4 \
--urdf data/example_01/robot_2/rm75_ag2f90c.urdf \
--joints data/example_01/robot_2/joints_config.json
# Step 4: 新视角相机定位 (RGB-D)
python run_pipeline.py --steps 4 \
--prev-step3 outputs/.../step3_xxx \
--rgbd data/example_01/cam_1/image.npz# 只运行 Step 1 (视频预处理)
python run_pipeline.py --video data/example_01/video.mp4 --steps 1
# 使用 COLMAP 替代 MASt3R 进行重建
python run_pipeline.py --video data/example_01/video.mp4 --steps 1 --recon-method colmap
# 使用 VGGT 重建
python run_pipeline.py --video data/example_01/video.mp4 --steps 1 --recon-method vggt
# 从 Step 2 继续 (指定 Step 1 输出)
python run_pipeline.py --steps 2,3 \
--prev-step1 outputs/step1_xxx \
--urdf data/example_01/robot_2/rm75_ag2f90c.urdf
# 直接调用工具脚本
python tools/step1_reconstruct.py --video data/example_01/video.mp4 --output outputs/test
python tools/step2_segment_cloud.py --step1-dir outputs/step1_xxx --output outputs/step2_xxxPipeline 采用递归嵌套的输出目录结构:
outputs/
└── step1_20250208_143000/ # Step 1 输出
├── masks/ # SAM2 分割 mask (per-object 子目录)
│ ├── robot_1_01/ # 机器人1 逐帧 mask
│ └── robot_2_02/ # 机器人2 逐帧 mask
├── sparse_cloud.ply # 重建点云
├── camera_poses.npy # 相机位姿 (N, 4, 4) C2W
├── intrinsics.npy # 相机内参 (N, 3, 3)
├── frames/ # 关键帧图像
├── config.json # 运行配置快照
├── meta.json # 元信息
└── step2_20250208_143500/ # Step 2 输出 (嵌套在 Step 1 内)
├── robot_cloud.npy # 机器人点云
├── background_cloud.npy # 背景点云
└── step3_20250208_144000/ # Step 3 输出 (嵌套在 Step 2 内)
├── calibration.json # 标定结果
├── calibrated_poses.npy # 标定后相机位姿
└── step4_20250208_145000/ # Step 4 输出
├── camera_pose.npy # 新视角位姿
└── localization_result.json
- GroundingDINO 在第一帧检测机器人 (文本提示: "robot arm")
- SAM2 从检测框初始化, 追踪整个视频, 输出逐帧 mask
- 3D 重建 (可选后端):
mast3r(默认): 端到端稠密匹配, 速度适中, 精度好colmap: 经典 SfM, 精度最高, 速度较慢vggt: 前馈 Transformer, 速度最快, 弱纹理鲁棒
利用多视角投票机制将 2D mask 反投影到 3D 点云:
- 每个 3D 点投影到所有视角, 统计被 mask 覆盖的比例
- 投票比例 > 阈值 (默认 0.6) 的点标记为机器人
将分割出的机器人扫描点云配准到 URDF 模型:
- URDF 前向运动学生成标准点云
- PCA 主轴对齐 + 多尺度/多旋转候选搜索
- Point-to-Plane ICP 精细配准
- 方向检测与自动修正
恢复: 绝对尺度 + 基座位姿 + 标定后的相机内外参
给定新视角 RGB(-D) 图像, 估计其内外参:
visual: 特征匹配 + PnP (支持 RGB 和 RGB-D)pointcloud: 深度图→点云, ICP 配准 (需 RGB-D)robot: 机器人姿态约束配准 (需 RGB-D)silhouette: 轮廓对齐
| 模块 | 功能 | 核心类 | 依赖 |
|---|---|---|---|
grounding_dino |
开放词汇检测 | GroundingDINO |
groundingdino |
sam |
单帧分割 | SAMSegmentor |
segment-anything |
sam2 |
视频追踪 | SAM2VideoTracker, AutoVideoSegmentor |
sam2, hydra |
sam3 |
文本分割 | SAM3TextSegmentor |
sam3 |
ram |
图像标签 | RAMTagger |
recognize-anything |
mast3r |
稠密重建 | MASt3RReconstructor |
mast3r, dust3r |
colmap |
SfM 重建 | COLMAPReconstructor |
pycolmap |
vggt |
Transformer 重建 | VGGTReconstructor |
vggt |
kinematics |
URDF 配准 | ChainGrowthSolver |
pytorch-kinematics, open3d |
sam3d_objects |
3D 生成 | SAM3DGenerator |
编译安装 |
所有重建器和定位器通过装饰器注册到全局工厂:
from src.modules.base import register_reconstructor, get_reconstructor
@register_reconstructor("my_method")
class MyReconstructor(BaseReconstructor):
def _load_model(self): ...
def _unload_model(self): ...
def reconstruct(self, frames, **kw): ...
# 按名称动态实例化
recon = get_reconstructor("my_method", device="cuda")| 依赖 | 版本 | 用途 |
|---|---|---|
| PyTorch | 2.5.1 (CUDA 12.1) | 深度学习框架 |
| OpenCV | >= 4.9.0 | 图像处理 |
| Open3D | >= 0.18.0 | 3D 点云处理与 ICP |
| trimesh | >= 4.0.0 | Mesh 加载与采样 |
| pytorch-kinematics | >= 0.7.0 | URDF 解析与 FK |
| pycolmap | >= 3.10.0 | COLMAP Python API |
| hydra-core | >= 1.3.2 | 配置管理 (SAM2) |
# 运行 baseline 对比实验
python experiments/scripts/baseline_pca_icp.py \
--step2-dir outputs/.../step2_xxx --urdf robot.urdf --joints joints.json
# 评测标定精度
python experiments/scripts/eval_calibration.py \
--result outputs/.../step3_xxx/calibration.json \
--reference experiments/references/example_01_ref.json
# 鲁棒性实验 (内参/关节角噪声)
python experiments/scripts/perturb_intrinsics.py --intrinsics intrinsics.npy --sigma 5.0
python experiments/scripts/perturb_joints.py --joints joints.json --sigma 0.05详细开发指南请参考 DEVELOPMENT.md。
本项目仅供学术研究使用。