什么是 RLBench?

一个专为机器人学习设计的大规模基准测试和学习环境。

核心内容

仿真平台,支持多模态感知(如 RGB、深度图、分割图和物体位姿)以及自然语言接口。
它基于 CoppeliaSimPyRep 引擎,默认使用 Franka Panda 机械臂,支持 100 多种任务,包括抓取、开门、倒水等复杂操作。
每个任务都配有多种自然语言指令,例如"抓起红色方块"或"打开抽屉中的物体"

云服务器配置 RLBench

无 GUI 完全能跑 RLBench
第一步:下载 CoppeliaSim(RLBench 推荐 4.1.0 版本)

wget https://downloads.coppeliarobotics.com/V4_1_0/CoppeliaSim_Edu_V4_1_0_Ubuntu20_04.tar.xz
tar -xf CoppeliaSim_Edu_V4_1_0_Ubuntu20_04.tar.xz

第二步:设置环境变量(建议写入 ~/. Bashrc)

export COPPELIASIM_ROOT=$(pwd)/CoppeliaSim_Edu_V4_1_0_Ubuntu20_04
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$COPPELIASIM_ROOT
export QT_QPA_PLATFORM_PLUGIN_PATH=$COPPELIASIM_ROOT

第三步:安装 RLBench(这一步自动已安装了 PyRep)

pip install -e RLBench

第四步:安装 PyRep(RLBench 的底层模拟接口)

pip install https://github.com/stepjam/PyRep.git

第五步:安装gymnasium 依赖

pip install gymnasium

第六步:验证

python -c "from rlbench.environment import Environment; print('OK')"

先学习几种数据格式

HDF5 格式

RLBench平台提供的采集脚本 experiments/robot/rlbench/collect_rlbench_demos.py 收集的是HDF5 格式的 RLBench demonstration 数据集


{task_name}.hdf5
└── data/
    ├── demo_0/
    │   ├── obs/
    │   │   ├── front_rgb        [T, 256, 256, 3] uint8
    │   │   ├── wrist_rgb        [T, 256, 256, 3] uint8
    │   │   ├── left_shoulder_rgb  [T, 256, 256, 3] uint8
    │   │   ├── right_shoulder_rgb [T, 256, 256, 3] uint8
    │   │   ├── joint_positions  [T, 7] float32
    │   │   ├── gripper_open     [T, 1] float32
    │   │   ├── ee_pos           [T, 3] float32
    │   │   └── ee_quat          [T, 4] float32
    │   ├── actions              [T, 8] float32 (参考用)
    │   ├── dones                [T,]  uint8
    │   ├── rewards              [T,]  float32
    │   └── attrs: num_steps, success, language_instruction
    ├── demo_1/
    └── ...

概念梳理
close_jar.hdf5 为例:

close_jar.hdf5  (1个任务, 598MB)
│
├── demo_0  (第1条轨迹, ~160步, ~6MB)
│   │   机器人从初始状态开始,一步步拧紧罐子直到成功
│   │
│   ├── step_0:  观测(front图+ wrist图+ 关节角+ 夹爪)  → 动作[Δx,Δy,Δz,Δrx,Δry,Δrz,夹爪目标]
│   ├── step_1:  观测(front图+ wrist图+ 关节角+ 夹爪)  → 动作[...]
│   ├── step_2:  观测(...)                             → 动作[...]
│   │   ...
│   └── step_159: 观测(...)                            → 动作[0,0,0,0,0,0,0] (终止)
│
├── demo_1  (第2条轨迹, ~150步)
│   └── ...
│
├── demo_2  (第3条轨迹, ~170步)
│   └── ...
...
│
└── demo_99  (第100条轨迹)
    └── ...

一条轨迹就是完成一个任务的观测数据
训练时模型看到的样本:
每条轨迹的每一步都是一个训练样本。100 条轨迹 ×平均 160 步≈ 16,000 个训练样本

样本 0:  (front_rgb₀, wrist_rgb₀, joint_positions₀, gripper_open₀) → 动作₀
样本 1:  (front_rgb₁, wrist_rgb₁, joint_positions₁, gripper_open₁) → 动作₁
样本 2:  (front_rgb₂, wrist_rgb₂, joint_positions₂, gripper_open₂) → 动作₂
...

模型学的是:给定观测 → 预测下一步动作

RLDS 格式

        一种 episode-step 结构的机器人数据集格式。经常是 VLA / RT系列机器人模型使用的训练数据格式之一,但不是唯一格式。

很多 VLA 数据集会用 RLDS / TFDS 组织,例如:

Open X-Embodiment
RT-1 / RT-2 相关数据
部分 OpenVLA 预训练数据

HDF5 = 通用二级制数据容器
RLDS = 专门为强化学习 / 机器人轨迹设计的数据标准
RLDS 不是单纯文本格式,而是一种“episode 级别”的数据组织规范
核心结构

episode = {
    steps: [
        {
            observation,
            action,
            reward,
            discount,
            is_first,
            is_last,
            is_terminal
        }
    ]
}

它天然适合 VLA、RLDS:天然理解“trajectory”
Open X-Embodiment 就大量采用 RLDS

两者联系

现实中很多项目:

采集 -> HDF 5
训练前 -> 转 RLDS

因为:
HDF5 适合:

  • 实验记录
  • 单机采集
  • Debug
    RLDS 适合:
  • 大规模训练
  • Dataset federation
  • Benchmark

RLBench采集数据

cd /home/jovyan/home/suziyang/code/openvla-oft

source /opt/conda/bin/activate openvla-vggt
export COPPELIASIM_ROOT=/root/coppeliasim
export LD_LIBRARY_PATH=$COPPELIASIM_ROOT:$COPPELIASIM_ROOT/platforms
export DISPLAY=:99

# 全量采集
python experiments/robot/rlbench/collect_rlbench_demos.py \
    --tasks close_jar play_jenga put_knife_on_chopping_board \
             take_umbrella_out_of_umbrella_stand place_hanger_on_rack move_hanger \
    --demos_per_task 50 \
    --output_dir /home/jovyan/home/suziyang/datasets/rlbench_raw \
    --headless True \
    --image_size 256 256

# 单任务采集 (测试用)
python experiments/robot/rlbench/collect_rlbench_demos.py \
    --tasks play_jenga \
    --demos_per_task 5 \
    --output_dir /home/jovyan/home/suziyang/datasets/rlbench_raw \
    --headless True \
    --image_size 256 256 \
    --overwrite

架构概览

┌─────────────────────────────────────────────────┐
│                  RLBench 任务                    │
│  ┌──────────────────┐  ┌──────────────────────┐ │
│  │  Lua 场景 (.ttt) │  │ Python 任务逻辑 (.py) │ │
│  │  3D模型+关键帧点 │  │ 物体随机化+成功条件   │ │
│  └──────────────────┘  └──────────────────────┘ │
└──────────────────────────┬──────────────────────┘
                           │
                   task.get_demos(live_demos=True)
                           │
              ┌────────────▼────────────┐
              │   Motion Planner (RRT)  │
              │   机械臂路径规划          │
              │   关键帧之间平滑插值      │
              └────────────┬────────────┘
                           │
              ┌────────────▼────────────┐
              │   记录每一帧 Observation  │
              │   4 摄像头 + 关节 + 夹爪  │
              │   计算 delta 动作         │
              └────────────┬────────────┘
                           │
                    HDF5 文件
              (front_rgb, wrist_rgb, 
               joint_positions, ee_pose,
               actions, ...)

为什么能自动化?

  1. 关键帧机制
    每个 RLBench 任务的Lua 场景文件里预埋了关键帧点(waypoint0, waypoint1, ...),像这样:
机械臂起点 → waypoint1(抓取位置) → waypoint2(抬起到安全高度) → waypoint3(目标位置) → 结束

把这些关键帧点是在场景设计时就放好的,定义了任务骨架。
2. Python 任务类注入随机性
init_episode() 方法每次调用时随机化:

# close_jar.py 节选
def init_episode(self, index):
    # 随机放置罐子位置
    b.sample(obj, min_distance=0.01)
    # 随机选目标颜色
    target_color_rgb = colors[index]
    ...

所以同一个任务跑 50 次,罐子位置、颜色、干扰物都不同,确保了数据多样性。
3. Motion Planning 替代人类操控
关键帧定义 "where to go" → Motion Planner 计算 "how to get there"
RLBench 使用 CoppeliaSim 内置的 RRT-Connect 路径规划算法,在关节空间里找到避开碰撞的无碰路径。人类不需要操控机械臂。

数据记录了什么

每条演示采集的完整数据:

启动全量采集(50条 × 6任务)

source /opt/conda/bin/activate /home/jovyan/home/suziyang/.conda/envs/openvla-vggt
export COPPELIASIM_ROOT=/root/coppeliasim
export LD_LIBRARY_PATH=$COPPELIASIM_ROOT:$COPPELIASIM_ROOT/platforms
export DISPLAY=:99

cd /home/jovyan/home/suziyang/code/openvla-oft

nohup python -u experiments/robot/rlbench/collect_rlbench_demos.py \
    --tasks close_jar play_jenga put_knife_on_chopping_board \
             take_umbrella_out_of_umbrella_stand place_hanger_on_rack move_hanger \
    --demos_per_task 50 \
    --output_dir /home/jovyan/home/suziyang/datasets/rlbench_raw \
    --headless True \
    --image_size 256 256 \
    > /home/jovyan/home/suziyang/datasets/collect_full_log.txt 2>&1 &

echo "PID: $!"

收集完成后转换数据集格式

cd /home/jovyan/home/suziyang/code/openvla-oft

# 先只转 play_jenga
python experiments/robot/rlbench/convert_rlbench_to_rlds.py \
    --input_dir /home/jovyan/home/suziyang/datasets/rlbench_raw \
    --output_dir /home/jovyan/home/suziyang/datasets/rlbench_rlds \
    --tasks play_jenga

测试集

测试集不是预先存好的离线数据,而是直接在仿真器里实时跑的。这是RLBench的核心设计。

┌─────────────────────────────────────────────────────────────┐
│                        训练 vs 评测                          │
│                                                             │
│  训练:                                                      │
│   采集脚本 → 关键帧策略生成轨迹 → 录成 HDF5 → 转 RLDS        │
│   模型学习: 给定图像+指令 → 预测动作                          │
│                                                             │
│  评测 (完全不同):                                            │
│   启动仿真器 → init_episode(随机种子) → 模型实时控制机器人    │
│   → 每步: 摄像头拍照 → 模型预测动作 → 执行 → 直到成功或超时   │
│                                                             │
│  测试集 = 仿真器 + 你没见过的随机种子                          │
└─────────────────────────────────────────────────────────────┘

为什么评测不需要预先采集测试集?

run_episode() 的核心逻辑:

# run_rlbench_eval.py line 112-178
descriptions, obs = task.reset()   # ← 新随机种子,物体位置/颜色全新
while t < max_steps:
    img = get_rlbench_image(obs)       # 摄像头拍照
    wrist_img = get_rlbench_wrist_image(obs)
    
    actions = get_action(model, ...)    # 模型预测动作
    
    # 模型输出 delta → 转成绝对位姿 → 执行
    obs, reward, done = task.step(action)
    if done: 
        success = True; break

每次 task.reset() 调用 init_episode(random_seed) → 物体位置、颜色、干扰物全部随机化。25 个 episode = 25 个不同种子 = 25 个从未见过的场景

评测命令

cd /home/jovyan/home/suziyang/code/openvla-oft

source /opt/conda/bin/activate openvla-vggt
export COPPELIASIM_ROOT=/root/coppeliasim
export LD_LIBRARY_PATH=$COPPELIASIM_ROOT:$COPPELIASIM_ROOT/platforms
export DISPLAY=:99

# 评测单个任务
python experiments/robot/rlbench/run_rlbench_eval.py \
    --pretrained_checkpoint /path/to/trained/checkpoint \
    --tasks close_jar play_jenga \
    --headless True \
    --num_episodes_per_task 25

训练/测试的分割逻辑

         采集100条演示                   评测 × 25 episodes
    ┌─────────────────────┐         ┌──────────────────────┐
    │ seed=0..99           │         │ seed=100..124        │
    │ 罐子位置: 随机        │         │ 罐子位置: 随机(新)   │
    │ 颜色: 随机            │         │ 颜色: 随机(新)       │
    │ 运动规划生成轨迹      │         │ 模型自己生成轨迹     │
    └─────────────────────┘         └──────────────────────┘
          ↓ 监督训练                     ↓ 闭环评测
    模型学"这个场景该怎么做"         模型自己决定"现在该怎么做"

RLBench 收集的轨迹数据如何可视化

有几种方式。

  1. 采集时直接看(简单)
    设 headless=False,采集时 CoppeliaSim GUL 窗口实时显示机器人执行任务:
python experiments/robot/rlbench/collect_rlbench_demos.py \
    --tasks close_jar --demos_per_task 1 --headless False

每个 RLBench 任务都自带了一个 CoppeliaSim 场景文件(.ttt), 定义好了:

  • 机器人模型(Franka Panda 或 KUKA)
  • 任务物体(罐子、衣架、刀等)
  • 物体初始位置/朝向的随机变化范围
  • 相机位置和参数
  • 碰撞检测配置
    所以不需要手动搭建场景。
    env. get_task (CloseJar) 一行代码就会自动加载对应的场景,然后在场景上运行脚本策略生成轨迹。不同任务的任务物体不同,但机器人、相机、动作空间这些是共享的。
  1. 事后回放,把记录图像拼成视频
    读取.hdf5, 把一条 demo 的 front_rgb 帧拼成 MP4:
import h5py
import cv2
import numpy as np

with h5py.File("datasets/rlbench_raw/close_jar.hdf5", "r") as f:
    frames = f["data/demo_0/obs/front_rgb"][:]  # [T, 256, 256, 3]

h, w = frames.shape[1], frames.shape[2]
writer = cv2.VideoWriter("demo_0.mp4", cv2.VideoWriter_fourcc(*"mp4v"), 10, (w, h))
for frame in frames:
    writer.write(cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))
writer.release()

3. 用 RLBench 内置的 Observation.save()
RLBench 的 Observation 类自带保存功能,可在采集代码里加一步把每帧存为 PNG。
最简单的方式是第一种 — 在有显示器的机器上跑一条 demo 就能直观看到整个过程。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐