Kei Minagawa's Blog

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

gymモジュール Pendulum-v0 で振り子を等速度で回転させる

gym モジュールの Pendulum-v0 とは以下のような振り子のシミュレータです。

f:id:keimina:20200306000655p:plain

図1. Pendulum-v0

今回は、このシュミレータを用いて、振り子を等速度で回転させるプログラムを書きます。振り子をアナログ時計の秒針のように一定の速度でグルグル回すことを目的とします。このプログラムを作ることで gymモジュール の API に触れ、gymの理解を深めます。振り子をグルグル回してAPI に触れるだけです。強化学習は使いません。もう一度言いますが、強化学習で振り子を等速度に制御する話ではありません。

1 そもそも gym とは

gym とは公式サイトによると以下のように記載されています。

公式サイト(https://gym.openai.com/)の説明 翻訳
Gym is a toolkit for developing and comparing reinforcement learning algorithms. It supports teaching agents everything from walking to playing games like Pong or Pinball. Gym とは reinforcement learning(強化学習) アルゴリズムの開発や比較のためのツールキットです.歩行からPongやピンボールまでエージェントの教育をサポートします。

表1. gymとは

強化学習の理論の確認や練習に使えそうです。

2 Pendulum-v0 とは

Pendulum とは日本語では振り子を意味します。さらに v-0 はバージョン0ということです。gym の Pendulum-v0 はシンプルな振り子の環境を表しています。なんとなくv-1, v-2 なども存在しそうなことがわかります。

3 コード

今回書いたコードは以下になります。 1秒間に 45° だけ回転します。 それを8回繰り返して1周させています。

import gym
import time
from math import pi

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

# 初期状態
theta = 0
env.env.state = theta, 0     # 振り子の theta, speed を設定
env.render('human')          # 描画
time.sleep(1)                # 1秒待つ

for i in range(8):
        theta += pi/4            # theta
        env.env.state = theta, 0 # 振り子の theta, speed を設定
        env.render('human')      # 描画
        time.sleep(1)            # 1秒待つ

env.close()

コード1. gymモジュール Pendulum-v0 で振り子を等速度で回転させる

4 コードの説明

env.env.state がポイントで、調べたところ、この変数が振り子の角度、振り子の速さの二つの情報を保持しているようでした。今回のプログラムでは、この変数に、振り子の角度を代入することで、振り子の角度を設定しています。最後に env.render() を実行し振り子のビジュアルな状態をディスプレイ上に書き出します。

5 出力結果

以下のように、振り子が1秒間に 45° だけ回転し、1週します。

f:id:keimina:20200306001238g:plain

図2. 出力結果

6 まとめ

gymモジュールの Pendulum-v0 の環境を使用し、 振り子を等速度で回転させました。(厳密にいうと等速度に回転しているように見えるようにプログラムした)env.env.state で振り子の位置(角度)を指定できることがわかりました。gymモジュールの API をほんの少し理解することができました。

以上です、おやすみなさい。