turtlebot3-burger_150.png
turtlebot3-waffle-pi_150.png
turtlebot3-arm_150.png
walking-y2_150.png
turbot3-multi_150.png
turbot3-dl-ros1_150.png
turbot3-ai.png
turbot3-dl-ros2_150.png
turbot3-slam_150.png
turbot3-arm_150.png
turtlebot4-lite_150.png
turtlebot4-pro_150.png
turbot4-dl_150.png
turbot4-ai_150.png
aidriving-racebot_150.png
aidriving-autodrive_150.png
turtlebot-arm_150.png
openmanipulator-x_150.png
Home » OpenDuckMini强化学习框架入门教程 » OpenDuckMini强化学习框架入门教程-模仿奖励

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),
]

与命令的关系

模仿奖励与摇杆命令双向关联:

  1. 命令速度决定了采样的参考运动(通过 get_reference_motion(dx, dy, dtheta, i)
  2. 命令为零时,模仿奖励不施加cmd_norm > 0.01 条件)

这确保机器人只在有运动指令时才模仿参考步态,静止时则使用 stand_still 代价。

使用模仿奖励的步骤

  1. 生成参考运动:使用 Open Duck 参考运动生成器 生成多项式系数
  2. 复制数据文件:将 polynomial_coefficients.pkl 放到 playground/open_duck_mini_v2/data/
  3. 启用奖励:在 joystick.py 中设置 USE_IMITATION_REWARD = True
  4. 训练:如常启动训练,模仿奖励会自动生效

模仿奖励的效果

方面 无模仿奖励 有模仿奖励
步态初始阶段 需要更长时间探索 快速收敛到合理步态
步态自然度 可能有抖动或怪异步态 步态更接近生物运动
能量效率 可能过高或过低 参考自然运动,效率较好
泛化能力 可能过拟合到特定模式 参考运动提供先验知识

注意事项

  • 数据依赖:需要预先计算多项式系数,文件丢失会导致训练失败
  • 命令依赖:模仿奖励仅在有运动命令时生效
  • 计算开销:需要额外的参考运动采样,增加轻微计算负担
  • 硬编码对齐:当前关节索引以 JOINTS_ORDER_NO_HEAD 为基础,添加新机器人时需调整

纠错,疑问,交流: 请进入讨论区请点击进入页面,扫码加入微信群或Q群进行交流

获取最新文章: 扫一扫加入“创客智造”公众号

欢迎加入我们的openduckmini交流群,微信扫描右侧二维码立即进群交流

群二维码

标签: OpenDuckMini强化学习框架