PPO 多任务训练

本章目标:理解 PPO 在机器人运动中的角色,学会设计多任务奖励函数,实现"一个 ONNX 支持多种步态"的单策略方案,并掌握训练调参与导出。

12.1 PPO 基础

PPO(Proximal Policy Optimization)是机器人强化学习的常用策略:

  • 在旧策略与新策略之间做裁剪(clip),防止更新过猛导致训练崩溃;
  • 适合连续动作空间(关节目标位置);
  • 实现成熟、调参相对简单。

MicroDuck 的 PPO 用 MuJoCo-Warp 并行数百环境采样,配合 mjlab 训练循环。

12.2 多任务单策略方案

原版是连续速度指令控制。为支持多种步态,本书采用多任务单策略方案:

在观测向量里追加 one-hot 任务编码:

编码任务
[1,0,0,0,0,0]原地站立
[0,1,0,0,0,0]向前行走
[0,0,1,0,0,0]左转
[0,0,0,1,0,0]右转
[0,0,0,0,1,0]摔倒自恢复
[0,0,0,0,0,1]低速爬坡

板端固件只需传入任务 id,即可切换步态,无需加载多个 ONNX。

12.3 多任务奖励函数设计

按任务分支奖励。以行走为例:

forward_reward = torch.clip(obs[:, 0] * 1.2, 0, 1.5)   # x 方向前进速度
height_reward  = -torch.square(obs[:, 2] - 0.22)        # 保持身体高度
tilt_penalty   = -(torch.square(obs[:, 3]) + torch.square(obs[:, 4])) # 抑制倾斜
action_penalty = -0.01 * torch.sum(action**2, dim=-1)   # 动作惩罚
smooth_penalty = -0.05 * torch.sum((action - prev_action)**2, dim=-1)
reward = forward_reward + height_reward + tilt_penalty \
       + action_penalty + smooth_penalty

各任务奖励要点:

任务关键奖励项
站立保持高度、抑制倾斜、抑制抖动
行走前进速度 +、保持高度 +、抑制侧倾
转向绕 yaw 角速度 +、横向位移 -
摔倒自恢复身体抬升 +、关节复位、站立奖励
爬坡保持稳定 + 沿斜面前进(见 16.3)

12.4 训练配置与调参

# 训练配置要点
num_envs: 256
learning_rate: 3e-4
batch_size: 8192
update_epochs: 10
clip_range: 0.2
task: "multitask"    # 多任务模式
domain_randomization: true
control_freq: 50

调参速查:

问题调整方向
不收敛降低学习率、提高奖励尺度
动作发散增加动作/平滑惩罚
训练崩溃减小 clip_range、降域随机强度
过拟合仿真增强域随机化

12.5 导出 ONNX 策略

训练完成后导出可部署的 ONNX:

# export_onnx.py
import torch
from policy import PPOPolicy

policy = PPOPolicy.load("outputs/best_model.pt")
policy.eval()
dummy_input = torch.randn(1, policy.obs_dim)
torch.onnx.export(
    policy, dummy_input,
    "microduck_feetech_multitask.onnx",
    opset_version=17, input_names=["obs"], output_names=["action"]
)

产物 microduck_feetech_multitask.onnx 放入 software/training/pretrained/。

大文件管理:ONNX 模型体积大,建议用 Git LFS 管理,不直接提交 git 主仓库(见第 17 章)。

12.6 预训练权重开箱即用

仓库 pretrained/ 应提供训练好的预训练 ONNX,供读者开箱即用、验证整条链路,不必从零训练。每个权重需附带:

  • 对应的 MJCF 版本;
  • BAM 参数文件;
  • 训练配置;
  • 实验记录链接。

12.7 工程踩坑实录

  • 观测/动作缩放不一致:仿真归一化 [-1,1],板端未归一化,真机动作溢出。用 check_obs_act_space.py 校验。
  • 多任务奖励权重失衡:行走奖励权重过大,站立任务被忽略。按任务分 episode 采样,平衡训练。

12.8 本章小结

你现在能:设计多任务奖励、调参 PPO、导出并管理 ONNX 预训练权重。

下一章处理仿真调试:训练不收敛、抖动、动作发散的定位方法。