OpenDuckMini强化学习框架入门教程-模仿奖励
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流
模仿奖励
- 理解模仿奖励,包含控制开关,reward_imitation,参考运动整合,使用模仿奖励的步骤,模仿奖励的效果等
概述
模仿奖励(Imitation Reward)是 Open Duck Playground 的可选功能,通过参考运动数据引导策略学习更自然、更高效的步态。与传统的手工设计奖励不同,模仿奖励让机器人"跟着示范学",输出更接近参考运动的动作。
参考来源
模仿奖励基于 Disney Research 的 BD+X 论文 中的方法,使用多项式拟合参考运动轨迹。
控制开关
通过 joystick.py 中的全局变量控制:
USE_IMITATION_REWARD = True # 设置为 True 启用模仿奖励
当禁用时(=False),模仿奖励权重降为零,不要求加载参考运动数据。
reward_imitation 函数
定义在 playground/open_duck_mini_v2/custom_rewards.py 中。
函数签名
def reward_imitation(
base_qpos, # 浮动基座位置/姿态 (7)
base_qvel, # 浮动基座速度 (6)
joints_qpos, # 执行器关节位置 (10)
joints_qvel, # 执行器关节速度 (10)
contacts, # 足部接触状态 (2)
reference_frame, # 参考帧数据 (40 维)
cmd, # 命令 (7)
use_imitation_reward, # 是否启用
) -> jax.Array:
参考帧数据结构
参考帧(来自多项式系数)包含 40 维数据:
索引 0-15: 关节位置 (16 个: 左腿5 + 颈部1 + 头部3 + 天线2 + 右腿5)
索引 16-31: 关节速度 (16 个,对应关系同上)
索引 32-33: 足部接触 (2 个: 左/右)
索引 34-36: 基座线速度 (3)
索引 37-39: 基座角速度 (3)
索引 0-2: 基座位置 (3) [未使用]
索引 3-6: 基座四元数 (4)
权重配置
| 分量 | 权重 | 说明 |
|---|---|---|
w_lin_vel_xy |
1.0 | 水平线速度匹配 |
w_lin_vel_z |
1.0 | 垂直线速度匹配 |
w_ang_vel_xy |
0.5 | 横向角速度匹配 |
w_ang_vel_z |
0.5 | 偏航角速度匹配 |
w_joint_pos |
15.0 | 关节位置匹配 |
w_joint_vel |
1.0e-3 | 关节速度匹配 |
w_contact |
1.0 | 足部接触模式匹配 |
w_torso_pos |
1.0 | 躯干位置匹配(已注释) |
w_torso_orientation |
1.0 | 躯干方向匹配(已注释) |
奖励计算
lin_vel_xy_rew = exp(-8 * sum(square(actual_xy - ref_xy)))
lin_vel_z_rew = exp(-8 * sum(square(actual_z - ref_z)))
ang_vel_xy_rew = exp(-2 * sum(square(ang_xy - ref_ang_xy)))
ang_vel_z_rew = exp(-2 * sum(square(ang_z - ref_ang_z)))
joint_pos_rew = -sum(square(joint - ref_joint)) * 15.0
joint_vel_rew = -sum(square(vel - ref_vel)) * 1e-3
contact_rew = sum(contacts == ref_contacts)
reward = sum(all_components) * (cmd_norm > 0.01)
各分量类型:
- 速度匹配:使用高斯核
exp(-error/sigma),范围 [0, 1] - 关节匹配:使用负平方误差(误差越大惩罚越大)
- 接触匹配:二进制匹配计数
关节处理
参考帧包含所有 16 个关节,包括头部和天线关节,但奖励计算时只使用腿部关节:
# 参考帧: [左腿5, 头4, 天线2, 右腿5]
ref_joint_pos = concat([ref[:5], ref[11:]]) # 去掉头和天线
# 实际关节: [左腿5, 头4, 右腿5] (10 个执行器)
joint_pos = concat([actual[:5], actual[9:]]) # 去掉头
这种对齐方式确保只有腿部关节参与模仿奖励计算。
参考运动整合
训练循环中的整合
在每个 step() 中,模仿奖励系统需要参考运动数据:
# 获取当前命令对应的参考运动
state.info["current_reference_motion"] = self.PRM.get_reference_motion(
cmd_x, cmd_y, cmd_theta, imitation_i
)
# 更新步态相位
state.info["imitation_i"] = (imitation_i + 1) % nb_steps_in_period
state.info["imitation_phase"] = [
cos(imitation_i / N * 2 * pi),
sin(imitation_i / N * 2 * pi),
]
与命令的关系
模仿奖励与摇杆命令双向关联:
- 命令速度决定了采样的参考运动(通过
get_reference_motion(dx, dy, dtheta, i)) - 命令为零时,模仿奖励不施加(
cmd_norm > 0.01条件)
这确保机器人只在有运动指令时才模仿参考步态,静止时则使用 stand_still 代价。
使用模仿奖励的步骤
- 生成参考运动:使用 Open Duck 参考运动生成器 生成多项式系数
- 复制数据文件:将
polynomial_coefficients.pkl放到playground/open_duck_mini_v2/data/ - 启用奖励:在
joystick.py中设置USE_IMITATION_REWARD = True - 训练:如常启动训练,模仿奖励会自动生效
模仿奖励的效果
| 方面 | 无模仿奖励 | 有模仿奖励 |
|---|---|---|
| 步态初始阶段 | 需要更长时间探索 | 快速收敛到合理步态 |
| 步态自然度 | 可能有抖动或怪异步态 | 步态更接近生物运动 |
| 能量效率 | 可能过高或过低 | 参考自然运动,效率较好 |
| 泛化能力 | 可能过拟合到特定模式 | 参考运动提供先验知识 |
注意事项
- 数据依赖:需要预先计算多项式系数,文件丢失会导致训练失败
- 命令依赖:模仿奖励仅在有运动命令时生效
- 计算开销:需要额外的参考运动采样,增加轻微计算负担
- 硬编码对齐:当前关节索引以
JOINTS_ORDER_NO_HEAD为基础,添加新机器人时需调整
纠错,疑问,交流: 请进入讨论区或 请点击进入页面,扫码加入微信群或Q群进行交流
获取最新文章: 扫一扫加入“创客智造”公众号
欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流


















