总览 / SimplerEnv · D51
SimplerEnv:真实策略的 real-to-sim 排名复现
Google Robot / WidowX 真机映射、Pearson 与 MMRV 保序性评估全文。
项目定位
SimplerEnv 是一个面向真实机器人操作策略的 real-to-sim 评估框架:把 Google Robot、WidowX+Bridge 等真实机器人设置映射到仿真环境中,用统一的任务、控制接口和评估流程比较 RT-1、RT-1-X、Octo 等策略。
它的重点不是训练策略,而是解决“如何在仿真中更可靠、可复现地评估真实世界策略”的问题。
Stack
- 语言: Python 为主,配合 Shell 和 Jupyter Notebook
- 仿真引擎: SAPIEN
- 环境基准: 基于 CPU-oriented ManiSkill2,并通过
ManiSkill2_real2sim扩展为真实机器人到仿真的评估环境 - 策略支持: RT-1 / RT-1-X、Octo
- 主要依赖: TensorFlow、JAX、Octo、TF-Agents、Gymnasium、transforms3d
1. 任务集
1.1 两类机器人设置
项目当前主要覆盖两种真实机器人配置:
| 机器人设置 | 典型策略 | 控制频率 |
|---|---|---|
| Google Robot | RT-1、RT-1-X、Octo | 3 Hz |
| WidowX + Bridge | RT-1-X、Octo | 5 Hz |
仿真内部的 simulation frequency 大约为 500 Hz,默认 evaluator 中为 513 Hz。
1.2 Google Robot 任务
Google Robot 任务主要来自 Fractal / RT-1 风格的桌面操作:
| 任务 | 含义 |
|---|---|
google_robot_pick_coke_can | 抓取打开的 Coke Can |
google_robot_pick_object | 抓取随机物体 |
google_robot_move_near | 将末端或物体移动到目标附近 |
google_robot_open_drawer | 打开抽屉 |
google_robot_close_drawer | 关闭抽屉 |
google_robot_place_in_closed_drawer | 将物体放入关闭的抽屉 |
项目还支持任务变体,例如:
google_robot_pick_horizontal_coke_cangoogle_robot_pick_vertical_coke_cangoogle_robot_pick_standing_coke_cangoogle_robot_open_top_drawergoogle_robot_open_middle_drawergoogle_robot_open_bottom_drawer
抽屉类任务可以组成多阶段、长时程任务。环境在子任务完成后会更新语言指令,evaluator 可以调用 advance_to_next_subtask() 继续执行后续阶段。
1.3 WidowX + Bridge 任务
| 任务 | 含义 |
|---|---|
widowx_spoon_on_towel | 将勺子放到毛巾上 |
widowx_carrot_on_plate | 将胡萝卜放到盘子上 |
widowx_stack_cube | 将绿色方块堆到黄色方块上 |
widowx_put_eggplant_in_basket | 将茄子放入篮子 |
这些任务更接近 Bridge 数据集中的桌面操作场景。
1.4 任务变化方式
任务本身之外,评估器还会系统性改变:
- 机器人初始位置
robot_init_x / robot_init_y - 机器人初始旋转
- 物体初始位置
- 预定义 object episode
- 场景背景
- 光照
- 桌面纹理
- distractor
- 是否开启 ray tracing
- 用于输入的相机
- 是否叠加真实图像背景
因此 SimplerEnv 的任务集不是单个固定场景,而是:
任务语义 × 机器人初始状态 × 物体状态 × 场景外观 × 策略设置
这也是它比普通仿真 benchmark 更接近真实策略评估的地方。
2. 引擎与本体
2.1 仿真引擎
项目的底层组合是:
SAPIEN
└── ManiSkill2_real2sim
├── 机器人 agent
├── 控制器
├── 物体和场景资产
├── custom environments
└── real-to-sim rendering / overlay
核心环境创建入口是:
simpler_env/utils/env/env_builder.pysimpler_env/evaluation/maniskill2_evaluator.py
环境通过 Gymnasium 风格的 gym.make() 创建,但实际注册和实现来自 ManiSkill2_real2sim。
2.2 支持的机器人本体
当前重点是:
google_robot_staticwidowx
机器人本体由以下部分组成:
- URDF、mesh 和材质
- Robot agent 实现
- 末端执行器和夹爪控制器
- 相机
- 控制参数
- 系统辨识得到的动力学参数
添加一个新机器人时,项目要求:
- 在
assets/descriptions中加入 URDF - 在
agents/robots中实现 agent - 配置机械臂和夹爪 controller
- 添加相机内参和相机位姿
- 进行 system identification
- 用 SAPIEN viewer 和手动控制脚本验证
2.3 控制接口统一
无论策略来自 RT-1 还是 Octo,最终都会转换为统一的 7 维动作:
[dx, dy, dz, droll/dpitch/dyaw, gripper]
在代码中,策略先输出自己的原始动作格式,然后经过转换:
- 平移动作:
world_vector - 旋转动作:转换为 axis-angle 后放入
rot_axangle - 夹爪动作:根据不同机器人进行反转、二值化或 sticky repeat
- 终止信号:
terminate_episode
例如:
- RT-1 对 Google Robot 使用 axis-angle
- RT-1 对 WidowX 使用 RPY,再转换为 axis-angle
- Octo 输出 RPY,也会经过
euler2axangle - WidowX 夹爪动作会根据 Bridge 的约定进行反转或二值化
- Google Robot 的夹爪动作支持多帧 sticky control
这层 adapter 很重要,因为不同策略和不同机器人对动作空间的定义并不一致。
2.4 Real-to-sim 的两种评估设置
Visual Matching
Visual Matching 的思路是:
- 准备真实世界图像;
- 将机器人和可交互物体从真实图像中移除;
- 对真实背景进行 inpainting;
- 把处理后的真实背景叠加到仿真渲染结果上;
- 让策略看到更接近真实评估环境的图像。
代码中由 rgb_overlay_path 和 rgb_overlay_cameras 控制。默认情况下:
- Google Robot 使用
overhead_camera - WidowX 使用
3rd_view_camera
Variant Aggregation
Variant Aggregation 不依赖单一仿真场景,而是构造多个环境变体,例如:
- 不同背景
- 不同光照
- 不同桌面纹理
- 不同 distractor
- 不同机器人和物体初始位姿
最后对多个变体的成功率进行汇总。
两者的区别可以概括为:
| 设置 | 目标 |
|---|---|
| Visual Matching | 尽量让仿真观测接近某个真实场景 |
| Variant Aggregation | 通过多个仿真变体降低单一场景偏差 |
3. 评估指标和分数基线
3.1 基本分数:任务成功率
每个 episode 最终记录为:
success = 1
failure = 0
在 maniskill2_evaluator.py 中,环境返回 done 后将 episode 标记为成功,并保存:
- success / failure
- episode statistics
- 仿真视频
- 动作轨迹可视化
- 环境配置和初始状态
因此最直接的策略分数是:
某任务在多个初始状态和多个场景变体下的平均成功率
3.2 与真实机器人表现对齐的两个指标
项目提供两个主要的 real-to-sim 指标。
Pearson Correlation
pearson_correlation(perf_sim, perf_real)
它衡量不同策略在仿真中的相对表现,是否和真实世界中的相对表现一致。
例如真实世界中:
策略 A > 策略 B > 策略 C
如果仿真中也保持类似排序,则 Pearson correlation 较高。
它关注的是整体相关性,而不是仿真分数与真实分数是否完全相等。
Mean Maximum Rank Violation,MMRV
mean_maximum_rank_violation(perf_sim, perf_real)
MMRV 衡量策略排序发生错误时,造成的最大真实性能差距。
直观地说,如果仿真错误地认为一个明显较差的策略优于另一个策略,那么对应的真实性能差距会贡献较大的 rank violation。
因此:
- Pearson 越高越好
- MMRV 越低越好
项目用这两个指标评价一个仿真评估方法是否能复现真实世界中的策略相对排名。
3.3 仓库内置的真实世界和 SIMPLER 基线
数据位于:
simpler_env/utils/metrics.py
其中:
REAL_PERF:真实机器人实验成功率SIMPLER_PERF:SimplerEnv 仿真成功率
这些不是运行时重新测得的结果,而是仓库提供的论文实验基线。
Google Robot 任务
| 任务 | 策略 | Real | SIMPLER |
|---|---|---|---|
| Pick Coke Can | RT-2-X | 0.907 | 0.787 |
| RT-1-Converged | 0.853 | 0.857 | |
| RT-1-15% | 0.920 | 0.710 | |
| RT-1-X | 0.760 | 0.567 | |
| RT-1-Begin | 0.133 | 0.027 | |
| Octo-Base | 0.293 | 0.170 | |
| Move Near | RT-2-X | 0.733 | 0.779 |
| RT-1-Converged | 0.633 | 0.442 | |
| RT-1-15% | 0.583 | 0.354 | |
| RT-1-X | 0.450 | 0.317 | |
| RT-1-Begin | 0.017 | 0.050 | |
| Octo-Base | 0.350 | 0.042 | |
| Open Drawer | RT-2-X | 0.333 | 0.157 |
| RT-1-Converged | 0.815 | 0.601 | |
| RT-1-15% | 0.704 | 0.463 | |
| RT-1-X | 0.519 | 0.296 | |
| RT-1-Begin | 0.000 | 0.000 | |
| Octo-Base | 0.148 | 0.009 | |
| Close Drawer | RT-2-X | 0.630 | 0.343 |
| RT-1-Converged | 0.926 | 0.861 | |
| RT-1-15% | 0.889 | 0.667 | |
| RT-1-X | 0.741 | 0.891 | |
| RT-1-Begin | 0.000 | 0.278 | |
| Octo-Base | 0.519 | 0.444 | |
| Place Apple in Closed Drawer | RT-2-X | 0.074 | 0.037 |
| RT-1-Converged | 0.185 | 0.065 | |
| RT-1-15% | 0.185 | 0.130 | |
| RT-1-X | 0.407 | 0.213 | |
| RT-1-Begin | 0.000 | 0.000 | |
| Octo-Base | 0.000 | 0.000 |
WidowX + Bridge 任务
| 任务 | 策略 | Real | SIMPLER |
|---|---|---|---|
| Spoon on Towel | RT-1-X | 0.000 | 0.000 |
| Octo-Base | 0.333 | 0.125 | |
| Octo-Small | 0.417 | 0.472 | |
| Carrot on Plate | RT-1-X | 0.000 | 0.042 |
| Octo-Base | 0.250 | 0.083 | |
| Octo-Small | 0.083 | 0.097 | |
| Stack Cube | RT-1-X | 0.000 | 0.000 |
| Octo-Base | 0.000 | 0.000 | |
| Octo-Small | 0.125 | 0.042 | |
| Eggplant in Basket | RT-1-X | 0.000 | 0.000 |
| Octo-Base | 0.250 | 0.431 | |
| Octo-Small | 0.400 | 0.569 |
项目可以直接运行:
python3 tools/calc_metrics.py
来计算每个任务的 MMRV 和 Pearson correlation。
3.4 额外的统计工具
metrics.py 还提供:
- 从视频文件名中提取 success / failure
- 将成功率转换为无序 trial 结果
- Kruskal-Wallis 检验
- 对多个 checkpoint 的仿真结果和真实结果进行比较
这说明项目不仅关注“平均成功率”,也支持分析:
- 策略排序是否一致
- 某个 checkpoint 的仿真和真实分布是否显著不同
- 评估结果是否受 trial 顺序影响
4. 支持 Harness 做了什么优化
仓库中没有一个单独名为 harness 的目录或外部 benchmark harness 集成。更准确地说,SimplerEnv 自己实现了一个面向 real-to-sim policy evaluation 的评估 harness,主要优化的是评估流程的可配置性、可复现性和诊断能力。
4.1 用参数化 evaluator 统一评估流程
核心入口是:
simpler_env/main_inference.pysimpler_env/evaluation/argparse.pysimpler_env/evaluation/maniskill2_evaluator.py
运行流程是:
命令行参数
→ 创建 RT-1 / Octo 模型
→ 构造 ManiSkill2 环境
→ 重置机器人和物体初始状态
→ 获取图像和语言指令
→ 策略推理
→ 动作适配与环境执行
→ 记录成功率、视频、动作轨迹
同一套 evaluator 可以切换:
rt1octo-baseocto-small- Google Robot
- WidowX
- 不同任务
- 不同场景
- 不同相机
- 不同初始状态
- Visual Matching
- Variant Aggregation
这避免了每个策略、每个任务各写一套评估代码。
4.2 自动进行初始状态 sweep
argparse.py 支持通过区间和采样数量生成初始状态,例如:
- 机器人 x / y 位置
- 机器人 roll / pitch / yaw
- 物体 x / y 位置
- episode id
例如:
robot_init_x_range
robot_init_y_range
robot_init_rot_rpy_range
obj_init_x_range
obj_init_y_range
obj-episode-range
maniskill2_evaluator.py 随后对这些配置做笛卡尔积遍历。
这使得评估不再依赖单个手工选择的初始状态,而是可以进行批量 robustness evaluation。
4.3 支持两种对象变化模式
评估器提供:
--obj-variation-mode xy
--obj-variation-mode episode
分别对应:
- XY 模式: 对同一个对象采样多个平面位置;
- Episode 模式: 使用预定义的 episode id。
这让项目同时支持:
- 连续空间鲁棒性测试
- 数据集式固定场景复现
4.4 自动处理不同策略的动作语义
RT-1 和 Octo 的原始输出格式不同,Google Robot 和 WidowX 的控制约定也不同。harness 在策略输出与仿真动作之间加入了统一 adapter:
- 图像 resize
- 语言 embedding 或 task token 处理
- 动作反归一化
- 平移尺度调整
- RPY 转 axis-angle
- 夹爪动作反转
- 夹爪二值化
- sticky gripper
- action ensemble
- policy state reset
例如 Octo:
- 使用 image history
- 使用 action horizon
- 支持 action ensemble
- 对 Google Robot 使用 15 次 sticky gripper repeat
- 对 WidowX 使用 Bridge 数据集的动作统计量
这类处理让策略的输出更接近其真实机器人部署时的控制行为,而不是直接把原始网络输出塞进仿真器。
4.5 Visual Matching 的输入自动配置
env_builder.py 会根据机器人类型自动选择 overlay camera:
Google Robot → overhead_camera
WidowX → 3rd_view_camera
因此调用 evaluator 时只需要提供 rgb_overlay_path,不必每次手动配置相机。
这降低了不同机器人配置之间的使用成本,也减少了 camera mismatch。
4.6 对长时程任务提供子任务推进
evaluator 不只处理单步任务:
- 策略输出
terminate_episode - 如果当前不是最终子任务,则调用
env.advance_to_next_subtask() - 环境生成新的语言指令
- 策略获得新的任务描述并更新状态
- 继续执行后续阶段
这使抽屉、放置等任务可以作为多阶段任务进行评估。
4.7 完整记录评估证据
每个 episode 会记录:
- success / failure
- 环境名称
- 场景名称
- 控制模式
- checkpoint
- 机器人初始位姿
- 物体初始位置或 episode id
- overlay 图像
- episode statistics
- 仿真视频
- 策略动作曲线
保存路径中还编码了大量实验配置,便于后续按条件汇总结果。
此外,项目还提供:
tools/merge_videos.pytools/save_video_frame.pysimpler_env/utils/debug/*visualize_epoch()
用于定位:
- 策略动作是否异常
- 真实视频输入下策略是否行为合理
- 机器人与物体是否发生穿模
- 夹爪控制是否反向
- 仿真动作是否和真实动作尺度一致
4.8 限制 GPU 内存和控制随机性
main_inference.py 中专门处理了 TensorFlow 和 JAX 的资源问题:
- 设置
XLA_PYTHON_CLIENT_PREALLOCATE=false - 对 TensorFlow 设置 GPU memory limit
- Octo 支持
octo_init_rng - 初始化 RNG 时额外对齐 Octo server 的 seed 行为
这不是算法层面的优化,但对稳定运行多个策略评估进程、减少 GPU OOM 和提高结果可复现性很重要。
总结
SimplerEnv 可以概括为四层:
任务集
Google Robot / WidowX 的真实操作任务和任务变体
引擎与本体
SAPIEN + ManiSkill2_real2sim + 机器人、物体、相机和控制器
评估指标与基线
成功率 + Pearson + MMRV
内置真实世界与 SIMPLER_PERF 对照数据
评估 Harness
参数 sweep、Visual Matching、Variant Aggregation、
动作适配、长时程子任务、视频和轨迹记录、可复现实验配置
它最核心的贡献不是单纯“提供几个仿真任务”,而是把:
真实机器人策略、仿真环境、视觉匹配、状态变化、动作控制和真实世界分数对齐
整合成了一套可重复运行的策略评估管线。