DDPG Pusher-v5 Demo
使用纯 PyTorch 实现 DDPG,在 MuJoCo 的 Pusher-v5 环境中训练一个七维机械臂把物块推向目标区域。
项目简介
Pusher-v5 比 Reacher-v5 更难:动作维度更高,奖励也更稀疏一些,因此这里更适合把它当成一个 DDPG baseline 项目,而不是一个保证快速收敛的“秒通”示例。
这个项目保持了和 ddpg-reacher-v5 一致的代码结构,方便你横向比较不同 MuJoCo 连续控制任务在同一种算法下的训练表现。
代码结构
ddpg-pusher-v5/
├── figs/
│ └── pusher-baseline.gif
├── index.mdx
└── train_ddpg_pusher_v5.py
环境要求
pip install gymnasium[mujoco] torch numpy tqdm imageio
如果你本地已经有仓库里的 conda 环境,推荐直接使用:
source /home/jj/anaconda3/etc/profile.d/conda.sh
conda activate easy-robotics
快速开始
默认命令会在 Pusher-v5 上训练,并把 actor 权重保存到 artifacts/ddpg_pusher_v5_actor.pt:
python projects/ddpg-pusher-v5/train_ddpg_pusher_v5.py
如果你想训练后直接跑几回合策略演示:
python projects/ddpg-pusher-v5/train_ddpg_pusher_v5.py \
--total-steps 250000 \
--demo-episodes 2 \
--demo-render
如果只是先做一次快速冒烟测试:
python projects/ddpg-pusher-v5/train_ddpg_pusher_v5.py \
--total-steps 40 \
--start-steps 10 \
--batch-size 8 \
--buffer-size 200 \
--eval-interval 20 \
--eval-episodes 1 \
--device cpu
如果你想训练结束后离屏导出一个 gif:
python projects/ddpg-pusher-v5/train_ddpg_pusher_v5.py \
--total-steps 250000 \
--record-path projects/ddpg-pusher-v5/figs/pusher-baseline.gif
最终效果
使用默认 seed=42 训练 250000 步后录制得到,对应 final_eval_return=-33.37:

默认参数
这个 demo 针对 Pusher-v5 预设了一组更偏向 baseline 的超参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
--env-id | Pusher-v5 | 默认环境 |
--total-steps | 250000 | 总训练步数 |
--start-steps | 10000 | 纯随机探索步数 |
--batch-size | 256 | 每次更新的 batch 大小 |
--buffer-size | 300000 | 回放缓冲区容量 |
--exploration-noise | 0.2 | 高斯探索噪声比例 |
--eval-interval | 25000 | 评估间隔 |
--eval-episodes | 10 | 每次评估回合数 |
--demo-episodes | 0 | 训练后是否额外跑 demo |
--record-path | None | 如果设置则额外导出 gif 或 mp4 |
--record-episodes | 1 | 录制多少个 episode |
--record-fps | 20 | 导出媒体帧率 |
--record-frame-skip | 3 | 每隔多少环境步采一帧 |
--save-path | artifacts/ddpg_pusher_v5_actor.pt | 模型保存路径 |
实现要点
- 仍然使用单文件纯 PyTorch 实现,便于和
Reacher-v5项目做一一对照 - Actor 输出经过
tanh映射回环境动作范围[-2, 2] - Critic 输入为
(obs, action)拼接后的向量 - 时间截断
truncated不会被当作真正终止,目标值仍然继续 bootstrap - 如果设置
--record-path,脚本会在离屏rgb_array模式下导出 gif 或 mp4
训练建议
Pusher-v5相比Reacher-v5更难,DDPG 对超参数更敏感- 如果默认设置效果一般,可以先把
--total-steps提高到400000 - 也可以尝试更强的连续控制算法,比如 TD3 或 SAC 作为对照基线