DEEP 125 · 第十一辑 · 服务与训练工具逐函数 · LEARN NOTES

收进学习手册 · 2026-09-11 · duck.whatled.com

解读 125 · mdp.py(四):事件与随机化函数

解读对象:microduck-replica/upstream/microduck_rl/src/mjlab_microduck/tasks/mdp.py,抽读事件/reset 与域随机化函数(全文件 7188 行)
需要的前置:解读 26(事件 term 时机与"BAM 三兄弟"速览)、解读 54(执行器模型背景)

event term 是在特定时机(重置时、每隔几秒、每步)对仿真动手的函数。域随机化(DR, domain randomization)是其中一大类:故意把物理参数抖开,逼策略学会鲁棒。本篇按"动手对象"分三组。

动手在初速度:重置热启动

reset_with_forward_velocity(158-226 行)让一部分环境"出生即在走":按 fraction_stages(默认 [{"step":0,"fraction":0.8}],可随训练降到 0)抽签,给抽中的环境沿机体朝向写入 0.3–0.8 m/s 前向速度。两个细节值钱:一是四元数必须读 qpos 而非 root_link_quat_w(199-202 行注释)——后者依赖 sim.forward() 刷新,刚写完的朝向还没生效;二是顺手把四个被动轮转速设为 v/r(轮半径 0.0175 m,218-226 行),否则第一轮接触就是"底座在动、轮子不动"的打滑。roller 任务的同款是 reset_rolling_entry(1055-1090 行)。

动手在执行器:增益、延迟与 BAM 摩擦

这组函数不碰 MuJoCo 模型,而是调执行器自己的接口。randomize_delayed_actuator_gains(3146-3194 行)对 BamActuator 逐关节采样 kp/kd 缩放,再按环境平均成单标量写入——执行器只接受全局缩放;先 reset_gains 恢复标称再 set_gains,防止逐回合累积。延迟(动作滞后几拍)本身在执行器配置里(delay_min_lag/delay_max_lag,见解读 127),与增益同属"伺服不完美"随机化。摩擦更绕:BAM 自己算摩擦,MuJoCo 的 dof_frictionloss 被清零(3220-3223 行注释),所以 randomize_bam_friction(3212-3240 行)随机的是执行器的 friction_scale(库仑+Stribeck+负载摩擦的乘数);而 expand_bam_friction_fields(3197-3209 行)是带装饰器的空函数——@requires_model_fields("dof_frictionloss", "dof_damping") 的唯一作用是让 mjlab 把这两个模型字段按环境展开,BAM 每步要写它们,不注册这个事件就会崩。

动手在模型与初始状态:质量、CoM、IMU 与姿势

还有一个不像随机化的 Reset 事件:apply_mouth_payload_force(3102-3138 行)把 sample_mouth_payload(3085-3099 行,每次重置抽 0.01–0.04 kg)存好的"嘴里物体"重量,在叼起相位后作为外力施加到嘴尖 site——挂在奖励表里当权重为 0 的钩子,返回永远是 0。

你带走的收获

延伸

什么鸭 WHATDUCK · 复刻学习笔记 ← 全部手册 · 首页