Ravens Transporter Networks 实践指南:基于 PyBullet 的视觉操作仿真、数据生成与模仿学习全流程
2026/9/21 16:39:48 网站建设 项目流程
  • 人工智能
  • 深度学习
  • NLP
  • 计算机视觉
  • 强化学习

【免费下载链接】google-research

Google Research

项目地址:https://gitcode.com/gh_mirrors/go/google-research
点击查看免费下载

本文以 Google Research 开源的 Ravens 项目(ravens/README.md)为主线,系统讲解其在 PyBullet 中构建的 10 个桌面重排(tabletop rearrangement)仿真任务、配套的 Gym-like API、脚本化专家演示(oracle)采集流程,以及 Transporter Networks 从环境安装、数据生成、模型训练到评估绘图的完整实操链路。读完本文,你将掌握如何在本地复现「Transporter Networks: Rearranging the Visual World for Robotic Manipulation」(CoRL 2020)论文的实验流程,并能对照仓库源码理解每个命令行参数的底层作用。

一、项目定位:面向视觉操作学习的仿真基准

Ravens 是一个在 PyBullet 中实现的仿真任务集合,专为基于视觉的机器人操作学习设计,重点聚焦抓取与放置(pick and place)问题。其核心设计目标有两个:

  • 为模仿学习(Imitation Learning)提供专家演示:每个任务都内置一个脚本化 oracle agent(task.oracle(env)),能够自动生成高质量的专家示范数据;
  • 为强化学习(Reinforcement Learning)提供部分奖励(partial credit):每个任务都实现了可逐步累积的奖励函数。

从源码看,任务注册表位于 ravens/ravens/tasks/init.py,tasks.names字典将任务名映射到对应的任务类;而环境封装位于 ravens/ravens/environment.py,以hz=480(480Hz 物理仿真频率)初始化Environment,整体接口风格与 OpenAI Gym 一致。

二、10 大桌面重排任务总览

Ravens 内置了 10 个具有不同挑战维度的任务,每个任务都包含:(i) 脚本化专家演示;(ii) 可提供部分积分的奖励函数。下图展示了这 10 个任务在仿真中的真实画面(该图即 README 中引用的官方任务示意图):

各任务具体说明如下:

任务内容描述挑战维度
(a)block-insertion拿起 L 形红色积木,放入 L 形夹具中精确插入、夹具对齐
(b)place-red-in-green在混杂其他物体的场景中,拾取红色积木放入绿色碗中目标物体识别与分拣
(c)towers-of-hanoi汉诺塔:把圆盘从一座塔按规则移到另一座塔,小盘只能压在大盘上多步顺序推理
(d)align-box-corner拿起随机尺寸的箱子,将其一角与桌面上的 L 形标记对齐对未见物体泛化
(e)stack-block-pyramid依次将 6 个积木堆成 3-2-1 的彩虹色金字塔多步堆叠、闭环反馈
(f)palletizing-boxes拾取同质固定尺寸箱子,在托盘上交错层叠规则化码垛
(g)assembling-kits拾取不同物体,放到印有对应轮廓的拼装板上对未见物体泛化
(h)packing-boxes拾取随机尺寸箱子,紧密装入容器紧凑装箱、对未见物体泛化
(i)manipulating-rope重排可变形绳索,使其连接 3 边正方形的两个端点可变形物体操作
(j)sweeping-piles将成堆小物体推入桌面上的目标区域非抓取式推动、闭环反馈

从难度划分来看:(d)、(g)、(h) 三个任务要求泛化到未见过的物体;而 (c)、(e)、(f)、(h)、(i)、(j) 六个任务要求具备多步序列执行与闭环反馈能力

对应实现分散在 ravens/ravens/tasks/ 目录下,每个任务一个文件(如block_insertion.pytowers_of_hanoi.pymanipulating_rope.py等)。所有任务继承自 ravens/ravens/tasks/task.py 中的基类,其oracle(env)方法返回对应任务的脚本化专家策略。

三、核心技术背景:Transporter Networks

本仓库是论文《Transporter Networks: Rearranging the Visual World for Robotic Manipulation》(CoRL 2020)的参考实现。其核心思想是:机器人操作可以建模为一系列空间位移(spatial displacements)的推断——被移动的空间可以是物体、物体的一部分或末端执行器。

Transporter Network 是一种简单的模型架构,它通过重排深度特征来从视觉输入推断空间位移,进而参数化机器人动作。该方法的关键特性:

  • 不假设物体性(objectness):无需规范位姿、物体模型或关键点等先验;
  • 利用空间对称性:天然受益于空间上的对称归纳偏置;
  • 样本效率高:在视觉操作任务中,其样本效率比论文中对比的多种基线高出数个数量级;
  • 可表达复杂多模态策略分布:能够表示抓取位置/姿态的多模态分布;
  • 支持多步序列任务与 6DoF 抓取:从堆叠积木金字塔、拼装未见物体,到操作可变形绳索、闭环推动小堆物体。

在论文实验中,该方法在 10 个仿真任务上的学习速度与泛化能力均优于多种端到端基线,包括使用地面真值物体位姿(ground-truth object poses)的策略,并已在真实硬件上得到验证。

四、环境安装:四步搭建完整开发环境

Step 1:安装 Miniconda(推荐 Python 3.7)

curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh -b -u echo $'\nexport PATH=~/miniconda3/bin:"${PATH}"\n' >> ~/.profile # 将 Conda 加入 PATH source ~/.profile conda init

Step 2:创建 Conda 环境并安装依赖

cd ~/ravens conda create --name ravens python=3.7 -y conda activate ravens sudo apt-get update sudo apt-get -y install gcc libgl1-mesa-dev pip install -r requirements.txt python setup.py install --user

关键依赖锁定在 ravens/requirements.txt 中,其中核心版本约束包括:

  • tensorflow==2.3.0tensorflow-addons==0.11.2(Transporter 模型运行框架);
  • pybullet>=3.0.4(物理仿真引擎);
  • numpy==1.18.5scipy==1.4.1(数值计算);
  • opencv-python>=4.1.2.30scikit-image>=0.17.2(图像处理);
  • meshcat>=0.0.18(3D 可视化)、circle-fit>=0.1.3(圆拟合,用于绳类任务);
  • absl-py>=0.7.0matplotlib>=3.1.1transformations>=2020.1.1tensorflow_hub==0.9.0packaging>=19.2

python setup.py install --user将仓库注册为可导入的ravensPython 包(包名ravens、版本0.0.1,见 ravens/setup.py),后续demos.pytrain.py等脚本才能以from ravens import ...方式导入内部模块。

Step 3:安装 GPU 加速(可选但推荐)

./install_cuda.sh # 适用于 Ubuntu 16.04 和 18.04 conda install cudatoolkit==10.1.243 -y conda install cudnn==7.6.5 -y

对应脚本为仓库根目录的 ravens/install_cuda.sh。CUDA 10.1 + cuDNN 7.6.5 与requirements.txt中锁定的 TensorFlow 2.3.0 相匹配。

Step 4:下载物体模型与资源文件

cd ravens/ravens wget https://storage.googleapis.com/ravens-assets/assets.zip unzip assets.zip

资源解压后即成为仿真环境的物体模型与纹理资产。此外,仓库还提供了 ravens/run.sh,可作为一键式流程参考。

五、快速上手:数据生成 → 训练 → 评估 → 绘图

Ravens 的标准工作流分为四个阶段,分别由 ravens/demos.py、ravens/train.py、ravens/test.py、ravens/plot.py 四个顶层脚本驱动。

Step 1:生成训练与测试数据

python demos.py --disp --task=block-insertion --mode=train --n=10 python demos.py --disp --task=block-insertion --mode=test --n=100

从 demos.py 的源码可以看到该脚本的完整参数与运行逻辑:

参数默认值作用
--disp关闭(store_true是否显示仿真界面;去掉该参数即为无头(headless)模式,适合服务器训练
--taskinsertion指定任务名,通过tasks.names[args.task]查表实例化任务
--modetraintraintest,决定数据存放目录data/{task}-{mode}
--n1000目标采集的演示轮数(episodes)

数据采集的核心流程值得注意:

  • 每个任务通过task.oracle(env)获取脚本化专家,专家逐帧调用agent.act(obs, info)生成动作;
  • 环境以hz=480初始化,交互循环中记录(obs, act, reward, info)四元组;
  • 种子约定:训练种子为偶数、测试种子为奇数(seed += 2递增),以保证数据可复现;
  • 只保存成功演示:只有当total_reward > 0.99(即完整达成任务目标)时,该 episode 才会被写入数据集(demos.py)。

数据集的读写由 ravens/ravens/dataset.py 中的Dataset类负责,每个 episode 会被拆分为colordepthactionrewardinfo五类 numpy 数组持久化存储,并通过文件名中的 seed 追踪已有 episode 数量(n_episodes)与最大 seed。

Step 2:训练 Transporter Networks 模型

python train.py --task=block-insertion --agent=transporter --n_demos=10

train.py 暴露了完整的训练参数:

参数默认值作用
--taskinsertion训练任务名
--agenttransporter使用的 agent,通过agents.names注册表选择
--n_demos100从训练集中随机抽取用于训练的演示数量
--n_steps40000总训练步数
--n_runs1从头训练的重复次数(用于多次运行取统计)
--interval1000每训练多少步做一次验证并保存 checkpoint
--gpu0使用的 GPU 索引
--gpu_limitNoneGPU 显存上限(单位 GB),不设置则使用全部显存

源码中的训练循环(train.py)结构为:每训练interval步,就在测试集上执行一次agent.validate(test_dataset, writer),随后agent.save()保存快照。TensorBoard 日志写入logs/{agent}/{task}/{时间戳}/train目录。

Agent 的注册表位于 ravens/ravens/agents/init.py,本仓库共提供 7 种 agent:transporter(标准 Transporter)、transporter_6dof(6DoF 抓取变体)、gt_state/gt_state_2_step(使用地面真值状态)、form2fit(Form2Fit 方法)、conv_mlpdummy(基线)。--agent=gt_state即可复现论文中「使用 ground-truth 位姿的强基线」对比实验。

Step 3:评估训练好的模型

python test.py --disp --task=block-insertion --agent=transporter --n_demos=10 --n_steps=1000

test.py 的执行流程为:加载测试数据集 → 初始化 agent 并从checkpoints/{task}-{agent}-{n_demos}-{run}加载--n_steps步时的模型 → 逐 episode 运行闭环评估(测试种子由数据集的 seed 恢复,保证与演示一致)→ 将(total_reward, info)结果序列化保存为{name}-{n_steps}.pkl文件。其中--n_steps指定加载哪个训练步数的 checkpoint。

Step 4:绘制训练曲线

python plot.py --disp --task=block-insertion --agent=transporter --n_demos=10

plot.py 会扫描当前目录下所有{task}-{agent}-{n_demos}-*.pkl结果文件,解析出每个训练步数对应的测试成功率均值与标准差(打印时换算为百分比),并在--disp模式下调用utils.plot生成{name}-plot.png成功率曲线图(纵轴为 Testing Task Success (%),横轴为 Training Steps)。

可选:TensorBoard 跟踪训练损失

python -m tensorboard.main --logdir=logs # 浏览器打开输出提示的地址

六、数据集与预训练模型下载

Ravens 提供了官方生成的训练/测试数据集与预训练模型,可直接下载复用:

wget https://storage.googleapis.com/ravens-assets/checkpoints.zip wget https://storage.googleapis.com/ravens-assets/block-insertion.zip wget https://storage.googleapis.com/ravens-assets/place-red-in-green.zip wget https://storage.googleapis.com/ravens-assets/towers-of-hanoi.zip wget https://storage.googleapis.com/ravens-assets/align-box-corner.zip wget https://storage.googleapis.com/ravens-assets/stack-block-pyramid.zip wget https://storage.googleapis.com/ravens-assets/palletizing-boxes.zip wget https://storage.googleapis.com/ravens-assets/assembling-kits.zip wget https://storage.googleapis.com/ravens-assets/packing-boxes.zip wget https://storage.googleapis.com/ravens-assets/manipulating-rope.zip wget https://storage.googleapis.com/ravens-assets/sweeping-piles.zip

checkpoints.zip(各任务预训练模型)外,其余压缩包分别对应 10 个任务的数据集。结合上文可知:下载的数据集应解压至data/{task}-train/data/{task}-test目录,checkpoints 应解压至checkpoints/目录(agent 的models_dir指向checkpoints/{name},见 ravens/ravens/agents/transporter.py),即可被 demos.py、train.py、test.py 直接读取。

七、任务的 MDP 形式化定义

每个任务都是一个 MDP,其转移(transition)具有以下统一结构:

组成内容
Observations(观测)原始 RGB-D 图像,以及相机参数(位姿与内参)
Actions(动作)一个由机器人调用的原始函数(primitive function)及其参数
Rewards(奖励)一个成功 episode 的奖励总和归一化为 1
Info(附加信息)物体的 6D 位姿、尺寸与颜色

观测与动作的具体处理在源码中有清晰对应:

  • 观测处理:Transporter agent 的get_image方法调用utils.get_fused_heightmap,将多视角 RGB-D 观测融合为色图 + 高度图,再沿通道拼接成(320, 160, 6)的输入张量(ravens/ravens/agents/transporter.py);
  • 动作原语:机器人动作由 ravens/ravens/primitives.py 中的原始函数封装(如抓取、放置、推动),agent 输出的参数(如像素坐标、旋转角、高度)经由相机投影转换为机器人指令;
  • 奖励设计:部分奖励机制意味着 agent 在每一步都可能获得累积分数,只有完整完成目标时 episode 总奖励才等于 1——这也是 demos.py 用total_reward > 0.99判定演示成功与否的原因。

八、仓库结构与进一步阅读

ravens/ ├── demos.py # 数据采集:oracle 生成专家演示 ├── train.py # 训练入口:agent + 数据集 + checkpoint ├── test.py # 评估入口:加载 checkpoint 闭环测试 ├── plot.py # 结果绘图:解析 pkl 生成成功率曲线 ├── run.sh # 一键流程脚本 ├── install_cuda.sh # CUDA/cuDNN 安装脚本 ├── setup.py # ravens 包安装(v0.0.1) ├── requirements.txt # Python 依赖锁定 ├── docs/tasks.png # 10 任务示意图 └── ravens/ ├── environment.py # PyBullet 环境封装(Gym-like API) ├── dataset.py # RGB-D 图像数据集类 ├── cameras.py # 相机配置(如 RealSenseD415) ├── primitives.py # 机器人动作原语 ├── grippers.py # 夹爪模型 ├── agents/ # 7 种 agent(transporter / gt_state / form2fit 等) ├── models/ # 网络模型(attention / transport / matching 等) ├── tasks/ # 10 个任务的实现与 oracle 策略 └── utils.py # 高度图融合、绘图等工具函数

想深入理解 Transporter 的核心网络结构,可以继续阅读 ravens/ravens/models/transport.py(Transport 模块:通过特征重排实现空间位移推断)、ravens/ravens/models/attention.py(Attention 模块:先定位抓取像素)与 ravens/ravens/models/matching.py(旋转匹配模块)。这几个模块共同构成了「先 attention 定位、再 transport 旋转匹配」的两阶段 Transporter 推理管线,是理解论文方法在实际代码中落地的关键入口。

结语

Ravens 提供了一套完整、可复现的视觉操作学习实验框架:从 10 个具备 oracle 与部分奖励的仿真任务,到数据采集、训练、评估、绘图的流水线脚本,再到多种 agent 与模型的源码实现,覆盖了模仿学习与强化学习两种研究范式。你可以直接复用官方预训练模型与数据集快速复现论文结果,也可以基于 ravens/ravens/tasks/task.py 的基类自定义新任务,或基于 ravens/ravens/agents/init.py 的注册表接入自己的新算法,将其作为视觉操作研究的统一实验平台。

  • 人工智能
  • 深度学习
  • NLP
  • 计算机视觉
  • 强化学习

【免费下载链接】google-research

Google Research

项目地址:https://gitcode.com/gh_mirrors/go/google-research
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询