来自 roadmap #1252 第 2 点的遗留部分(该 roadmap 已检查关闭)。
现状(已落地部分)
mjlab 的 expand_model_fields() 机制已移植到 unisim mjwarp 后端(UniLab PR #1401,后随 backend 抽取进入 unisim):
unisim/backend/mjwarp/randomization.py:47 — expand_model_fields() 把声明字段 tile 成 per-world (nworld, ...) Warp 数组,带分级重算(SET_CONST_FIELDS / SET_CONST_0_FIELDS / NO_RECOMPUTE_FIELDS);
unisim/backend/mjwarp/backend.py:250 — 构造期冷路径展开,先于 CUDA graph capture,后续 DR 写入全部原地 assign,graph-safe;
- 写入路径
_apply_reset_randomization(backend.py:1293):host mirror → 整数组上传 → set_const* 重算;mujoco CPU 后端经 mujoco_uni native 字段注册表天然 per-env。
遗留缺口(本 issue 的范围)
- 声明式 per-term 字段声明层缺失:mjlab 的
@requires_model_fields(*fields, recompute=...)(mjlab managers/event_manager.py:70)让每个 DR term 在定义处声明所需模型字段,env 收集后按需展开;当前 unisim 无条件展开硬编码的 EXPANDED_MODEL_FIELDS 超集(randomization.py:25-44),DR 关闭时也付内存成本,字段→重算级别映射硬编码在 backend 而非 term 声明处。
- 字段 schema 封闭且偏窄:
unisim/dr/types.py 的 11 个 RESET_TERM_* 常量之外,新增字段(如 dof_frictionloss、dof_damping、jnt_stiffness、qpos0、tendon/material 等)需要同时动 types、各 backend 翻译层、mujoco_uni native 注册表和 src/unilab/dr/dr_utils.py;mjlab 的 _randomize_model_field 是通用引擎。
- 重算分级较粗:3 档 vs mjlab 4 档(含
set_const_fixed)。
- per-world gravity:mujoco 支持,mjwarp fail-closed(
backend.py:133 类 docstring 明示)。
交付边界
- 在 unisim 侧引入 per-term 声明与需求驱动展开(
unisim/dr/types.py + mjwarp backend),UniLab src/unilab/dr/ 的 term/provider 层对接声明;保持 DomainRandomizationCapabilities fail-closed 过滤契约不变;
- 测试沿用
tests/base/test_mjwarp_dr.py 的真实 CUDA 效应测试模式(per-world 隔离、物理效应、跨后端分布对照)。
预计规模:接近 roadmap 估计上限(约 15 文件 / 800 行),跨 unisim + UniLab 两仓,unisim 侧先行发版。
参照:mjlab v1.6.0 src/mjlab/envs/mdp/dr/、src/mjlab/sim/randomization.py(本机 /home/user/ws/simulator/mjlab)。
来自 roadmap #1252 第 2 点的遗留部分(该 roadmap 已检查关闭)。
现状(已落地部分)
mjlab 的
expand_model_fields()机制已移植到 unisim mjwarp 后端(UniLab PR #1401,后随 backend 抽取进入 unisim):unisim/backend/mjwarp/randomization.py:47—expand_model_fields()把声明字段 tile 成 per-world(nworld, ...)Warp 数组,带分级重算(SET_CONST_FIELDS/SET_CONST_0_FIELDS/NO_RECOMPUTE_FIELDS);unisim/backend/mjwarp/backend.py:250— 构造期冷路径展开,先于 CUDA graph capture,后续 DR 写入全部原地assign,graph-safe;_apply_reset_randomization(backend.py:1293):host mirror → 整数组上传 →set_const*重算;mujoco CPU 后端经mujoco_uninative 字段注册表天然 per-env。遗留缺口(本 issue 的范围)
@requires_model_fields(*fields, recompute=...)(mjlabmanagers/event_manager.py:70)让每个 DR term 在定义处声明所需模型字段,env 收集后按需展开;当前 unisim 无条件展开硬编码的EXPANDED_MODEL_FIELDS超集(randomization.py:25-44),DR 关闭时也付内存成本,字段→重算级别映射硬编码在 backend 而非 term 声明处。unisim/dr/types.py的 11 个RESET_TERM_*常量之外,新增字段(如dof_frictionloss、dof_damping、jnt_stiffness、qpos0、tendon/material 等)需要同时动 types、各 backend 翻译层、mujoco_uninative 注册表和src/unilab/dr/dr_utils.py;mjlab 的_randomize_model_field是通用引擎。set_const_fixed)。backend.py:133类 docstring 明示)。交付边界
unisim/dr/types.py+ mjwarp backend),UniLabsrc/unilab/dr/的 term/provider 层对接声明;保持DomainRandomizationCapabilitiesfail-closed 过滤契约不变;tests/base/test_mjwarp_dr.py的真实 CUDA 效应测试模式(per-world 隔离、物理效应、跨后端分布对照)。预计规模:接近 roadmap 估计上限(约 15 文件 / 800 行),跨 unisim + UniLab 两仓,unisim 侧先行发版。
参照:mjlab v1.6.0
src/mjlab/envs/mdp/dr/、src/mjlab/sim/randomization.py(本机/home/user/ws/simulator/mjlab)。