GraspGen 是什么?一篇写给机器人工程师的零基础入门指南

A Diffusion-based Framework for 6-DOF Grasping

把论文里的技术细节翻译成“人话”,让 6-DOF 抓取不再神秘


1. 开场白:为什么我们需要更好的抓取模型?

在实验室里,机械臂把积木叠成塔已经很常见,但真正走进仓库、厨房、甚至太空舱时,你会发现:

  • 同一个机器人换个夹爪,成功率就断崖式下跌。
  • 桌子边缘被挡住的杯子,算法给出的抓取位姿直接穿模。
  • 训练数据不够,换个新物体就“抓瞎”。

NVIDIA 2025 年 7 月发布的 GraspGen 正是为了解决这些痛点:

  • 一套开源框架,通用 3 种夹爪(Franka Panda、Robotiq-2F-140、30 mm 吸盘)。
  • 支持完整点云单视角遮挡点云,让算法在真实相机下也能用。
  • 把扩散模型(Diffusion Model)搬来做 6-DOF 抓取,并给出 On-Generator Training 的新训练套路,把“模型自己产生的假正例”也拿去再训练,过滤掉错误的候选抓取。

2. GraspGen 能做什么?一张雷达图看懂亮点

fig/radar.png
场景 传统方法痛点 GraspGen 解决方式
不同夹爪 需要重新训练 一次训练,3 种夹爪通用
遮挡视角 只能多视角融合 50-50 混合训练,直接支持单视角
杂乱桌面 场景级建模慢 物体级建模,SAM2 分割后单独处理
推理速度 100+ 步去噪 10 步就够用,20 Hz 实时
内存占用 显存爆炸 21× 内存节省,笔记本也能跑

3. 技术拆解:十分钟看懂扩散模型怎么做抓取

如果你听说过 Stable Diffusion,GraspGen 就是把“生成图片”换成“生成 6-DOF 抓取位姿”。

3.1 6-DOF 抓取问题到底是什么?

  • 6 个自由度:3 轴位移 + 3 轴旋转。
  • 输入:物体点云(来自 RGB-D 相机或 CAD 模型)。
  • 输出:一组可能的 6-DOF 抓取位姿,每个位姿还带“成功概率”。

3.2 扩散模型如何落地到 SE(3) 空间?

步骤 图像扩散 GraspGen 抓取扩散
数据空间 像素值 0-255 位姿 SE(3)(位移 + 旋转)
噪声过程 加高斯噪声到图片 加噪声到 6-DOF 位姿
网络输入 文字+噪声图 点云+噪声位姿
网络输出 去噪后图片 去噪后位姿
采样步数 50-100 步 10 步即可(维度低很多)

小技巧:作者把 SE(3) 拆成 SO(3) × R³,旋转用李代数(Lie Algebra)表示,位移用统计归一化 κ,避免不同尺寸物体的尺度爆炸。

3.3 为什么需要 On-Generator Training?

扩散模型只见过“好抓取”,推理时却可能生成穿模、离物体 10 cm 的空中抓取
解决方案:

  1. 先用扩散模型生成 2000 个候选抓取。
  2. 用 Isaac Sim 重新仿真,把真正成功的标记为 +,失败的标记为 –。
  3. 用这个“模型自己生成的正负样本”再训练一个轻量级判别器,专门给扩散模型“挑刺”。

实验结果:

  • 只用离线数据训练判别器 AUC = 0.886
  • 加上 On-Generator 数据后 AUC = 0.947

4. 数据集:53 M 抓取,8515 个物体,3 种夹爪

夹爪 成功/失败标签 物体来源 规模
Franka Panda Objaverse ≈17 M
Robotiq-2F-140 Objaverse ≈17 M
30 mm 吸盘 Objaverse ≈17 M

下载一条命令搞定:

git clone https://huggingface.co/datasets/nvidia/PhysicalAI-Robotics-GraspGen

5. 安装 & 上手:从零到第一次推理

5.1 懒人方案:Docker(推荐)

git clone https://github.com/NVlabs/GraspGen.git && cd GraspGen
bash docker/build.sh          # 一键打包镜像

5.2 极简方案:pip(仅推理)

pip install -e .
cd pointnet2 && pip install -e .
pip install pyrender PyOpenGL==3.1.5 diffusers==0.11.1 ...

5.3 下载模型权重

git clone git@hf.co:adithyamurali/GraspGenModels

5.4 第一次推理:30 秒完成

# 启动 MeshCat 可视化
meshcat-server &

# 在 docker 里跑 demo
bash docker/run.sh <path_to_graspgen_code> --models <path_to_models_repo>
cd /code && python scripts/demo_scene_pc.py \
  --sample_data_dir /models/sample_data/real_scene_pc \
  --gripper_config /models/checkpoints/graspgen_robotiq_2f_140.yml

浏览器打开 http://localhost:7000,就能看到机器人在点云上画出一堆绿色抓取箭头。


6. 训练自己的模型:三步曲

如果你想换夹爪或新物体,跟着做就好。

6.1 准备数据

文件 用途
Gripper URDF 描述夹爪几何
gripper.yml GraspGen 格式配置文件
object_mesh.obj 物体网格
grasp.json 成功/失败抓取位姿

6.2 启动容器并缓存数据集

bash docker/run.sh <graspgen> --grasp_dataset <dataset> --object_dataset <objects> --results <logs>

6.3 开训

# 训练扩散模型(生成器)
bash runs/train_graspgen_robotiq_2f_140_gen.sh

# 训练判别器(记得先跑 On-Generator 数据)
bash runs/train_graspgen_robotiq_2f_140_dis.sh
  • 8×A100 跑 3 K epoch 约 40 小时(生成器)。
  • 判别器再跑 90 小时。

7. FAQ:你大概率会遇到的 10 个问题

Q1:我的夹爪跟 Franka 差不多,能直接用吗?

A:如果是对称平行夹爪且行程接近,可把模型输出的位姿沿 z 轴平移 Z_OFFSET 即可。代码示例:

import trimesh.transformations as tra
new_grasp = grasp @ tra.translation_matrix([0, 0, -0.01])

Q2:想训练自己的吸盘,但半径不是 30 mm?

A:把输入点云按比例缩放 mat = tra.scale_matrix(r/0.030),再复用已有模型。

Q3:为什么训练脚本卡住不动?

A:八成是 Docker 内存/显存不够,先用 debug=True 单机单卡跑通。

Q4:如何接入真实机器人?

A:流程如下:

  1. RGB-D 相机 → SAM2 分割 → 物体点云
  2. GraspGen 推理 → Top-100 抓取
  3. cuRobo 运动规划 → 执行

Q5:为什么吸盘的旋转误差看起来很大?

A:吸盘绕轴对称,旋转自由度本来就没意义,看平移误差即可。

Q6:推理速度还能再快吗?

A:作者实测 TensorRT 后 20 Hz;或者减少采样步数到 5 步,再提速一倍,成功率略降 2-3%。

Q7:训练一定要 8 张 A100 吗?

A:单卡 24 GB 也能跑,把 batch_size 降到 16,时间×8。

Q8:如何验证模型好坏?

A:看三个数字:

  • 验证集平移误差 < 3 cm
  • 验证集 AUC > 0.90
  • 判别器 AP > 0.8

Q9:为什么对长方体表现差?

A:训练集长方体太少,下一版会加更多盒状数据。

Q10:商用授权怎么谈?

A:填写 NVIDIA Research Licensing 表单。


8. 结语:把论文落地才是硬道理

GraspGen 把扩散模型带进了 6-DOF 抓取,用一句话总结:

“让机器人像人类一样,先‘想象’出各种可能的抓法,再挑最稳的那一个。”