はじめに
前回、Mujocoをインストールから、お試しプログラム(4足歩行、倒立振り子)まで体験しました。今回は、その続きで2足歩行をやってみました。
2足歩行
プログラムは前回とほぼ同じです。以下の2か所の InvertedPendulum-v5 を
train_env = gym.make("InvertedPendulum-v5")
eval_env = gym.make(
"InvertedPendulum-v5",
render_mode="human",
width=1400,
height=900
)
以下のように、Walker-2d-v5 に入れ替えただけです。
train_env = gym.make("Walker2d-v5")
eval_env = gym.make(
"Walker2d-v5",
render_mode="human",
width=1400,
height=900
)
あとは、歩行ロボットと一緒に視点(カメラ位置)が連動するようにしました。
まず、プログラムの最初の方で、mujoco を import しておきます。
import mujoco
そして、以下の部分を
obs, info = eval_env.reset()
eval_env.unwrapped.mujoco_renderer.viewer.cam.distance = 2.0
eval_env.unwrapped.mujoco_renderer.viewer.cam.elevation = -20
今回は以下で置き換えています。カメラ位置は特に、
viewer.cam.type = mujoco.mjtCamera.mjCAMERA_TRACKING
で有効にしています。
obs, info = eval_env.reset()
viewer = eval_env.unwrapped.mujoco_renderer.viewer
viewer.cam.type = mujoco.mjtCamera.mjCAMERA_TRACKING
viewer.cam.trackbodyid = 1
viewer.cam.distance = 4.0
viewer.cam.elevation = -10
念のため、全体リストを示します。二足歩行は学習量が多く必要なため、
model.learn(total_timesteps=500000)
のように 500000 と大きな値にしています。
ファイル名は train_5.py で保存して、実行しました。
import gymnasium as gym
from stable_baselines3 import PPO
import mujoco
# =========================
# 学習用環境(描画なし)
# =========================
train_env = gym.make("Walker2d-v5")
# =========================
# PPOモデル作成
# =========================
model = PPO(
"MlpPolicy",
train_env,
verbose=1
)
# =========================
# 学習
# =========================
model.learn(total_timesteps=500000)
# =========================
# モデル保存
# =========================
model.save("ppo_Walker2d-v5")
# 学習環境終了
train_env.close()
# =========================
# 評価用環境(描画あり)
# =========================
eval_env = gym.make(
"Walker2d-v5",
render_mode="human",
width=1400,
height=900
)
obs, info = eval_env.reset()
viewer = eval_env.unwrapped.mujoco_renderer.viewer
viewer.cam.type = mujoco.mjtCamera.mjCAMERA_TRACKING
viewer.cam.trackbodyid = 1
viewer.cam.distance = 4.0
viewer.cam.elevation = -10
episode_reward = 0.0
# =========================
# 学習済みモデルで動作確認
# =========================
for step in range(1000):
# 学習済みモデルが行動を決定
action, _states = model.predict(
obs,
deterministic=True
)
# 1ステップ進める
obs, reward, terminated, truncated, info = eval_env.step(action)
# 報酬加算
episode_reward += reward
# 状態表示
print(f"step = {step}")
print("action =", action)
print("reward =", reward)
print("episode_reward =", episode_reward)
print()
# エピソード終了判定
if terminated or truncated:
print("Episode finished")
print("Total episode reward =", episode_reward)
print()
obs, info = eval_env.reset()
episode_reward = 0.0
eval_env.close()
total_timesteps=500000 としたおかげで、スキップするような動きができるようになりました。
おわりに
Mujoco サンプルプログラムとして「2足歩行」を試してみました。