4/14(日) 足・靴・木型研究会「第2回研究集会」を開催します☆彡

レーシングゲーム「vcracing」チュートリアル

English available.

vcracing、爆誕

概要

手動で運転してもよし、機械学習で運転してもよし。「vcracing(ぶいしーれーしんぐ)」は機械学習向けレーシングゲームです。OpenAI Gym の CarRacing とは異なり、以下のように機械学習向けの設計となっています。

  • コースの状態(環境)が取得可能
  • 環境の保存と複製が可能

OpenAI Gym の CarRacing (→本家サイト)を機械学習向けに魔改造していましたが(→参照記事)、気がつくと原型を留めていなかったため、僭越ながら別名でリリースいたしました。

本家は「即時報酬」と「ゲーム終了判定」のみを取得可能だったため、機械学習による自律走行はほとんど不可能な設計でした。vcracing はコースや車体の状態が取得可能であるため、ランダムなコースに対する汎化性の高い学習が望めます。

また、本家は「環境の保存」と「複製」が不可能のため、途中で分岐して分散探索することができず、結果として無駄な学習時間を費やすことになります。vcracing は copy.deepcopy() によって環境の保存と複製が可能なため、多様な学習戦略に応えます。

インストール方法
pip install vcracing
サンプルコード
from vcracing import vcracing

# Load game
env = vcracing()

# See starting image
env.render()

# Drive
for i in range(30):
    # Chose action
    # [Steer, Accel] where Steer in [-1, +1], Accel in [-1, +1]
    # Note that Steer>0 turns LEFT, Accel<0 reverse gear
    action = [0.1, 1] #[Steer, Accel]
    
    # Step
    state, reward, over, done = env.step(action)
    #env.render() # See every step image

# See current image
env.render()
遊び方

action は [0, 1] で加速、 [0.2, 1] で左旋回です。道路は n 枚のパネルで構成され、各パネルを踏むと (100/n) 点の reward が得られます。state[‘rewards’]==100 または done==True でコース制覇となります。

env = vcracing(track_seed=1) のようにシード値を指定すると決められたコースが生成されます。state = reset() でコースを変えずにリセットできます。

急旋回は速度を大きく減少させますので、良いタイムを目指すには緩やかな旋回を心がける必要があります。

手動での走行例

このようにスタートから順に play() を探っていきます。最後の2フレームを確認しながら play() を調整・積み上げることで、比較的かんたんに手動でゴールを目指すことができるでしょう。

#コース指定
env = vcracing(track_len=200, track_seed=5, car=None)

#あるactionであるstep進める関数
def play(action, step):
    for i in range(step):
        _, _, _, _ = env.step(action)
        #env.render()

#順にプレイ
play([0, 1], 10)
play([0.35, 1], 8)
play([0, 1], 20)
play([0.8, 1], 12)
play([0, 1], 75)
play([0.35, 1], 65)
play([0, 1], 95)
play([0.35, 1], 60)
play([0, 1], 24)

#最後の2フレームを確認
for i in range(2):
    action = [0, 1]
    _, _, _, done = env.step(action)
    print(done)
    env.render()

仕様

ゲームの読み込み+リセット

ここではコースの自動生成と車種の選択が行われます。コースはおおよその長さと生成シードが指定できます。

ゲームのリセットの際にコースを変更しない場合は、後述する reset() によるリセットを行うことを推奨します。

env = vcracing(track_len=200, track_seed=None, car='BT46')
track_lenint自動生成されるコースの大まかな長さです(単位:m)。200~3000程度が推奨されます。長いコースほど複雑に入り組む傾向があります。
track_seedintコース自動生成時の乱数シードを固定することができます。ランダム生成されたコースであっても、画像上部に表示されるシード値を用いることで同一のコースを再生成することができます。コンテストではシード値によってコースが指定されることがあります。
carstr現在は5種から選択できます。なおいずれも走行性能に違いはありません。
‘BT46’
‘P34’
‘avro’
‘novgorod’
‘twinturbo’

car は次から選ぶことができます。

ゲームのリセット

コースはそのままに、ゲームをリセットすることができます。オプションはありません。返り値はさまざまな情報が詰まった辞書型の配列です(後述)。

state = env.reset()
アクションの選択

ハンドルとアクセルの2値から成ります。

action = [0, 0] #[Steer, Accel]
Steerfloat[-1.0, +1.0]ハンドルへの力の掛け方です。正の値は左方向にハンドルを回そうとします。ただし慣性力があるため、旋回中に 0 を入力してもすぐには旋回が停止しないことにご注意ください。また車が停止中は旋回できません。急旋回は速度を大きく減少させます。
参考までに、±1.0 を入力し続けると毎秒約180°旋回するようです。
Accelfloat[-1.0, +1.0]アクセルペダルの踏み込み具合です。正の値は前進、負の値はリバースを意味します。ただし慣性力があるため、前進中に -1 を入力してもすぐには後退しないことにご注意ください。また抵抗力もあるため、走行中に 0 を入力し続けてもやがて停止します。
参考までに、最高速度は25 m/s程度のようです。
ステップを進める

アクションを入力してゲームを1フレーム進めます。返り値は4つあり、特に state には機械学習に用いることができる情報が詰まっています。

state, reward, over, done = env.step(action)
statedictionary※下のテーブル参照
rewardfloatこのステップにおける即時報酬を返します。新たに道路パネルを踏んだ瞬間に既定報酬(100/パネル総数)が得られるため、通常 0 または既定報酬が取得されます。
overbool車体が画面外にある場合に True を返します。強化学習においてはペナルティを与えてエピソードを終了することが想定されます。
done boolすべての道路パネルが踏破済みであれば True を返します。ゲームクリアを意味します。強化学習では大きな報酬を与えてエピソードを終了することが想定されます。

state は以下から成ります。

state[‘position’][float, float]車体の座標 [x, y]
state[‘velocity’][float, float]車体の速度ベクトル [x成分, y成分]
state[‘radian’]float車体の方位。画面上方を基準に左方向にどれだけ向いているか(単位:ラジアン)
state[‘radian_v’]float車体の回転速度。正の値は左回転
state[‘road’]ndarrayすべての道路パネルの座標。shape=(パネル総数, 4, 2) であり、4 はパネルの四隅、2 は [x, y] を意味する
state[‘visited’]bool配列各パネルを踏んだかどうか。踏破済みであれば True となる。全 True でコース制覇
state[‘visited_count’]int踏破済みパネルの総数、すなわち np.sum(state[‘visited’])
state[‘time’]floatゲーム内時刻。リセット直後は 0 s。ゲームは30 fps
state[‘frame’]intゲーム内フレーム値。リセット直後は 1 。ゲームは30 fps
state[‘rewards’]floatこれまでの報酬の合計値。100に達するとコース制覇
state[‘actual_length’]intコースの長さ。必ずしも track_len で指定した値にならない
state[‘speed’]float車体の速さ、すなわち state[‘velocity’] のノルム
state[‘road_max’][float, float]画面の縁の大きい側 [x成分, y成分]
state[‘road_min’] [float, float] 画面の縁の小さい側 [x成分, y成分]
画像の確認

※アップデートが期待されます

ゲーム中のコース全体図が確認できます。処理速度が遅いため、数フレームに1度だけ確認することを推奨します。

env.render(mode='plt', dpi=100)
modestr‘plt’
matplotlibによる plt.show() が実行され、コンソールに画像が表示されます。

‘save’
./save フォルダが自動生成されフォルダ内に画像が保存されます。画像名はフレーム番号に応じて「00000001.png」といった連番が与えられます。
dpiint画像の解像度です(dot per inch)。

画像の一例です。

環境の保存や複製

次のように、copy.deepcopy() を用いて手軽に複製が可能です。

from vcracing import vcracing
from copy import deepcopy

#コース指定
env = vcracing(track_len=200, track_seed=5)

#20フレーム前進
for i in range(20):
    action = [0, 1]
    _, _, _, _ = env.step(action)

#確認
print('env')
env.render()

#環境を「環境2」としてコピー
env2 = deepcopy(env)

#環境1は左旋回
for i in range(10):
    action = [1, 1]
    _, _, _, _ = env.step(action)

#環境2は右旋回
for i in range(10):
    action = [-1, 1]
    _, _, _, _ = env2.step(action)

#確認
print('env')
env.render()
print('env2')
env2.render()

(開発者向け)走行記録の取得

クリア後は次のように走行記録を取得できます。

record = env.get_record()

# 全入力
print(record['input_all'])
# 車体の全位置
print(record['position_all'])
# 車体の全方位
print(record['radian_all'])
# ラップタイム
print(record['lap_time'])

ライセンス

Reference source

本パッケージは OpenAI Gym CarRacing-v0 を参照して作成されました。関係者のすべての努力に敬意を表するとともに、厚く感謝申し上げます。

https://gym.openai.com/envs/CarRacing-v0/
Short description

Private Use, Commercial Use are permitted. Don’t forget Copyright notice (e.g. https://vigne-cla.com/vcracing-tutorial/) in any social outputs. Thank you.

For Educational Use, Copyright notice is NOT necessary.

Required: Copyright notice in any social outputs.
Permitted: Private Use, Commercial Use, Educational Use
Forbidden: Sublicense, Modifications, Distribution without pip install, Patent Grant, Use Trademark, Hold Liable.

著作権表示

vcracingを使用してできた著作物(商品、論文、設計、プログラム、ブログ記事等)を不特定多数の人々が閲覧できる場所に公開する際には、vcracingが直接的または間接的に貢献したかにかかわらず、必ず著作権表示をしなければなりません。ただしこれは、

  • vcracingがビネット&クラリティ(=ビネクラ)によって作られたことが明示されていること
  • ビネット&クラリティのURL(https://vigne-cla.com/ または同/vcracing-tutorial/)が明示されていること

の両方が満たされていれば良いこととし、端的には

※vcracingはビネクラ(https://vigne-cla.com/)のソフトです

といった注釈を、十分な視認性を保って記載すれば良いこととします。また、二次的な営利利用にも本ライセンスを適用しなければなりません。例外として、vcracingの名称や機能のみを紹介した場合や、vcracingの名称や機能のみをデータベースの一要素として列挙した場合はこの限りではありません。また教育目的での利用に限り、著作権表示を省略することができます。

できること

個人利用、商用利用、教育での利用、創作物(商品、論文、設計、プログラム、ブログ記事等)の公開

禁止事項

ソースコードの修正・複製、pipを経由しないソースコードの配布、vcracingそのものやvcracingを利用した技術にかかる特許の出願・取得、トレードマークの主張、サブライセンス

免責事項

vcracingを用いたことで生じたいかなる損害の補償もしかねます。

更新予定

render()の改善

更新

1.0.9走行記録(record[‘position_all’])の不具合を修正
1.0.8step() の速度を10~60倍に修正、コース長によらず一定に
get_record() を実装
コース長の調整
画像にラップタイムを表示
1.0.6リリース

SNS等でお気軽にご連絡ください

※当ブログに関することは何でもご相談・ご依頼可能です(Servicesになくても)
※TwitterはFF外の場合はDMではなく返信orメンションでお願いしますm(_ _)m

情報発信しています

質問・コメントはSlackやDiscordでお気軽に

勉強会の告知はこちらで

強化学習 / DQN
この記事を書いた人

博士(理学)。専門は免疫細胞、数理モデル、シミュレーション。米国、中国で研究に携わった。遺伝的アルゴリズム信者。物価上昇のため半額弁当とともに絶滅寸前。

この記事をシェアする
Vignette & Clarity(ビネット&クラリティ)
タイトルとURLをコピーしました