《MicroDuck RL:训练机器鸭从仿真走到真机》 系列课程 · 第 05 集 / 共 14 集
上一集:【MicroDuck RL 04】训练:一条命令背后发生了什么 |课程目录 | 下一集:【MicroDuck RL 06】机器人本体与 BAM 电机模型
本系列最硬核的一集。任务定义在 src/mjlab_microduck/tasks/microduck_velocity_env_cfg.py(约 950 行,注释极详细,是最好的学习材料),建议打开源码对照读。
动作空间(14 维)
策略每 0.02 s 输出 14 个关节目标位置(弧度),交给舵机 PD 控制器。
观测空间(actor 61 维)
| 观测项 | 维度 | 说明 |
|---|---|---|
| base_ang_vel | 3 | 躯干角速度(IMU) |
| projected_gravity | 3 | 重力在机体系的投影 → 姿态信息 |
| joint_pos | 14 | 关节位置 |
| joint_vel | 14 | 关节速度 |
| actions | 14 | 上一步动作 |
| command (twist) | 3 | 速度指令 [vx, vy, ω] |
| head_pose | 4 | 头部位姿指令(颈/头 4 关节相对 HOME 的偏移) |
| body_pose | 6 | 躯干姿态指令 [x, y, z, roll, pitch, yaw] |
critic(价值网络)额外拿到特权信息(76 维):真实线速度、脚高度、触地时间、接触力等——训练时帮助估值,部署时只用 actor 的 61 维。
重要设计:所有任务共享这个 61 维观测布局(不用的指令槽补零,不许删除)。这样真机运行时可以在走路/站立/翻滚等策略之间随时热切换。
奖励设计(本任务的灵魂)
正向(引导行为):
| 项 | 权重 | 作用 |
|---|---|---|
| track_linear_velocity | 2.0 | 跟踪线速度指令(高斯型,std=√0.1) |
| track_angular_velocity | 2.0 | 跟踪转向指令(高斯型,std=√0.5) |
| pose | 1.0 | 腿部关节接近默认站姿/步态姿态(只含腿,头颈由指令驱动) |
| upright | 2.0 | 躯干保持竖直(曾调强过:防止走路时前倾) |
| air_time | 3.0 | 抬脚时间落在 0.125–0.3 s 区间 → 鼓励交替迈步而不是拖脚 |
| head_pose_tracking | 主目标 | 头部跟踪位姿指令(std=0.5) |
负向(惩罚坏行为,注意权重符号约定,第 10 集会讲为什么):
| 项 | 权重 | 作用 |
|---|---|---|
| foot_slip | −0.1 | 支撑脚滑动(故意调弱:调强会妨碍原地转向) |
| action_rate_l2 | −0.1 | 动作抖动,经课程学习逐步引入 |
| self_collisions | 负 | 腿撞躯干电池仓 |
| foot_clearance / foot_swing_height | 负 | 抬脚高度不达标 |
| head_pose_bias | 负 | 只惩罚"可避免的"头部直流下垂(EMA 处理,走路时头自然晃不被罚) |
终止条件:fell_over(摔倒)、nan_state(状态出 NaN)、20 s 超时。
指令采样的两个细节很值得学:
- 转向 ±1.0 rad/s;15% 的环境专门采样原地转(线速度=0)——因为独立均匀采样下原地转只占 ~2% 经验,永远学不会;
- 头部/躯干姿态指令每 2–5 s 重采样。
域随机化(sim2real 的核心手段)
| 随机化 | 范围 | 时机 |
|---|---|---|
| 躯干质心偏移 | ±3 mm 起步,课程升到 ±8 mm | 每回合 |
| 头部组件质心 | ±3 mm 起 | 每回合 |
| 质量/惯量 | ±5% | 启动 |
| 关节摩擦(BAM friction_scale) | ±10% | 每回合 |
| 转子惯量(armature) | ±10% | 每回合 |
| 脚底摩擦系数 | 随机 | 启动 |
| 编码器零位偏差 | 每环境固定偏置 | 启动 |
| IMU 安装姿态偏差 | 零均值 | 观测层 |
| 外力推搡 | ±0.3 m/s,每 3–6 s 一次 | 运行中 |
| 电池电压 6.5–8.2 V、负载压降、指令延迟 3–6 步 | — | 电机模型内部 |
故意关闭的:kp/kd 随机化、初始姿态倾斜——配置顶部都有 ENABLE_* 开关,读代码一眼能看到哪些开着、哪些被试错过。
课程学习(Curriculum)
训练难度随进度递增:质心扰动范围、头部指令范围、站立环境比例、action_rate 惩罚权重等分阶段放大。单位是环境步:迭代号 × 24。
读这 950 行配置的最佳顺序:先看奖励权重表建立直觉 → 再看 ENABLE_* 开关理解取舍 → 最后对照第 10 集的日志解读方法验证你的理解。下一集讲机器人本体和让一切成立的 BAM 电机模型。