joint-space-empowerment YAML 配置逐项拆解:奖励权重、训练步数与相机参数速查表
【免费下载链接】joint-space-empowerment项目地址: https://ai.gitcode.com/hf_mirrors/jamesheald/joint-space-empowerment
joint-space-empowerment是论文Joint-Space Empowerment for Dexterous Coordination in Tendon-Driven Hands(ICML 2026 Spotlight)的官方模型仓库,存放了 Adroit 与 MyoHand 两种腱驱动灵巧手在 6 类操作任务上的强化学习训练策略。每个任务目录下的 YAML 文件就是该策略训练/评测所用环境的完整配置,涵盖奖励权重、训练步数、观测归一化与相机参数。本文逐项拆解这些配置,并给出全部任务的速查表,方便你快速对照、复现与自定义。
📂 先看清仓库:一个 YAML 对应一组训练模型
仓库按手型/任务/种子组织,每个任务目录下有一个环境配置 YAML + 每个 seed 一组模型文件(详见 README.md):
| 手型 | 任务 | 模型文件(每个 seed) |
|---|---|---|
| Adroit | BaodingBalls、DieReorient、KeyTurn、PenTwirl | rl_model_<steps>_steps.zip+rl_model_vecnormalize_<steps>_steps.pkl |
| MyoHand | BaodingBalls、DieReorient、KeyTurn、PenTwirl、Reorient8-sparse | 同上 |
| MyoHand | Reorient100 | Training 阶段同上;Pretraining_Play 阶段为rl_model_replay_buffer_1000000_steps.pkl+ vecnormalize |
以 Adroit/BaodingBalls/ 为例,配置与模型一一对应:
- 环境配置:CustomAdroitBaodingP1-v1.yaml
- 训练模型:rl_model_10000000_steps.zip
- 观测归一化统计量:rl_model_vecnormalize_10000000_steps.pkl
💡 文件名中的步数与 YAML 里的
total_timesteps完全一致,可用来快速核对"这个模型是用哪份配置训出来的"。
各手型/任务可用的 seed:Adroit 全部为 0–4;MyoHand 的 BaodingBalls、DieReorient、Reorient8-sparse 为 0、1、2、4、5(缺 3),其余为 0–4。
⚙️ 顶层参数:训练步数与检查点频率
所有配置共享同一套顶层字段,规律非常整齐:
| 配置 | total_timesteps | eval_freq | save_freq | 特点 |
|---|---|---|---|---|
| Adroit/BaodingBalls | 10,000,000 | 100,000 | 1,250,000 | — |
| Adroit/DieReorient | 10,000,000 | 100,000 | 1,250,000 | — |
| Adroit/KeyTurn | 7,500,000 | 75,000 | 937,500 | — |
| Adroit/PenTwirl | 5,000,000 | 50,000 | 625,000 | — |
| MyoHand/BaodingBalls | 10,000,000 | 100,000 | 1,250,000 | — |
| MyoHand/DieReorient | 10,000,000 | 100,000 | 1,250,000 | — |
| MyoHand/KeyTurn | 7,500,000 | 75,000 | 937,500 | — |
| MyoHand/PenTwirl | 5,000,000 | 50,000 | 625,000 | — |
| MyoHand/Reorient8-sparse | 5,000,000 | 50,000 | 625,000 | 稀疏奖励 |
| MyoHand/Reorient100 | 2,000,000 | 20,000 | 250,000 | 两阶段训练 |
两个隐藏规律:
eval_freq = total_timesteps / 100——每 1% 的步数评测一次;save_freq = total_timesteps / 8——整个训练过程恰好保存 8 个检查点。
任务难度与步数大致正相关:抛接类(Baoding、DieReorient)需要 10M 步,旋转微调类(PenTwirl、Reorient)只需 5M 或 2M 步。
🎛️ 观测与奖励归一化:三个全局开关
每份 YAML 都有相同的四行"开关",直接决定观测/奖励如何喂给网络:
| 参数 | 取值 | 含义 |
|---|---|---|
reward_type | dense(Reorient8-sparse 为sparse) | 稠密/稀疏奖励模式 |
norm_obs | True | 对观测做 running-mean/std 归一化,统计量即vecnormalize_*.pkl |
norm_reward | False | 全部任务都不对奖励做归一化 |
clip_obs | 10.0 | 归一化后的观测裁剪到 ±10,防止异常值 |
⚠️ 加载
rl_model_*.zip时必须搭配同目录的vecnormalize_*.pkl,否则归一化统计量缺失,策略行为会失真。
🕹️ env_kwargs:环境与任务行为参数
env_kwargs控制仿真环境的运行时行为,各任务要点如下:
| 参数 | 出现的任务 | 说明 |
|---|---|---|
seed: ${env.seed} | 全部 | Hydra 变量引用,把顶层seed透传给环境 |
max_episode_steps | 全部 | 回合长度:Baoding 200 / DieReorient 150 / KeyTurn 200 / PenTwirl 50 / Reorient 50 |
add_wrist_pronation_supination | 仅 Adroit | Adroit 手额外开启腕部旋前/旋后自由度 |
goal_pos/goal_rot | 两个 DieReorient | 目标位置扰动范围[0, 0]、目标朝向扰动[-0.785, 0.785](即 ±45°) |
enable_rsi/rsi_distance_*/goal_rot_x..z | 两个 DieReorient | 随机化场景指令(RSI)相关开关,均置为false/null |
guided_trajectory_steps | 两个 DieReorient | 引导轨迹步数,设为 0 即不使用 |
task_variables_keys | 全部 | 声明训练/评测时要读取的任务状态变量(见下节) |
其中 CustomAdroitDieReorientP2-v0.yaml 的goal_pos/goal_rot/RSI 组合是"随机化场景参数"的完整示范:把不用的项显式置null,方便按需开启。
🎯 奖励权重 weighted_reward_keys 速查表
weighted_reward_keys定义各奖励项的系数,是调参影响最大的部分:
| 奖励项 | 常见含义 | BaodingBalls | DieReorient | Reorient8/100 |
|---|---|---|---|---|
pos_dist_1/pos_dist_2 | 双球到目标位置距离(越小越好) | 1 / 1 | — | — |
pos_dist/rot_dist | 位置 / 朝向误差距离 | — | 1 / 0.2 | — |
pos_dist_diff/rot_dist_diff | 相对前一帧的改进量(鼓励持续逼近) | — | 100 / 10 | — |
pos_align/rot_align | 位置 / 朝向对齐奖励 | — | — | 1 / 1 |
act_reg | 动作正则(鼓励小动作) | 0 | 0 | 5 |
drop | 掉落惩罚 | — | — | 5 |
bonus | 完成动作的额外奖励 | — | — | 10 |
alive | 存活/未掉落维持奖励 | 1 | 1 | — |
solved | 达成目标的里程碑奖励 | 5 | 2 | — |
done/sparse | 终止 / 稀疏奖励项 | 0 / 0 | 0 / 0 | — |
几点解读:
- DieReorient 的"差分项"权重高达 100/10(CustomMyoChallengeDieReorientP2-v0.yaml#L16-L25),远大于绝对误差项,说明该任务靠"持续朝目标改进"塑形学习;
- Reorient 系任务的
act_reg和drop都是 5,用较强的动作惩罚抑制乱抖、用掉落惩罚保底; - KeyTurn 与 PenTwirl未显式定义
weighted_reward_keys,使用环境默认值(myoHandKeyTurnRandom-v0.yaml#L16-L21 中被注释掉的正是参考值:pos_align 1 / rot_align 1 / act_reg 5 / drop 5 / bonus 10); - 全仓库唯一的稀疏奖励任务 myoHandReorient8-v0.yaml 通过
reward_type: sparse切换,用于对比稠密/稀疏奖励下的学习差异。
📋 task_variables_keys:任务状态变量
每个任务声明训练时需要记录/观测的任务状态:
| 任务 | 变量 |
|---|---|
| BaodingBalls | target1_pos、target2_pos、target1_err、target2_err |
| DieReorient | goal_pos、pos_err、goal_rot、rot_err |
| PenTwirl、Reorient100、Reorient8 | obj_des_rot、obj_err_pos、obj_err_rot |
| KeyTurn | [](空列表) |
这些变量通常用于评测指标统计与日志输出,修改它们不会改变物理动力学,但会影响你从日志里能读到的分析维度。
📷 相机参数 camera 速查表
相机配置决定play可视化时的视角,两套"机位"分别对应两种手型的操作高度:
| 手型 / 任务 | lookat | distance | azimuth | elevation | fps | tracked_body(tracking 模式) |
|---|---|---|---|---|---|---|
| Adroit(4 个任务) | [0.01, 0.05, 1.47] | 0.8 | 270 | -45 | 25 | forearm |
| MyoHand Baoding / Die / Key / Pen | [-0.220, -0.47, 1.440] | 0.6 | 90 | -45 | 25 | r_humerus |
| MyoHand Reorient8 / Reorient100 | [-0.1, 0., 1.5] | 1.35 | 90 | -10 | 25 | r_humerus |
参数含义:
type:free(固定机位)或tracking(跟随tracked_body指定的刚体);lookat:free模式下相机注视点的世界坐标;distance/azimuth/elevation:到目标的距离(米)、水平方位角(度)、俯仰角(度);- Reorient 系列特意用更大距离(1.35m)+ 更平的俯角(-10°)获得更"俯视"的观察视角。
两个 DieReorient 配置还带有render段(如 Adroit 版 #L54-L56):target_x_offset、target_y_offset、target_ball_alpha只调整目标球体的渲染位置与透明度,不影响物理仿真。
🚀 加载模型:配置与模型如何对上号
仓库本身只存模型,运行需配合 JoSE 代码仓库中的play.py(见 README.md):
uv run python play.py --hand <hand> --task <task> --seed <seed>| 参数 | 可选值 |
|---|---|
--hand | Adroit、MyoHand |
--task | BaodingBalls、DieReorient、KeyTurn、PenTwirl、Reorient8-sparse、Reorient100/Training |
--seed | 视手型/任务而定(见上文 seed 说明) |
例如--hand Adroit --task PenTwirl --seed 2就会加载 Adroit/PenTwirl/seed_2/ 下的模型,并按 CustomAdroitPenTwirlRandom-v0.yaml 描述的 50 步回合策略执行,用 25fps 的 free 相机渲染行为。
❓ 常见问题 FAQ
Q1:vecnormalize_*.pkl是什么,能单独加载吗?它是norm_obs: True训练出的观测归一化统计量,必须与同目录的rl_model_*.zip配套使用,不能单独替代模型。
Q2:为什么 Reorient100 的 Pretraining_Play 目录里没有.zip模型?Reorient100 采用两阶段训练:先在随机策略下收集经验(只保存 replay buffer 和归一化统计量,各 1M 步),再在 Training 阶段以 2M 步训练出最终策略(Training/seed_0)。
Q3:想改奖励权重后重训,从哪下手?复制对应任务的 YAML(如 myoHandReorient100-v0.yaml),只改env_kwargs.weighted_reward_keys下的系数即可;total_timesteps、eval_freq、save_freq建议按上文 1% / 1/8 的比例同步缩放。
Q4:sparse 和 dense 奖励配置差别在哪?两者除reward_type(sparse vs dense)外几乎完全相同,权重表也都保留,便于做严格的消融对比。
【免费下载链接】joint-space-empowerment项目地址: https://ai.gitcode.com/hf_mirrors/jamesheald/joint-space-empowerment
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考