解读 29 · spin 与 roulade:特技动作的任务设计
解读对象:
tasks/microduck_spin_env_cfg.py(485 行)、tasks/microduck_roulade_env_cfg.py(772 行)
需要的前置:解读 27(发现期不上税)、解读 31(镜像损失)、总纲
在做什么
两个「表演型」任务,代表两种截然不同的评价函数写法。spin(microduck_spin_env_cfg.py)让装着四个被动滚轮的机器人原地自转约一圈:命令槽被 GroundPickPhaseCommand 占用,输出 [cos 2πφ, sin 2πφ, 0] 相位编码(:381),randomize_phase=False 保证每集都从站立、相位 0 开始——和真机上按按钮的时机一致(:379-380)。roulade(microduck_roulade_env_cfg.py)是前滚翻:站立出发,从平头顶滚过去,再站起来;策略切换即触发,没有相位钟。
真实符号:spin 怎么定义「转得好」
主目标 spin_rate_track(权重 6.0,std 1.5,:138)让躯干偏航角速度跟踪梯形包络 ω*(φ):加速段、保持段、刹车段,常数 SPIN_RATE_MAX 等都定义在 mdp.py 里。但「转得好」还要同时满足四个侧面:spin_stay_in_place(权重 -3.0,:157)惩罚质心平移——这是区分「身体中心的 spin」和「单轮上的偏心 pivot」的唯一项;spin_wheel_differential(:167)奖励左右轮反向滚动,把旋转压到「差动滚动」这个四被动轮上唯一可靠的物理机制上;spin_grounded(:187)要求两脚都在地上;leg_antisymmetry(:177)用髋/膝的「剪刀」动作做点火器,然后由课程在 1500/3000 迭代把权重从 1.0 衰减到 0.25——脚手架用完就拆(:409-419)。一个负向细节:angular_momentum 被刻意删除(:122-126),因为它惩罚 3D 角动量范数,会直接对抗自转;留下的 body_ang_vel 只罚 x/y 分量。
真实符号:roulade 怎么定义「滚得好」
核心是支撑门控的旋转累加器:奖励 roulade_progress(权重 8.0,:232)只支付「到目前为止的最大累计前向旋转」的增量,且仅在机器人某处触地时计数——弹道式的甩翻挣不到进度,总支付封顶 2π 的量,原地扎营每步为零。超额速度要弃权(max_paid_rate = 5.0,实测过头顶的物理滚转本来就跑 3.5–5.5 rad/s,:241)并另缴 roulade_overspeed 的税(阈值 7.0,:246)。落地奖励全部被旋转门控:LANDING_GATE_LO/HI = 260°/330°(:113),滚没滚完,站立的「年金」(roulade_landing_composite 4.0、roulade_stand_tax 5.0)就不生效——「啥也不干」的策略什么都拿不到。
最值得抄的是反向课程:一半的集数直接出生在滚转到 50°–340° 之间的蜷缩姿态(MIDROLL_PITCH_MIN/MAX,:92),带 0–3 rad/s 前向角动量,累加器预置到出生角。前半段滚翻难发现,后半段本质是 standup 已经解决过的仰卧起身问题——把难的部分变成出生点,课程 roulade_spawn_mix 再随训练把比例从 0.5 挪回 0.8 站立开局(:637)。头也是任务的一部分:head_ground_contact 传感器盯 jaw_soft 体(:177),「过头顶接触闩」配合下巴收紧的 TUCK_OVERRIDES(neck_pitch −1.0 / head_pitch +1.0,:101),把侧滚作弊(从肩膀滚,更省力)挡在计数之外。
设计取舍
spin 因左右不对称而关闭镜像学习(注释:「对称会把左转变右转」,:23-24);roulade 恰好矢状对称,是第一个启用 symmetry.py 的环境(:46)。动作税的时机取舍也相反:roulade 的 gentle_landing(|a_z| 冲击罚)从第 0 步就生效——因为这个环境发现动作很容易,稀缺的是「风格」;而 body_ang_vel 被压到 -0.002,毕竟滚翻本身就是大角速度事件(:377)。
你带走的收获
- 「结果型」评价(跟踪 ω*)要配机制型奖励(差动、在地面、原地),否则策略找物理捷径。
- 支撑门控累加器:把「过程量」变成一次性总付的进度奖励,既稠密又不可刷。
- 反向课程(中途出生点)把已解决的子问题变成新技能的尾巴。
- 特技任务里,删掉一个默认正则项(angular_momentum)和加一个奖励项同样重要。