从零跑通 PPO 双足机器人

从零跑通 PPO 双足机器人:我的完整实战笔记

一、项目概况

项目地址:https://github.com/jianglanwei/PPO-OpenAI-Gym

核心算法:PPO(Proximal Policy Optimization)

训练环境:Gymnasium(原 OpenAI Gym)的 BipedalWalker-v3

框架:PyTorch + wandb 可视化

最终效果:训练 960 轮,平均奖励 310.37,超过通关阈值 300 分,机器人能够稳定行走。

二、环境搭建(Windows 10/11)

  1. 下载与解压

    从 GitHub 下载 ZIP 包,解压到 C:\Users\你的用户名\PPO-OpenAI-Gym-main。

  2. 创建 Conda 环境(可选)

    cmd

    conda create -n gym python=3.10

    conda activate gym

  3. 安装依赖

    关键坑:Windows 下 box2d 容易编译失败,因此先装 swig。

cmd

pip install swig

pip install -r requirements.txt

如果还是报错,改用全套手动安装:

cmd

pip install torch gymnasium box2d-py numpy matplotlib wandb onnx onnxruntime

pip install gymnasiumbox2d

  1. 检查预训练权重

作者提供了训练好的模型,位于 policy_ckpt/BipedalWalker-v3/06-05-25_03_09_03/epoch960_reward310.37.pt。确认存在后,直接跳过训练,进入可视化。

三、运行可视化

执行以下命令,会弹出游戏窗口:

cmd

python play.py --env BipedalWalker-v3 --run 06-05-25_03_09_03 --render_mode human

如果窗口黑屏或报错(无显示驱动),改用生成 GIF:

cmd

python play.py --env BipedalWalker-v3 --run 06-05-25_03_09_03 --render_mode rgb_array

成功后,你将看到一个两条腿的机器人在崎岖地形上摇摇晃晃向前走,并且多数时候只有一条腿着地------这是正常步态。

四、为什么机器人只有一条腿着地?

这并非缺陷,而是双足行走的物理最优解。

在 BipedalWalker 中,机器人有两个髋关节和两个膝关节,共 4 个连续动作(力矩)。地形的起伏使单脚支撑相更节能,且能维持前进速度。

训练过程中,奖励函数鼓励 "向前移动 + 保持平衡"。PPO 策略学到的步态类似于人类的"交替迈步",自然出现单腿承重、另一条腿摆动的相位差。

如果你仔细观察,它并非始终单腿,而是在迈步时短暂切换支撑腿,形成动态稳定。这正是强化学习学到的类生物步态。

五、核心算法详解:为什么 PPO 能成功?

  1. PPO 的设计哲学
    背景:策略梯度方法(如 REINFORCE)更新步长难控制,过大导致崩溃,过小导致训练缓慢。

PPO 核心:通过裁剪(Clipping)目标函数,限制新旧策略的比率 r_t(θ) = π_θ(a|s) / π_old(a|s) 在 1-ε, 1+ε(通常 ε=0.2),从而温和地更新策略,既不激进也不保守。

  1. 具体目标函数

当优势 A_t > 0(动作比平均好),鼓励增加该动作概率,但被截断防止过度。

当 A_t < 0,减少概率,也受截断保护。

  1. 连续动作的处理
    Actor 网络输出高斯分布的均值 μ 和标准差 σ,动作通过重参数化采样:a = μ + σ * noise。

Critic 网络估计状态价值 V(s),用于计算优势函数(GAE)。

  1. 为什么成功?
    样本效率:PPO 是 on-policy,但通过多个 epoch 的小批量更新,比 A3C 更稳定。

超参数鲁棒性:相比 TRPO,PPO 无需复杂的共轭梯度,实现简单且效果相当。

连续控制适配:高斯策略天然适合力矩输出,且 Clip 机制避免策略突变破坏物理模拟。

六、与其他主流算法的差距

算法 动作空间 稳定性 样本效率 实现复杂度 适用场景

DQN 离散 较好 中等 简单 Atari, 离散控制

A3C 连续(通过高斯) 较差(异步抖动) 中等 中等 并行训练

TRPO 连续 高(信赖域) 高 复杂(共轭梯度) 理论优雅

PPO 连续 高 高 简单 工业界首选

SAC 连续 高 很高(离线) 中等 需要最大熵探索

DQN 无法直接处理连续动作,需离散化,丢失精度。

A3C 因异步更新,训练不稳定,且不保证收敛。

TRPO 理论更严谨,但实现复杂,调试困难。

SAC 在某些任务上比 PPO 更好,但它需要离线缓冲,且超参数调优更敏感。本项目选择 PPO 是因为其稳定 + 简单 + 高效。

七、项目各文件夹含义

text

PPO-OpenAI-Gym-main/

├── config/ # 超参数配置文件(YAML)

│ ├── BipedalWalker-v3.yaml # 双足行走的参数(lr=3e-4, clip=0.2, gamma=0.99...)

│ └── Humanoid-v5.yaml # 更复杂的人形机器人

├── policy_ckpt/ # 存储训练好的模型权重

│ └── BipedalWalker-v3/

│ └── 06-05-25_03_09_03/ # 按时间戳命名的运行

│ ├── epoch960_reward310.37.pt # 检查点文件(PyTorch 状态字典)

│ └── ...(可能包含多个epoch)

├── module.py # 神经网络定义(Actor-Critic 网络)

│ # 包含 MLP 基类、策略网络(高斯输出)、价值网络

├── train.py # 训练主脚本(支持断点恢复)

├── play.py # 可视化脚本(加载权重并渲染)

├── export_onnx.py # 将模型导出为 ONNX 格式(部署用)

├── requirements.txt # 依赖列表

└── README.md # 项目说明

关键文件说明:

module.py:定义了 ActorCritic 类,包含 forward() 同时输出动作均值和状态值。

train.py:实现 PPO 训练循环,包括数据收集、优势计算、策略更新、记录 wandb。

play.py:使用 gymnasium.make() 创建环境,加载 .pt 文件,设置 render_mode,执行确定性策略。

八、Pygame 的作用与完成度

本项目使用 Gymnasium 的渲染后端,而 Gymnasium 在 Windows 下默认调用 pygame 进行 2D 渲染(Box2D 环境)。

是否完成:完全可用。执行 play.py 后,pygame 窗口正常弹出,显示地形、机器人和关节连接线。

注意:如果无桌面环境(如远程服务器),render_mode='human' 会失败,但 'rgb_array' 可生成图像序列,再合成 GIF,这部分也在 play.py 中实现。

九、我的实战心得

先跑通再读论文:以前我只看理论,这次直接上手,理解深了很多。

预训练模型是救命稻草:时间紧时,直接加载作者权重,观察效果,再反向推导训练参数。

调试技巧:遇到显示问题,立刻转 rgb_array;遇到安装错误,用 swig 前置安装。

十、总结

通过这个小项目,我不仅掌握了 PPO 的工程实现,更直观理解了连续动作空间的策略优化。面试时,我可以自信地说:

"我完整配置并运行了 OpenAI Gym 的 BipedalWalker 环境,使用 PPO 算法获得 310 分的通关成绩。我清楚 PPO 通过 Clip 机制稳定训练,对比 DQN 和 A3C 等算法,PPO 在连续控制任务中兼具简单性和高效性。项目代码结构清晰,支持 wandb 可视化和断点续训,具备实际工程价值。"

如果你也在准备面试,强烈推荐亲自跑一次,哪怕只跑通可视化。实践带来的底气,远胜过背一百道八股题。 祝所有读者都能拿到心仪 Offer!

附录:一键复现命令汇总(Windows)

cmd

git clone https://github.com/jianglanwei/PPO-OpenAI-Gym

cd PPO-OpenAI-Gym

pip install swig

pip install -r requirements.txt

python play.py --env BipedalWalker-v3 --run 06-05-25_03_09_03 --render_mode human

相关推荐
神经智研社3 小时前
ROS2-13章:机器人仿真环境介绍Turtlesim示例
机器人·机器人环境搭建·ros2 jazzy·机器人坐标系系统
Excel效率人5 小时前
飞书自动回复机器人开发:@机器人自助查询物流信息
机器人·node.js·飞书
茯苓gao1 天前
嵌入式开发笔记:工业机器人通信协议深度解析——从现场总线到工业以太网
笔记·嵌入式硬件·学习·机器人·信息与通信
鲁邦通物联网1 天前
基于GPIO与高频滤波的状态机:非侵入式机器人梯控精准平层判定实现
机器人·巡检机器人·机器人梯控·agv梯控·非侵入式采集·机器人乘梯·机器人自主乘梯
牛哥带你学代码1 天前
VLA 与机器人基础模型:具身智能的下一代操作系统
人工智能·机器人
code_pgf1 天前
大模型赋能家庭服务机器人的场景适应性分析
大数据·人工智能·机器人
深度森林2 天前
机器人领域“工业机械臂”高价值专利案例:一种工业机器人智能分拣方法
机器人·工业机械臂
XMan_Liu2 天前
AI聊天机器人架构学习
人工智能·架构·机器人