TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

MineRLをWindowsで動かす

MinecraftのOpenAI Gym環境 MineRLWindowsで動かすための環境構築方法について。
ほぼ個人用メモ。

インストール方法は、公式ドキュメントを元にしている。

OpenJDKインストール

Chocolateyを使用してインストールする。
PowerShellを管理者権限で起動し、

choco install openjdk8

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/"

参考:assanuma Profile - githubmemory

起動テスト

以下のスクリプトを実行する。

import minerl
import gym
env = gym.make('MineRLNavigateDense-v0')

MineCraftが起動する。
f:id:TadaoYamaoka:20210223091003p:plain

obs = env.reset()

を実行すると、ゲームが開始し、小さいウィンドウになる。
f:id:TadaoYamaoka:20210223091056p:plain

f:id:TadaoYamaoka:20210223091231p:plain

env.render()

を実行すると、別ウィンドウで、拡大画面と現在の状態が表示される。
f:id:TadaoYamaoka:20210223091328p:plain

サンプル実行

ランダムに行動するサンプルプログラムを実行する。

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()

で、終了する。