解读 132 · velocity 课程逐门
解读对象:与 解读 131 同文件 779–910 行,七门课程逐门
需要的前置:解读 27(课程=调度器的思想)、解读 26
课程 = 按步数改参数的调度器
mjlab 的课程项是 CurriculumTermCfg:一个函数 + 一组分段表。表里 step 以环境步计,乘数是 NUM_STEPS_PER_ENV=24(文件 :22),所以 500 * 24 就是第 500 个 PPO 迭代。velocity 环先删掉模板默认的两门:terrain_levels(仅平地时,:891-892)和 command_vel(:893)——后者对应一个写进注释的决定:"速度命令范围固定,不做扩张课程",因为一次扩到 lin ±0.4 / ang ±2.0 的爬坡跑赢了机器人能力,iter 1000 后奖励与步长一起衰退(:647-650)。然后换上自己的七门:
七门课程(名字 / 条件 / 进退)
- action_rate_weight(:781-794):
reward_weight把action_rate_l2从 -0.1 起每 250 迭代一档,1500 迭代收在 -1.0。动作税后出场:步态先活下来,再要求平滑。 - standing_envs(:797-810):站立环境占比 0.02 → 0.25(2000 迭代)。"站住"不靠专门的静止奖励,靠这个桶慢慢放量。
- head_pose_range(:819-832):
pose_command_range_curriculum按关节扩头部命令,5 档从终值的 5% 到 100%:终值颈/头俯仰 ±1.10、头偏航 ±1.40、头滚转 ±0.31 rad——每个数都是 XML 限位减 HOME 偏移再留约 10% 裕量(:663-667)。 - body_pose_range(:836-851):只有一档,恒为 ±5 mm / ±0.05 rad——vel 环里身体命令槽只是"保温",不抢戏。
- com_range(:855-872,门控
ENABLE_COM_RANDOMIZATION):质心随机化半径 0.003→0.015 m 封顶。注释记录 2026-07 审计:旧爬坡到 ±30 mm,而脚跟离踝轴只有 20 mm,质心可被随机到支撑面外,后退平衡永远练不成。 - head_com_range(:876-888):头组件质心 0.003→0.01 m 封顶——头是大杠杆臂,同一次审计砍的。
- head_pose_bias_weight(:899-910):点头惩罚的定时引信:0 →(600 迭代)1.0 →(1000)2.0 →(1500)3.0。注释直说:步态诞生前,姿势精度项只是干扰。
七门里两门爬惩罚(1、7)、两门放量换数据配比(2)与扩命令(3)、两门扩随机化且封顶(5、6)、一门假扩张(4)——课程表的形状就是这份训练的教学大纲。
你带走的收获
- 课程表的单位是环境步:读表先除以 24 换算成迭代数,再和 wandb 曲线对时间轴。
- 随机化范围也要课程化,且上限必须对着物理事实(支撑面大小)校——不是"越大越鲁棒"。
- "惩罚延迟生效"(1、7)与"难度逐步放量"(2、3)是同一思想的两个方向:先让技能被发现,再收紧标准。
- 删除默认课程与新增课程同样重要:不扩速度范围是个有注释背书的设计决定。