BeyondMimic 强化学习模型架构详解(机器人是如何学会时序动作)

本文档系统梳理 BeyondMimic 项目中机器人运动跟踪的强化学习模型架构、输入输出设计、训练机制及部署流程。

1. 模型整体架构

1.1 核心组件

项目采用 Actor-Critic 架构的 PPO(近端策略优化)算法,包含两个独立的前馈神经网络:

  • Actor(策略网络):输入当前观察,输出机器人的关节位置控制指令(动作)
  • Critic(价值网络):评估当前状态的价值,用于训练时计算优势函数
  • 经验归一化器:动态标准化观察数据,提高训练稳定性

1.2 算法选择理由

  • PPO 算法:训练稳定性高,适合连续动作空间(关节角度控制)
  • Actor-Critic 分离:Critic 提供低方差的优势估计,加速策略收敛
  • 实时闭环控制:模型每帧(12.5Hz)根据最新状态决策,自然形成动作序列

2. 网络详细架构

2.1 隐藏层配置

所有机器人(PM01、PI Plus、HI)使用相同的三层 MLP 架构:

actor_hidden_dims=[512, 256, 128],    # Actor 网络
critic_hidden_dims=[512, 256, 128],   # Critic 网络
activation="elu",                     # 激活函数

2.2 网络变换过程

数学表示

h₁ = ELU(W₁·x + b₁)    # 输入 → 512维
h₂ = ELU(W₂·h₁ + b₂)   # 512 → 256维  
h₃ = ELU(W₃·h₂ + b₃)   # 256 → 128维
输出 = 线性层(h₃)       # 128 → 动作维度

以 PM01 的 Actor 为例(129维输入):

  • 第一层权重 W₁ 形状:129 × 512(约66,048个参数)
  • 经过三层变换后输出24维动作(24个关节的目标位置)

2.3 配置位置

  • 通用配置:source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/agents/rsl_rl_ppo_cfg.py
  • 训练日志:logs/rsl_rl/pm01_flat/2026-04-18_17-03-04_test_run_fight1/params/agent.yaml

3. 输入维度分析

3.1 Actor vs Critic 输入差异

观察项 Actor(策略网络) Critic(价值网络) 维度(PM01)
command ✓ 运动命令 ✓ 运动命令(无噪声) 48维
motion_anchor_pos_b ✗ 禁用(PM01配置) ✓ 锚点位置(无噪声) 3维
motion_anchor_ori_b ✓ 锚点方向(带噪声) ✓ 锚点方向(无噪声) 6维
body_pos ✗ 无 ✓ 机器人身体位置(特权信息) 39维
body_ori ✗ 无 ✓ 机器人身体方向(特权信息) 78维
base_lin_vel ✗ 禁用(PM01配置) ✓ 基座线速度(无噪声) 3维
base_ang_vel ✓ 基座角速度(带噪声) ✓ 基座角速度(无噪声) 3维
joint_pos ✓ 关节位置(带噪声) ✓ 关节位置(无噪声) 24维
joint_vel ✓ 关节速度(带噪声) ✓ 关节速度(无噪声) 24维
actions ✓ 上一动作(无噪声) ✓ 上一动作(无噪声) 24维
总计维度 129维 约252维 -

3.2 不同机器人输入维度对比

机器人 Actor输入维度 Critic输入维度(估算) 动作维度
PM01 129维 ~252维 24
PI Plus 119维 ~242维 22
HI 124维 ~247维 23

3.3 观察项详细说明(PM01 Actor)

观察项 维度 说明 噪声配置
command 48 运动命令:参考关节位置(24)+参考身体位置/方向(24)
motion_ref_ori_b 6 参考锚点方向(旋转矩阵前两行) ±0.05
base_ang_vel 3 基座角速度(ω_x, ω_y, ω_z) ±0.2
joint_pos 24 当前关节位置(相对参考姿态) ±0.01
joint_vel 24 当前关节速度 ±0.5
actions 24 上一时间步执行的动作

配置位置

  • 观察定义:source/whole_body_tracking/whole_body_tracking/tasks/tracking/tracking_env_cfg.py:156-247
  • PM01 特定配置:source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/flat_env_cfg.py:119-135
  • 维度验证:scripts/sim2sim.py:145-152

4. 输出维度分析

4.1 Actor 输出

  • 维度:等于机器人关节数量
    • PM01: 24维(24个关节的目标位置)
    • PI Plus: 22维
    • HI: 23维
  • 范围:关节位置控制指令,经过动作缩放(PM01_ACTION_SCALE
  • 控制频率:12.5Hz(仿真200Hz,控制抽取率 decimation=4)

4.2 Critic 输出

  • 维度:1维标量,表示当前状态的价值 V(s)
  • 用途:仅用于训练阶段计算优势函数

5. Actor 和 Critic 交互机制(PPO算法流程)

5.1 训练阶段交互

收集数据 → 计算优势函数 → 更新网络
    ↓          ↓            ↓
    Actor      Critic      同时更新

5.2 详细步骤

步骤1:数据收集(并行4096个环境)

动作 = Actor(当前观察)           # Actor决策(129维输入)
奖励, 新观察 = 环境.step(动作)    # 执行动作
存储(观察, 动作, 奖励, 新观察)     # 收集轨迹数据

步骤2:优势函数计算(Critic的核心作用)

价值 = Critic(状态)                     # Critic评估(252维输入)
回报 = 累计折扣奖励                     # R = Σγ^t * r_t
优势 = 回报 - 价值                      # A(s,a) = R - V(s)

# 实际使用广义优势估计(GAE)
优势_GAE = Σ(γλ)^t * δ_t               # δ_t = r_t + γV(s_{t+1}) - V(s_t)

步骤3:网络更新(PPO核心)

# Actor更新:最大化"裁剪"后的策略改进
ratio = π_新(a|s) / π_旧(a|s)           # 新旧策略概率比
目标 = min(ratio·优势, clip(ratio, 1-ε, 1+ε)·优势)
损失_Actor = -mean(目标)                # 最大化期望奖励

# Critic更新:最小化价值误差  
损失_Critic = mean((回报 - Critic(s))²)  # 最小化价值预测误差

# 联合优化
总损失 = 损失_Actor + 损失_Critic

5.3 设计思路

角色 比喻 输入特点 输出用途
Actor “盲人舞者” 带噪声的有限观察 实时动作决策
Critic “全知教练” 精确的完整状态 评估动作质量,指导学习

6. 训练与部署的区别

6.1 组件使用对比

阶段 Actor Critic 经验归一化器 运动命令模块
训练 ✓ 决策动作 ✓ 计算优势 ✓ 动态归一化 ✓ 提供参考运动
部署 ✓ 实时控制 ✗ 不需要 ✓ 固定参数 ✓ 提供参考运动
验证 ✓ 性能测试 ✗ 可选 ✓ 固定参数 ✓ 提供参考运动

6.2 模型导出

关键代码source/whole_body_tracking/whole_body_tracking/utils/exporter.py:50):

def forward(self, x, time_step):
    return self.actor(self.normalizer(x))  # 只导出Actor!

导出流程

  1. 训练完成后固定经验归一化器参数
  2. 将Actor网络转换为ONNX格式
  3. 可选转换为RKNN格式用于嵌入式部署

6.3 部署优化

  • 计算精简:仅保留Actor,推理速度快
  • 内存节省:Critic网络不加载,减少内存占用
  • 实时性:12.5Hz控制频率满足实时要求

7. 动作时长对网络大小的影响

7.1 核心结论

动作时长(如1分钟 vs 半分钟)本身通常不需要调整网络大小

7.2 原因分析

因素 说明
输入维度不变 观察空间维度由机器人状态决定,与动作时长无关
输出维度不变 动作空间维度等于机器人关节数,固定不变
任务本质相同 都是"跟随当前参考姿态",无论参考姿态来自多长的动画
训练数据采样 训练时随机采样运动片段(通常10秒),不直接处理完整长序列

7.3 何时可能需要调整网络

情况 是否需要调整网络 更有效的解决方案
动作复杂度显著增加 可能 如果1分钟动作包含更复杂的动态(快速转身、跳跃组合等)
训练收敛慢或效果差 可尝试 先调整超参数(学习率、批大小)
过拟合明显 需要减小 如网络容量远大于任务需求
需要长时序建模 需要结构调整 当前MLP缺乏显式记忆,可考虑添加LSTM层

7.4 调整建议

配置文件位置source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/agents/rsl_rl_ppo_cfg.py

修改方法

# 当前配置
actor_hidden_dims=[512, 256, 128]
critic_hidden_dims=[512, 256, 128]

# 增大容量(增加50%)
actor_hidden_dims=[768, 384, 192]
critic_hidden_dims=[768, 384, 192]

# 减小容量(轻量化)
actor_hidden_dims=[256, 128, 64]
critic_hidden_dims=[256, 128, 64]

推荐调试顺序

  1. 基准测试:先用默认网络训练长动作
  2. 超参数调优:调整学习率、训练轮数等
  3. 网络调整:如效果仍不佳,按20-30%幅度逐步增大网络
  4. 架构变更:极少数情况可考虑添加LSTM(需修改rsl_rl底层实现)

8. 观察空间设计原理

8.1 时序信息编码

虽然网络是静态前馈MLP,但观察中包含了足够的时序上下文:

观察项 时序信息 作用
joint_vel 关节运动的瞬时变化率 提供时间导数信息
actions 上一时刻执行的动作 显式的一步历史记忆
运动命令 当前及未来的参考轨迹 模型可据此预测即将到来的动作

8.2 噪声设计策略

# Actor观察噪声配置(模拟传感器误差)
motion_anchor_ori_b: noise=Unoise(n_min=-0.05, n_max=0.05)  # 方向噪声
base_ang_vel: noise=Unoise(n_min=-0.2, n_max=0.2)          # 角速度噪声  
joint_pos: noise=Unoise(n_min=-0.01, n_max=0.01)           # 位置噪声
joint_vel: noise=Unoise(n_min=-0.5, n_max=0.5)             # 速度噪声

8.3 特权信息设计

Critic接收的额外信息(Actor没有):

  • body_pos:机器人各身体部位的精确3D位置
  • body_ori:机器人各身体部位的精确方向
  • 无噪声观察:所有观察项均为精确值

9. 序列动作执行原理

9.1 闭环控制循环

仿真步进(200Hz) → 观察获取 → 策略推理 → 动作施加 → 循环重复
                     ↓
                 12.5Hz控制频率

9.2 为什么MLP能处理序列?

因素 说明
闭环实时控制 模型每80ms被调用一次,根据最新状态产生动作
观察含时序信息 关节速度、上一动作、参考运动命令提供时间上下文
运动命令引导 每一帧都提供当前及未来的参考姿态
训练目标 奖励函数鼓励跟踪整个运动轨迹,而非单一时刻姿态
前馈网络高效性 MLP推理速度快,适合实时控制

10. 工程经验与最佳实践

10.1 性能优化建议

  1. 数据质量优先:确保运动数据(NPZ文件)平滑、物理可行
  2. 奖励函数调优:调整各奖励项权重,平衡跟踪精度与动作平滑性
  3. 域随机化强度:适当增加物理参数随机化范围,提高sim-to-real性能
  4. 训练稳定性:启用经验归一化(empirical_normalization = True

10.2 故障排查

现象 可能原因 解决方案
训练收敛慢 网络容量不足/学习率不当 调整超参数,验证数据质量
过拟合明显 网络容量过大 减小网络规模,增加正则化
动作不连贯 观察中时序信息不足 检查joint_vel和上一动作是否正常
sim-to-real差距大 域随机化不足 增加摩擦、质心、外部扰动等随机化

10.3 验证与测试

# 1. 训练策略
python scripts/rsl_rl/train.py --task=Tracking-Flat-PM01-Wo-v0 --headless

# 2. 播放训练策略  
python scripts/rsl_rl/play.py --task=Tracking-Flat-PM01-Wo-v0 --checkpoint {model_path}.pt

# 3. MuJoCo验证(sim2sim)
python scripts/sim2sim.py --robot pm01 --policy_path {model_path}.onnx

# 4. 导出部署模型
python -c "from whole_body_tracking.utils.exporter import export_motion_policy_as_onnx; ..."

附录:关键配置文件路径

文件 路径 说明
模型配置 source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/agents/rsl_rl_ppo_cfg.py PPO超参数、网络架构
环境配置 source/whole_body_tracking/whole_body_tracking/tasks/tracking/config/pm01/flat_env_cfg.py PM01特定观察、动作设置
基础环境 source/whole_body_tracking/whole_body_tracking/tasks/tracking/tracking_env_cfg.py 通用观察、奖励、终止条件
训练脚本 scripts/rsl_rl/train.py 主要训练流程
模型导出 source/whole_body_tracking/whole_body_tracking/utils/exporter.py ONNX导出工具
验证脚本 scripts/sim2sim.py MuJoCo跨仿真验证

总结

BeyondMimic 的强化学习模型通过设计的 Actor-Critic 架构,实现了人形机器人运动跟踪:

  1. 架构简洁高效:三层MLP(512→256→128)平衡表达能力和计算效率
  2. 输入设计智能:Actor带噪声观察提高鲁棒性,Critic特权信息确保准确评估
  3. 训练机制稳定:PPO算法配合经验归一化,实现稳定收敛
  4. 部署优化充分:训练-部署解耦,仅保留轻量级Actor满足实时要求
  5. 扩展性强:模块化设计支持不同机器人、不同动作的快速适配

这种设计在保持实时性能的同时,实现了高质量的动态运动模仿,为人形机器人控制提供了可靠的解决方案。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐