RLBench仿真平台使用
什么是 RLBench?
一个专为机器人学习设计的大规模基准测试和学习环境。
核心内容
仿真平台,支持多模态感知(如 RGB、深度图、分割图和物体位姿)以及自然语言接口。
它基于 CoppeliaSim 和 PyRep 引擎,默认使用 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, ...)
为什么能自动化?
- 关键帧机制
每个 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 收集的轨迹数据如何可视化
有几种方式。
- 采集时直接看(简单)
设 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) 一行代码就会自动加载对应的场景,然后在场景上运行脚本策略生成轨迹。不同任务的任务物体不同,但机器人、相机、动作空间这些是共享的。
- 事后回放,把记录图像拼成视频
读取.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 就能直观看到整个过程。

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


所有评论(0)