环境

Gymnasium 作为环境接口,
PyBullet作为物理仿真平台,
Stable Baselines3 用于训练算法。

测试框架搭建

以pybullet自带的Cart-pole-v1为例

  1. 安装依赖:确保安装了 Gymnasium 和 SB3 ( pip install gymnasium stable-baselines3 ).
  2. 初始化环境:使用 gymnasium.make(‘CartPole-v1’) 创建环境 。CartPole 是一个平衡小车杆环
    境,状态包括小车位置、速度、杆角度等,动作是向左或向右施加推力。
  3. Agent-环境交互循环:Gymnasium 遵循标准的 RL 循环:agent 观察环境状态,选择一个动作,环境
    执行动作并返回新的观察、奖励以及是否终止的标志 。CartPole 中,每个时间步小车不倒就奖励
    +1,杆倒下或达到步数上限则 episode 结束。
  4. 使用 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 p

env_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的规范创建自己的环境,大致流程如下:

  1. 创建一个符合Gymnasium规范的env类,继承自gym.Env,
    • 在构造函数中实现:
      • p.connect()连接到pybullet,设置物理参数:重力方向、大小、仿真步长
      • 加载地面
      • 加载robot的URDF,并设置初始位置和方向
      • 定义 action_space和observation_space,设置随机种子
    • 至少实现方法observation / reward / reset / step
      • 在 reset() 中启动/重置仿真
      • 在 step() 中实现一步物理推进
      • 根据bullet返回的物理状态,主动计算reward
  2. 其他步骤同测试框架搭建,只是将创建环境部分替换为
    from stable_baselines3.common.env_checker import check_env
    env = MyRobotEnv()
    check_env(env) # 将输出环境接口的检查结果
    

reset()方法

主要干这几件事:

  1. 设定随机种子
  2. 将当前步设置为0
  3. 重置仿真
  4. 设置重力
  5. 导入地面和机器人URDF
  6. 初始化关节状态
  7. 热身
  8. 获取状态并返回出去

step()方法

主要干这几件事:

  1. 当前步+=1
  2. 逐关节应用action
  3. 仿真一步
  4. 获取状态信息
  5. 计算奖励
  6. 判断终止
  7. 返回obs, reward, terminated, truncated, info(这五个一个都不能少)
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐