Kei Minagawa's Blog

皆川圭(@keimina)のブログ、Pythonで試したことを書いていきます

gymモジュール Pendulum-v0 で振り子を揺らす

前回に続き、gym モジュールの Pendulum-v0 の理解を深めます。今回は、 手で振り子を水平状態にし、離すことに相当するシミュレーションを行います。今回も、強化学習は行いません。シミュレータの理解を深めます。

1 前回の記事

前回の記事はこちらです。gymとは何か、pendulumとは何かについてはこちらをご覧ください。

keimina.hatenablog.jp

2 今回行うこと

今回は、 手で振り子を水平状態にし、離すことに相当するシミュレーションを行います。この日本語を、プログラム的に表すと以下になります。

No 日本語 プログラム 説明
1 手で振り子を水平状態にする initial_theta = pi/2 水平状態に相当する角度は pi/2 のため、振り子の初期の角度を pi/2にします
2 振り子から手を離す initial_speed = 0 手をそっと離すため、速度が0のため、振り子の初速度を 0 にします
3 シミュレーションする env.step([0]) 手を離したあと、物理法則に従って振り子が動いて欲しいため env.step を使用します。引数の値はトルクを表し、今回は[0]とします。(トルクを与えると手を離すだけだけでなくなってしまいます

表1. 今回行うこと

3 コード

今回書いたコードは以下になります。

import gym
import time
from math import pi

env = gym.make('Pendulum-v0') # 強化学習の文脈における「環境」の作成
env.reset()                   # 環境の初期化(明示的に行う必要がある)

# 初期状態
initial_theta = pi/2
initial_speed = 0
theta = initial_theta
speed = initial_speed
env.env.state = theta, speed     # 振り子の theta, speed を設定
env.render('human')          # 描画
time.sleep(0.033)            # 待つ、 0.033 は 30fps にするため

for i in range(300):         # 30fps で 10秒間表示
        env.step([0])            # トルク 0 で振り子を次の位置に更新する
        env.render('human')      # 描画
        time.sleep(0.033)        # 待つ、 0.033 は 30fps にするため

env.close()

4 コードの説明

env.step([x]) で、トルクx を振り子に与えて、シミュレーションを 1ステップ進めることができます。今回は env.step([0])で、トルク0、すなわちトルクを与えず、シミュレーションを1ステップ進めています。

5 出力結果

こちらからトルクは与えませんが、重力はデフォルトでかかっている状態のため、シミュレーション結果をみると現実世界の振り子のような動きになることがわかります。減衰する様子は見られないため、摩擦はないことがわかります。

f:id:keimina:20200307194138g:plain

図1. 出力結果

6 まとめ

gymモジュールの Pendulum-v0 の環境を使用し、 振り子を水平状態にし、離すことに相当するシミュレーションを行いました。現実世界の振り子のような動きになることがわかりました。

以上です。