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_len | int | 自動生成されるコースの大まかな長さです(単位:m)。200~3000程度が推奨されます。長いコースほど複雑に入り組む傾向があります。 |
track_seed | int | コース自動生成時の乱数シードを固定することができます。ランダム生成されたコースであっても、画像上部に表示されるシード値を用いることで同一のコースを再生成することができます。コンテストではシード値によってコースが指定されることがあります。 |
car | str | 現在は5種から選択できます。なおいずれも走行性能に違いはありません。 ‘BT46’ ‘P34’ ‘avro’ ‘novgorod’ ‘twinturbo’ |
car は次から選ぶことができます。
扇風機で加速!?「ブラバムBT46」 幻の六輪車「ティレルP34」 給油大好き!「アブロ・バルカン」 砲撃の反動でクルクル回る「ノヴゴロド」 ターボ搭載の名馬「ツインターボ」
ゲームのリセット
コースはそのままに、ゲームをリセットすることができます。オプションはありません。返り値はさまざまな情報が詰まった辞書型の配列です(後述)。
state = env.reset()
アクションの選択
ハンドルとアクセルの2値から成ります。
action = [0, 0] #[Steer, Accel]
Steer | float | [-1.0, +1.0] | ハンドルへの力の掛け方です。正の値は左方向にハンドルを回そうとします。ただし慣性力があるため、旋回中に 0 を入力してもすぐには旋回が停止しないことにご注意ください。また車が停止中は旋回できません。急旋回は速度を大きく減少させます。 参考までに、±1.0 を入力し続けると毎秒約180°旋回するようです。 |
Accel | float | [-1.0, +1.0] | アクセルペダルの踏み込み具合です。正の値は前進、負の値はリバースを意味します。ただし慣性力があるため、前進中に -1 を入力してもすぐには後退しないことにご注意ください。また抵抗力もあるため、走行中に 0 を入力し続けてもやがて停止します。 参考までに、最高速度は25 m/s程度のようです。 |
ステップを進める
アクションを入力してゲームを1フレーム進めます。返り値は4つあり、特に state には機械学習に用いることができる情報が詰まっています。
state, reward, over, done = env.step(action)
state | dictionary | ※下のテーブル参照 |
reward | float | このステップにおける即時報酬を返します。新たに道路パネルを踏んだ瞬間に既定報酬(100/パネル総数)が得られるため、通常 0 または既定報酬が取得されます。 |
over | bool | 車体が画面外にある場合に 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)
mode | str | ‘plt’ matplotlibによる plt.show() が実行され、コンソールに画像が表示されます。 ‘save’ ./save フォルダが自動生成されフォルダ内に画像が保存されます。画像名はフレーム番号に応じて「00000001.png」といった連番が与えられます。 |
dpi | int | 画像の解像度です(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()
コピー時 環境1 環境2
(開発者向け)走行記録の取得
クリア後は次のように走行記録を取得できます。
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 を参照して作成されました。関係者のすべての努力に敬意を表するとともに、厚く感謝申し上げます。
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.8 | step() の速度を10~60倍に修正、コース長によらず一定に get_record() を実装 コース長の調整 画像にラップタイムを表示 |
1.0.6 | リリース |