MinecraftのOpenAI Gym環境 MineRLをWindowsで動かすための環境構築方法について。
ほぼ個人用メモ。
インストール方法は、公式ドキュメントを元にしている。
Python環境構築
Anaconda3の仮想環境に構築する。
Pythonのバージョンは、3.8だとコンフリクトが起きるため、3.7を使用する。
依存パッケージは、condaでインストールしておく。
conda create -n minerl python=3.7 matplotlib=3.0.3 pillow=7.2.0 jupyter coloredlogs numpy scipy scikit-learn pandas tqdm joblib requests lxml psutil dill future cloudpickle typing conda activate minerl conda install pytorch torchvision torchaudio cudatoolkit=11.0 -c pytorch
matplotlibはバージョン指定(3.0.3)になっているので注意。
minerl/requirements.txt at 5a9c06a7e727ae20cf123e5161b5cfa6ba69793b · minerllabs/minerl · GitHub
異なるバージョンだと、ソースからビルドされて、Windows環境だとビルドエラーになる。
MineRLインストール
pip install minerl==0.3.6
バージョンは現時点の最新。
起動テストとgradle修正
iPythonやJupyter QtConsoleなどから、以下のスクリプトを実行する。
import minerl import gym env = gym.make('MineRLNavigateDense-v0')
数分待つと、以下のようなビルドエラーが発生する。
* What went wrong: Could not resolve all dependencies for configuration ':compileClasspath'. > Could not resolve org.spongepowered:mixin:0.7.5-SNAPSHOT. Required by: com.microsoft.MalmoMod:Minecraft:0.37.0 > Could not resolve org.spongepowered:mixin:0.7.5-SNAPSHOT. > Unable to load Maven meta-data from http://repo.spongepowered.org/maven/org/spongepowered/mixin/0.7.5-SNAPSHOT/maven-metadata.xml. > Could not GET 'http://repo.spongepowered.org/maven/org/spongepowered/mixin/0.7.5-SNAPSHOT/maven-metadata.xml'. Received status code 520 from server: Origin Error
gradleの定義が古く、URLが間違っているため、以下のファイルをテキストエディタで開き、手動で編集する。
C:\Users\<username>\anaconda3\envs\minerl\Lib\site-packages\minerl\env\Malmo\Minecraft\build.gradle
(変更前)
url = "http://repo.spongepowered.org/maven/"(変更後)
url = "https://repo.spongepowered.org/maven/"
起動テスト
以下のスクリプトを実行する。
import minerl import gym env = gym.make('MineRLNavigateDense-v0')
MineCraftが起動する。
obs = env.reset()
を実行すると、ゲームが開始し、小さいウィンドウになる。
↓
env.render()
を実行すると、別ウィンドウで、拡大画面と現在の状態が表示される。
サンプル実行
ランダムに行動するサンプルプログラムを実行する。
import minerl import gym env = gym.make('MineRLNavigateDense-v0') obs = env.reset() done = False while not done: action = env.action_space.sample() obs, reward, done, info = env.step(action)
ランダムにアクションをサンプリングし、アクションがなくなるまで実行される。
カメラ操作もランダムなので、スムーズな表示ではない。
カメラをゆっくり操作して、大きい画面でウェイトを入れて表示してみる。
import minerl import gym from time import sleep env = gym.make('MineRLNavigateDense-v0') obs = env.reset() done = False while not done: action = env.action_space.sample() action['camera'] = [0, min(5, max(-5, action['camera'][1]))] obs, reward, done, info = env.step(action) env.render() sleep(0.01)
終了方法
env.close()
で、終了する。