RoboMME 是基于 ManiSkill(SAPIEN)构建的、增强记忆的操作 benchmark。它评估机器人在整个 episode 中保留和使用信息的能力——计数、物体恒存、参照和模仿。
lerobot/robomme — LeRobot v3.0,10 fps 下 76.8 万帧![]()
| 套件 | 任务 |
|---|---|
| 计数(时间记忆) | BinFill, PickXtimes, SwingXtimes, StopCube |
| 恒存(空间记忆) | VideoUnmask, VideoUnmaskSwap, ButtonUnmask, ButtonUnmaskSwap |
| 参照(物体记忆) | PickHighlight, VideoRepick, VideoPlaceButton, VideoPlaceOrder |
| 模仿(程序性记忆) | MoveCube, InsertPeg, PatternLock, RouteStick |
RoboMME 需要 Linux(ManiSkill/SAPIEN 使用 Vulkan 渲染)。建议使用 Docker 来隔离依赖冲突。
pip install --override <(printf 'gymnasium==0.29.1\nnumpy==1.26.4\n') \
-e '.[smolvla,av-dep]' \
'robomme @ git+https://github.com/RoboMME/robomme_benchmark.git@main'依赖说明:
mani-skill(由robomme引入)固化了gymnasium==0.29.1和numpy<2.0.0,这会与 lerobot 的基础numpy>=2.0.0冲突。这就是为什么robomme不是 pyproject 的额外依赖——请使用上面的覆盖安装方式,或使用下面的 Docker 方案来完全避免冲突。
# Build the RoboMME evaluation image from the repo root
docker build -f docker/Dockerfile.benchmark.robomme -t lerobot-benchmark-robomme .该 benchmark 的 Dockerfile 基于已发布的 huggingface/lerobot-gpu:latest 镜像扩展,然后覆盖 gymnasium==0.29.1 和 numpy==1.26.4。就 lerobot 实际的 API 使用而言,这两个版本在运行时都是安全的。
lerobot-eval \
--policy.path=<your_policy_repo> \
--env.type=robomme \
--env.task=PickXtimes \
--env.dataset_split=test \
--env.task_ids=[0] \
--eval.batch_size=1 \
--eval.n_episodes=1通过用逗号分隔任务名称,可在一次运行中评估多个任务。使用 task_ids 控制每个任务要评估哪些 episode。建议:测试划分中每个任务评估 50 个 episode。
lerobot-eval \
--policy.path=<your_policy_repo> \
--env.type=robomme \
--env.task=PickXtimes,BinFill,StopCube,MoveCube,InsertPeg \
--env.dataset_split=test \
--env.task_ids=[0,1,2,3,4,5,6,7,8,9] \
--eval.batch_size=1 \
--eval.n_episodes=50| 选项 | 默认值 | 描述 |
|---|---|---|
env.task | PickXtimes | 上面 16 个任务名称中的任意一个(逗号分隔) |
env.dataset_split | test | train、val 或 test |
env.action_space | joint_angle | joint_angle(8 维)或 ee_pose(7 维) |
env.episode_length | 300 | 每个 episode 的最大步数 |
env.task_ids | null | 要评估的 episode index 列表(null = [0]) |
dataset lerobot/robomme 采用 LeRobot v3.0 格式,可以直接加载:
from lerobot.datasets.lerobot_dataset import LeRobotDataset
dataset = LeRobotDataset("lerobot/robomme")| 特征 | 形状 | 描述 |
|---|---|---|
image | (256, 256, 3) | 前置相机 RGB |
wrist_image | (256, 256, 3) | 腕部相机 RGB |
actions | (8,) | 关节角度 + gripper |
state | (8,) | 关节位置 + gripper state |
simple_subgoal | str | 高层级语言标注 |
grounded_subgoal | str | 与场景关联的语言标注 |
episode_index | int | episode ID |
frame_index | int | episode 内的帧 |
环境包装器将其相机暴露在 pixels/<camera_name> 下,分别由 RoboMMEEnv.front_camera_name 和 RoboMMEEnv.wrist_camera_name 命名(默认分别为 camera1 和 camera2)。RoboMMEEnv 中的 features_map 将这两者映射到 policy 的 observation.images.camera1 和 observation.images.camera2。state 以 agent_pos 形式暴露,并映射到 observation.state。
dataset 的原始列与这些 policy 键不匹配,因此在 fine-tune 时需要传入 --rename_map:
--rename_map='{"image": "observation.images.camera1", "wrist_image": "observation.images.camera2", "state": "observation.state", "actions": "action"}'如果你使用不同的键名训练,请覆盖 --env.front_camera_name / --env.wrist_camera_name,以便评估 observation 与 policy 训练时所用的键一致。
| 类型 | 维度 | 描述 |
|---|---|---|
joint_angle | 8 | 7 个关节角度 + 1 个 gripper(−1 闭合,+1 张开,绝对量) |
ee_pose | 7 | xyz + roll/pitch/yaw + gripper |
通过 --env.action_space=joint_angle(默认)或 --env.action_space=ee_pose 设置。
robomme 依赖特定的 ManiSkill 分支(YinpeiDai/ManiSkill),通过 robomme 包自动引入。