環境
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(這五個一個都不能少)