跳转至

机器人学习仿真与评测

引言

为机器人学习选择仿真环境,需要同时考虑物理引擎、任务定义、演示数据和评测协议。本页围绕操作任务,说明如何把仿真接入数据采集、策略训练与闭环评测。物理引擎基础见机器人仿真,模型训练见VLA 微调与评测。

从研究问题选择环境

物理引擎负责动力学,任务环境定义观测、动作、奖励与重置,基准则进一步规定任务划分与统计方法。使用同一个引擎,不代表实验结果可以直接比较。

工具或基准 主要用途 适合回答的问题 实验前需要确认
ManiSkill 基于 SAPIEN 的操作环境,支持 GPU 并行物理与渲染 并行采样能否加快视觉策略训练? 控制器类型、批量观测结构、相机配置与显存占用
LIBERO 带语言指令与演示的操作任务套件 策略能否迁移空间、物体和目标知识? 使用的任务套件、演示版本、初始状态集合
SimplerEnv 面向特定真实机器人设置的仿真策略评测 仿真表现能否帮助比较对应真机设置下的策略? 机器人、视觉匹配设置、控制频率与动作接口
robomimic 从演示训练与评估策略的框架 数据质量和模仿学习算法如何影响成功率? 数据来源、状态或图像观测、配套环境与控制器

这些工具不处于同一层级:例如 robomimic 是学习框架,而不是独立物理引擎。对于足式运动控制,可从已有的 MuJoCo 和 Isaac Sim / Isaac Lab 章节入手。

LIBERO 的任务划分

LIBERO 提供 Spatial、Object、Goal、LIBERO-100 等任务集合;LIBERO-100 又划分为用于预训练的 90 个任务和用于评估的 10 个任务。具体任务与演示下载方式以官方仓库为准。

评测维度 需要观察的能力 建议的错误分析
空间关系 根据相对位置选择目标 把左侧物体误认为右侧、参考物选择错误
物体变化 在任务结构类似时识别不同物体 类别识别正确但抓取姿态不合适
目标变化 根据指令完成不同目标 操作动作正确但放置位置错误
多阶段任务 连续完成有依赖关系的操作 前半段成功,后半段因状态偏离而失败

报告中应明确采用原始终身学习协议,还是将任务合并后进行多任务训练。两者的数据可见范围不同。基准内成功率也不能直接解释为未见家庭环境中的泛化能力。

建立最小可复现实验

先用单环境完成“重置 → 读取观测 → 执行动作 → 判断结束 → 保存日志”,再启用并行环境和大模型。建议按以下顺序检查:

  1. 验证重置:物体没有初始穿透,关节处于合法范围,固定初始状态可以重放。
  2. 验证控制器:分别输入小幅平移、旋转、夹爪动作,确认单位、坐标系和正负方向。
  3. 回放演示:用数据中的动作驱动环境,观察能否接近原轨迹;不能仅验证视频播放正常。
  4. 运行基线:先使用环境自带策略或简单模仿学习策略,建立可比较的结果。
  5. 固定协议:保存任务列表、种子、初始状态、时间上限和成功判据,再接入 VLA。

下面是实验记录模板,不是某一框架可直接加载的配置。占位字段需要替换成实际值。

experiment:
  simulator_commit: "<commit>"
  benchmark_commit: "<commit>"
  task_suite: "<suite>"
  dataset_revision: "<revision>"
  policy_checkpoint: "<checkpoint>"
  seeds: [0, 1, 2]
control:
  physics_dt_s: 0.002
  action_dt_s: 0.05
  action_frame: "robot_base"
  action_type: "delta_pose"
evaluation:
  episodes_per_task: 50
  max_steps: 400
  save_failure_videos: true

这里的时间步长和评测次数仅为示例。复现已有基准时应保留其官方设置;修改控制周期或任务超时,会改变任务难度。随机种子也不是跨硬件逐位复现的保证,需要同时记录依赖、驱动和求解器设置。

物理、控制与相机的三种时钟

物理积分周期、动作更新周期、相机采样周期可以不同。例如物理以 500 Hz 积分,控制器以 20 Hz 更新目标,则一个目标保持 25 个物理步。若图像只有 10 Hz,策略不能把每个控制步都视为获得了一张新图像。

记录观测时应保存采样时间,动作日志应保存实际生效时间。模型推理完成时,输入图像可能已经过时;仿真评测若完全忽略这段延迟,会高估闭环响应能力。动作块的延迟预算见VLA 微调与评测。

并行采样与重置边界

ManiSkill 将并行环境的数据表示为带批次维度的张量,接口与性能说明见其 GPU 仿真文档。接入自定义策略时重点检查:

  • 某个环境结束后,只清空该环境的历史图像、动作队列和循环网络状态。
  • 保存最后观测时,区分终止帧和自动重置后的第一帧,避免把两个 episode 拼接。
  • 相机、奖励和动作的批次索引保持一致,避免将环境 A 的动作发给环境 B。
  • 区分任务终止与时间上限截断;离线学习中的回报计算需要明确截断语义。

比较吞吐量时同时报告环境数、图像分辨率、相机数量、是否渲染、是否包含模型推理,以及每秒总 transition 数。只报告“步/秒”容易混淆批量步数与所有环境的步数总和。

域随机化与仿真到现实

先建立能匹配真实系统的基准参数,再逐项增加随机化;否则无法判断改进来自鲁棒性还是任务被意外简化。下面是一种实验设计方式。

因素 可以改变的参数 应保留的检查
视觉 光照、背景、材质、相机外参 目标仍可见,语言中的颜色和位置关系仍成立
动力学 质量、摩擦、关节阻尼 物体稳定,任务仍然可完成
执行器 延迟、限速、控制增益 动作接口与真机一致,没有超出设备范围
感知 噪声、丢帧、时间偏移 分布来自测量或明确假设,保留无扰动对照组

训练随机化范围与测试范围应分别记录。先做单因素扫描找出敏感因素,再做组合压力测试。SimplerEnv 的视觉匹配和变体聚合可作为评测设计参考,但其结果不能自动推广到任意机器人与任务。项目说明

评测应保存什么

除每个任务的成功次数与总次数外,保存完成时间、失败阶段、碰撞事件、推理延迟和完整 episode 标识。报告任务平均成功率时说明是否等权;如果每个任务试验次数不同,所有 episode 的总成功率与任务平均值可能不同。

应保留所有试验的结果,而不是只保留成功视频。小样本实验中的几次成功差异可能来自初始状态或随机采样,比较模型时应使用相同的评测设置,并报告重复实验的波动。

先验证物理,再训练策略

场景能渲染出来,并不表示它适合训练。策略可能利用接触穿透、不合理的关节阻尼或错误的成功判据获得高分。建议在接入学习算法之前,完成以下小实验。

小实验 记录量 可以发现的问题
物体自由下落并静置 高度、速度、稳定后的穿透量 质量、碰撞几何、接触参数或时间步长异常
单关节阶跃响应 目标与实际角度、超调、稳定时间 控制增益过高、力矩饱和、阻尼不匹配
夹持后缓慢提起 夹爪开度、物体位姿、接触状态 夹爪闭合方向错误、摩擦过低、物体碰撞体不合适
固定动作序列回放 末端与物体轨迹 重置不完整、控制周期变化、执行器配置不同
对时间步长做敏感性扫描 成功率、轨迹偏差、仿真耗时 策略依赖数值误差而非稳定的任务机制

改变物理步长时,应保持控制周期不变,并相应调整每个控制周期内的物理步数;否则实验同时改变了动力学求解精度和策略频率。比较接触轨迹时允许合理的数值差异,重点观察任务结果和误差是否随步长变化出现明显异常。

可以先运行 MuJoCo 的无窗口控制示例,检查状态推进与控制周期,再把同样的记录方式迁移到完整机器人模型中。

合成演示如何进入训练集

合成数据可以来自脚本控制器、运动规划器、遥操作或已训练策略。不同来源的失败模式不同,应在数据卡中记录生成方法;“仿真中成功”也不能代替轨迹质量检查。

  1. 采样任务条件:生成物体、初始位姿和语言目标,并记录随机种子与资产版本。
  2. 生成候选轨迹:运行控制器,保存观测、状态、实际发出的动作与时间戳。
  3. 独立检查成功:根据物体是否进入目标区域、是否稳定放置等任务条件判断,而非只看累积奖励。
  4. 检查可学习性:确认相机能看到完成任务所需的信息,过滤依赖隐藏状态才能判断下一步的模糊样本,或补充合法的历史观测。
  5. 分层保存:区分完整成功、成功恢复、失败和无效仿真,保留失败原因用于分析。
  6. 划分后再增广:同一条轨迹的背景变体和相机重渲染版本归入同一划分,防止重复内容泄漏。

使用真值状态的专家可以生成示范,但部署策略的输入必须受限于实际可获得的观测。例如专家通过物体真值位姿规划抓取,学生仍然只能读取相机和关节状态。评测时若不小心把真值目标位姿传给学生,就改变了研究问题。

只改变渲染材质而保持物理不变时,可以复用原轨迹;改变质量、摩擦或碰撞体后,需要重新执行并验证动作,不能把原来的成功标签直接沿用。视觉变化还应与语言标签一致,例如把红杯改成蓝杯时需要检查原指令是否仍成立。

从成功次数到统计结果

假设每个任务 有 次试验,其中 次成功。单任务成功率为 ,任务等权平均为

下面用 Python 标准库计算单任务的 Wilson 区间,公式见 NIST 比例置信区间说明。它针对独立二项试验给出近似置信区间;多任务平均、重复场景导致的相关性,以及训练种子之间的波动,需要另外处理。

from math import sqrt


def wilson_interval(successes, trials, z=1.96):
    if trials <= 0 or not 0 <= successes <= trials:
        raise ValueError("需要正试验次数,且成功次数处于合法范围")
    p = successes / trials
    denominator = 1 + z * z / trials
    center = (p + z * z / (2 * trials)) / denominator
    radius = z * sqrt(p * (1 - p) / trials + z * z / (4 * trials**2))
    radius /= denominator
    return center - radius, center + radius


low, high = wilson_interval(40, 50)
print(f"成功率 80.0%,约 95% 区间 [{low:.1%}, {high:.1%}]")

40/50 对应的区间约为 67.0%–88.8%,说明一次小样本评测的 80% 并不是精确的能力常数。比较两个策略时,使用相同初始状态形成配对试验,并记录每个 episode 的成功与失败,而不是只比较两个均值。不要把同一轨迹中的视频帧当作独立试验扩大样本量。

建议发布一个结果表,至少包含模型、检查点、任务、评测种子、初始状态标识、成功标志、步数、失败原因和延迟分位数。日志与视频共用 episode 标识,才能从统计异常追溯到具体行为。

参考资料