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

把论文里的技术细节翻译成“人话”,让 6-DOF 抓取不再神秘
1. 开场白:为什么我们需要更好的抓取模型?
在实验室里,机械臂把积木叠成塔已经很常见,但真正走进仓库、厨房、甚至太空舱时,你会发现:
-
同一个机器人换个夹爪,成功率就断崖式下跌。 -
桌子边缘被挡住的杯子,算法给出的抓取位姿直接穿模。 -
训练数据不够,换个新物体就“抓瞎”。
NVIDIA 2025 年 7 月发布的 GraspGen 正是为了解决这些痛点:
-
一套开源框架,通用 3 种夹爪(Franka Panda、Robotiq-2F-140、30 mm 吸盘)。 -
支持完整点云和单视角遮挡点云,让算法在真实相机下也能用。 -
把扩散模型(Diffusion Model)搬来做 6-DOF 抓取,并给出 On-Generator Training 的新训练套路,把“模型自己产生的假正例”也拿去再训练,过滤掉错误的候选抓取。
2. GraspGen 能做什么?一张雷达图看懂亮点

场景 | 传统方法痛点 | 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 的空中抓取。
解决方案:
-
先用扩散模型生成 2000 个候选抓取。 -
用 Isaac Sim 重新仿真,把真正成功的标记为 +,失败的标记为 –。 -
用这个“模型自己生成的正负样本”再训练一个轻量级判别器,专门给扩散模型“挑刺”。
实验结果:
-
只用离线数据训练判别器 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:流程如下:
-
RGB-D 相机 → SAM2 分割 → 物体点云 -
GraspGen 推理 → Top-100 抓取 -
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 抓取,用一句话总结:
“让机器人像人类一样,先‘想象’出各种可能的抓法,再挑最稳的那一个。”