PyBullet-HumanoidFlagrunHarderBulletEnv-v0(1)
次は3Dの物理シミュレータを使ってみます。以前はOpen AI Gymで使える3D物理環境は有料のMuJoCo用だけでしたが、今では無料で使えるPyBullet用環境(env)もあるということなので、こちらを使ってみます。
PyBulletはErwin Cumansさんらが開発したオープンソースの3D物理シミュレーションツールです。ロボット業界で広く使われている物理モデル記述法であるURDFに対応しており応用範囲は広そうです。Erwin Cumansさんは今はGoogleで働いているそうな。
もともとMuJoCo用に用意されたOpen AI Gymのenvが、PyBullet用に書き直されGithub上のPyBulletの以下のフォルダに収納されています。
bullet3/examples/pybullet/gym/pybullet_envs/
手始め?に、あらかじめ用意されているenv、HumanoidFlagrunHarderBulletEnv-v0を試してみます。実は、DDPGで1週間ほど試行錯誤しながら学習させてみたのですが、いつまでたっても歩けるようにならず・・・。ということで今回は学習済みサンプルを使っての紹介です。
1.HumanoidFlagrunHarderBulletEnv-v0
ソースコードはbullet3/examples/pybullet/gym/pybullet_envs/gym_locomotion_envs.py
です。人型のロボットが赤い球状のFlag(旗)を走って追いかける動作を学習するための環境です。
(1)動かしてみる
PyBulletの以下フォルダに学習済みactorを使ったデモプログラムが用意されています。このままだとColaboratoryで絵を描けないので改造して動かします。
bullet3/examples/pybullet/gym/pybullet_envs/examples/enjoy_TF_HumanoidFlagrunHarderBulletEnv_v1_2017jul.py
①Colaboratoryノートブックの作成
ColaboratoryでPython3の新しいノートブックを作成、ランタイム-ランタイムのタイプを変更でハードウェアアクセラレータにGPUをセットします。
ノートブックに適当な名前をつけます。
②ライブラリをインストールします
今までと違い、最後にpybulletをインストールする行が追加されています。
!apt-get update
!apt-get -qq -y install xvfb freeglut3-dev ffmpeg
!pip3 -q install pyglet
!pip3 -q install pyopengl
!pip3 -q install pyvirtualdisplay
!apt-get install x11-utils
!pip3 install pybullet
③Runtimeを再起動
インストールしたライブラリを有効にするためランタイムを再起動します。
ランタイム-ランタイムの再起動
④学習済みactorのクラス定義ファイルをGithubからコピー
!wget https://raw.githubusercontent.com/bulletphysics/bullet3/master/examples/pybullet/gym/pybullet_envs/examples/enjoy_TF_HumanoidFlagrunHarderBulletEnv_v1_2017jul.py
⑤環境を動かします
from enjoy_TF_HumanoidFlagrunHarderBulletEnv_v1_2017jul import SmallReactivePolicy
import gym
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.animation
from PIL import Image
from IPython.display import HTML
from pyvirtualdisplay import Display
display = Display(visible=0, size=(1024, 768))
display.start()
import os
#pyvirtualdisplayの仕様変更で次の文はエラーになるのでコメントアウトします(2021/6/5修正)
#os.environ["DISPLAY"] = ":" + str(display.display) + "." + str(display.screen)
env = gym.make('HumanoidFlagrunHarderBulletEnv-v0')
pi = SmallReactivePolicy(env.observation_space, env.action_space)
frames = []
t = 0
done = False
reward_total = 0.0
observation = env.reset()
while not done and t < 1400:
action = pi.act(observation)
#物理モデル1ステップ---------------------------
observation, reward, done, info = env.step(action)
reward_total = reward_total + reward
#動画
frames.append(env.render(mode = 'rgb_array'))
#時間を進める----------------------------------
t += 1
# end while loop ------------------------------
print('reward=',reward_total)
fig = plt.figure(figsize=(6, 6))
plt.axis('off')
images = []
for f in frames:
image = plt.imshow(f)
images.append([image])
ani = matplotlib.animation.ArtistAnimation(fig, images, interval=30, repeat_delay=1)
HTML(ani.to_jshtml())
(2)報酬について
ソースコード、bullet3/examples/pybullet/gym/pybullet_envs/gym_locomotion_envs.pyを読むと報酬は次の総和で与えられるようです。詳しくはWalkerBaseBulletEnvのdef step内のself.rewardsから内容を追いかけることができます。
- self._alive
倒れている:-1
立っている:1~2の間でbodyのz座標による。通常歩行している高さなら2。
robot_locomotors.pyのclass HumanoidFlagrunHarder、def alive_bonus参照 - progress(進捗)
potentialの差(進捗分)。potentialは次の値で与えられる。ロボットが立ち上がるのは姿勢の報酬があるため。
姿勢 :立っている200、寝ている100
目標との距離 :距離/step時間 potentialの進捗が目標接近速度になる
class HumanoidFlagrunHarder、def calc_potential参照。 - electricity_cost
関節の速度とトルクから計算したDCモータに対するコスト(負の値になる)
gym_locomotion_envs.pyのWalkerBaseBulletEnvのdef step参照。 - joints_at_limit_cost
関節が限界まで曲がっている、伸びきっている時の減点。
gym_locomotion_envs.pyのWalkerBaseBulletEnvのdef step参照。 - feet_collision_cost
たぶん未使用で0のまま
今回のまとめ
3Dの物理シミュレータPyBulletを使ったOpen AI Gym用env、HumanoidFlagrunHarderBulletEnv-v0を学習済みサンプルを使い、Google Colaboratoryで動かしてみました。
また、DDPGで学習に挑戦してみましたが、いつまでたっても歩けるようになりませんでした(うまくいかなかったので記事にはしていません)。
ということで、単純なDDPGではなくて、その改良型
Twin Delayed DDPG — Spinning Up documentation
Soft Actor-Critic — Spinning Up documentation
といったあたりに挑戦する必要がありそうです・・・。時間かかりそうですね。DDPGでもふらふら歩けるようになると思っていましたが甘かった。では!
つづく