やってみた!

やってみた!

試したことを中心に、書評や興味のあること、思ったこととか

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 -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
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())

f:id:akifukka:20200125081754g:plain
(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でもふらふら歩けるようになると思っていましたが甘かった。では!

つづく

強化学習 カテゴリーの記事一覧 - やってみた!