环境
Gymnasium 作为环境接口,
PyBullet作为物理仿真平台,
Stable Baselines3 用于训练算法。
测试框架搭建
以pybullet自带的Cart-pole-v1为例
- 安装依赖:确保安装了 Gymnasium 和 SB3 ( pip install gymnasium stable-baselines3 ).
- 初始化环境:使用 gymnasium.make(‘CartPole-v1’) 创建环境 。CartPole 是一个平衡小车杆环
境,状态包括小车位置、速度、杆角度等,动作是向左或向右施加推力。 - Agent-环境交互循环:Gymnasium 遵循标准的 RL 循环:agent 观察环境状态,选择一个动作,环境
执行动作并返回新的观察、奖励以及是否终止的标志 。CartPole 中,每个时间步小车不倒就奖励
+1,杆倒下或达到步数上限则 episode 结束。 - 使用 SB3 算法训练:实例化一个 SB3 算法(例如 PPO),并调用 model.learn(total_timesteps) 开
始训练。
完整实现:
import gymnasium as gym
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
from stable_baselines3.common.callbacks import EvalCallback
import pybullet as penv_id = "CartPole-v1"
# 创建两个向量化环境(一个训练,一个验证)
env = DummyVecEnv([lambda: gym.make(env_id)])
eval_env = DummyVecEnv([lambda: gym.make(env_id)])# 注册保存回调:每 5000 步自动评估并保存最优模型
eval_callback = EvalCallback(eval_env,best_model_save_path="./logs/best_model",log_path="./logs/eval",eval_freq=5_000,deterministic=True,render=False,
)# 初始化PPO训练模型
model = PPO(policy="MlpPolicy",env=env,learning_rate=3e-4,n_steps=2048, # 每轮采集步数batch_size=64,gamma=0.99,gae_lambda=0.95,clip_range=0.2, # PPO 截断 εent_coef=0.01, # 鼓励探索verbose=1,tensorboard_log="./tensorboard",
)
# 训练
model.learn(total_timesteps=100_000, callback=eval_callback)
# 保存权重
model.save("ppo_cartpole_final")
使用自定义的环境进行训练
为了使用gym的相关配套工具,我们需要按照gym的规范创建自己的环境,大致流程如下:
- 创建一个符合Gymnasium规范的env类,继承自gym.Env,
- 在构造函数中实现:
- p.connect()连接到pybullet,设置物理参数:重力方向、大小、仿真步长
- 加载地面
- 加载robot的URDF,并设置初始位置和方向
- 定义 action_space和observation_space,设置随机种子
- 至少实现方法observation / reward / reset / step
- 在 reset() 中启动/重置仿真
- 在 step() 中实现一步物理推进
- 根据bullet返回的物理状态,主动计算reward
- 在构造函数中实现:
- 其他步骤同测试框架搭建,只是将创建环境部分替换为
from stable_baselines3.common.env_checker import check_env env = MyRobotEnv() check_env(env) # 将输出环境接口的检查结果
reset()方法
主要干这几件事:
- 设定随机种子
- 将当前步设置为0
- 重置仿真
- 设置重力
- 导入地面和机器人URDF
- 初始化关节状态
- 热身
- 获取状态并返回出去
step()方法
主要干这几件事:
- 当前步+=1
- 逐关节应用action
- 仿真一步
- 获取状态信息
- 计算奖励
- 判断终止
- 返回obs, reward, terminated, truncated, info(这五个一个都不能少)