面向真机迁移的域随机化¶
本页是域随机化的部署检查清单。关于契约层(一个 DR provider 必须实现什么),见 Domain Randomization 契约。
随机化什么,按优先级排序¶
类别 |
示例 |
为什么重要 |
|---|---|---|
执行器动力学 |
PD 增益、动作缩放、任务 owner 启用时的单步动作延迟 |
硬件上策略振荡的首要驱动因素。 |
质量 / 惯量 |
躯干质量、连杆质心偏移、负载 |
影响平衡与跟踪裕度。 |
摩擦 |
足 ↔ 地面 μ、手 ↔ 物体 μ |
手内方块任务没有它就会失败。 |
观测噪声 |
IMU 噪声、关节编码器偏置、部署侧观测历史 |
让 actor 输入贴近部署侧传感器行为。 |
外力 |
推力、阵风、对负载的拖拽 |
对未建模扰动的鲁棒性。 |
复位状态 |
初始姿态、初始速度 |
降低在回合边界处的脆弱性。 |
经验法则
如果某个参数会实质性地影响闭环响应,而你又没有部署侧的测量,那就不要把相关结论写进 文档;只有在记录了为何该范围合理之后,才在任务 owner 中编码一个保守范围。
UniLab 如何组织 DR¶
使用 DR 的任务通过环境初始化路径挂接一个 provider:
from unilab.envs.locomotion.common.dr_provider import LocomotionDRProvider
class MyTaskEnv(NpEnv):
def __init__(self, cfg):
super().__init__(cfg)
self._init_domain_randomization(LocomotionDRProvider(cfg.domain_rand))
管理器位于 src/unilab/dr/manager.py;provider 位于其环境 owner 附近,并遵循
Domain Randomization 契约 中的契约。
配方:起始范围¶
把所选的 owner YAML 作为权威来源。例如,
conf/ppo/task/go2_joystick_rough/mujoco.yaml 启用了基座质量、质心、kp/kd 以及推力
随机化;conf/ppo/task/sharpa_inhand/mujoco.yaml 配置了 PD 增益、摩擦、质心、质量、
关节噪声与接触噪声字段。
# conf/ppo/task/go2_joystick_rough/mujoco.yaml
env:
domain_rand:
randomize_base_mass: true
added_mass_range: [-1.0, 3.0]
random_com: true
randomize_kp: true
kp_multiplier_range: [0.5, 2.0]
randomize_kd: true
kd_multiplier_range: [0.5, 2.0]
push_robots: true
push_interval: 625
课程:随技能逐步加大 DR¶
在第 0 步就过于激进的 DR 会让学习停滞。UniLab 的课程辅助工具由任务自身拥有;把它们的 字段保留在所选的 owner YAML 中,不要在训练脚本里添加 Python 侧的解释。
验证 DR 覆盖¶
训练之后,在配置中扫动 DR 范围的同时,对照同一后端 owner YAML 回放检查点:
uv run eval --algo ppo --task go2_joystick_flat --sim motrix --load-run -1
为每个扫动点记录奖励分量与任务成功指标。一次陡降或奖励分量的不连续,就是 DR 范围 改变了任务契约、而不仅仅是拓宽部署覆盖的证据。