A2C-PandaReachDense-v3

用 A2C(Advantage Actor-Critic)训练的 Franka Emika Panda 机械臂"够到目标"智能体。 对应《第3周-深度强化学习原理实践》实战二(PPT 第 18–26 页)。

  • 环境:PandaReachDense-v3(panda-gym 3.0.7,末端执行器位移控制,动作 = x/y/z 位移)
  • 算法:Stable-Baselines3 A2C,MultiInputPolicy(观测是多键字典)
  • 预处理:VecNormalize(norm_obs=True, norm_reward=True, clip_obs=10.0),4 个并行环境
  • 训练步数:500,000 步(81 分钟,平均 103 步/秒)
  • 训练日期:2026-10-28 10:05:42

评估分数(贪心策略,20 局独立评估)

指标 数值
平均回报 -0.27 ± 0.11
成功率(末端距离 < 5 cm) 100%
平均末端误差 29.3 mm
单局最大步数 50

环境奖励 = 每步 −(末端到目标距离),回报越接近 0 越好;PPT 的参考结果是 −0.21 ± 0.11。

回放视频

https://huggingface.co/你的用户名/a2c-PandaReachDense-v3/resolve/main/replay_a2c_panda_reach.mp4

replay

本地文件:replay_a2c_panda_reach.mp4(720×480 / 20fps)

使用方法

import gymnasium as gym
import panda_gym  # noqa: F401  注册环境
from stable_baselines3 import A2C
from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize

env = DummyVecEnv([lambda: gym.make("PandaReachDense-v3", render_mode="rgb_array")])
env = VecNormalize.load("vec_normalize.pkl", env)   # 必须加载同一份归一化统计量!
env.training = False
env.norm_reward = False
model = A2C.load("a2c_panda_reach.zip", env=env)

obs = env.reset()
while True:
    action, _ = model.predict(obs, deterministic=True)
    obs, reward, done, info = env.step(action)
    if done[0]:
        break

⚠️ 模型是和 vec_normalize.pkl 一起训练的,缺了它输入分布会不一致,动作会全错。

训练日志摘录

训练过程每 1 万步记录一次(logs/a2c_panda_reach/progress.csv 里有完整数据), 曲线见 train_curve.png;每 10 万步用独立环境评估一次(评估时加载同一份归一化统计量)。

文件说明

文件 说明
a2c_panda_reach.zip A2C 智能体权重(Stable-Baselines3 格式)
vec_normalize.pkl 观测/奖励归一化统计量(必须与模型配套使用)
replay_a2c_panda_reach.mp4 10 局回放视频(片头片尾含评估分数)
eval_results.json 逐局评估明细
train_a2c_panda.py 训练代码(含日志/评估/checkpoint)
evaluate_and_record.py 评估 + 录制回放视频代码
train_curve.png 训练曲线

复现

pip install stable-baselines3==2.7.1 panda-gym==3.0.7
python train_a2c_panda.py --total-timesteps 500000 --n-envs 4
python evaluate_and_record.py --episodes 20
Downloads last month
-
Video Preview
loading

Evaluation results