⛏️
マイクラを学習するbotを作る!(2/n)
概要
目標/方針/環境/前回までの進捗
目標
Minecraftのマルチサーバーでプレイヤーに教わりながら操作を学習するbotを作る。
方針
- botの作成、マルチサーバーへのログイン、実際の動作はMineflayerを使用。
- OpenAI APIのChatGPT4を使用してコードを生成、スキルライブラリに追加。
- 随時スキルライブラリからコードを呼び出して実行することでマイクラの操作を行わせる。
- 基本的な仕組みは先行研究であるNVIDIAのVoyagerを参考にする。
環境
- ローカル端末:MacbookPro 1.4GHz クアッドコアIntel Corei5 メモリ8GB
- レンタルサーバー:ConohaVPS メモリ8GB CentOS
前回までの進捗
- Mineflayerを用いたbotの作成・マルチサーバーへのログイン
- OpenAI APIとの連携
- OpenAI APIのChatGPT4を使用してbotを話せる機能の追加
- その他標準搭載スキルの追加
目標と方針
今回の目標と方針
今回の目標
- 先行研究であるVoyagerの実行環境を構築し、プレイヤーに教わりながら操作を学習するように改造する準備を整える
- Azureサーバー上でVoyagerを動かす
今回の方針
- レンタルサーバーをAzureに変更する
- Azure上でMinecraftマルチサーバーを動かす
- VoyagerをAzure上のMinecraftマルチサーバーで動かしてみる
- botに実際のMinecraftアカウントを使用してスキンをカスタマイズする
成果
成果
Voaygerとは
Voyagerとは
方法
方法
レンタルサーバーをAzureに変更する
レンタルサーバーをAzureに変更する
Azureアカウントの登録
Azureアカウントの登録
VMの作成
VMの作成
以下のように記入する
minecraftサーバー用VMの設定
項目 | 記入例 |
---|---|
サブスクリプション | minebot-subsucription |
リソースグループ | minebot-resource-group |
仮想マシン名 | vm-minecraft |
地域 | (Asia Pacific) Japan East |
可用性オプション | インフラストラクチャ冗長は必要ありません |
セキュリティの種類 | Standard |
イメージ | Ubuntu Server 20.04 LTS - Gen2 |
Azure スポットインスタンス | なし |
サイズ | Standard_B2s |
認証の種類 | SSH 公開キー |
ユーザ名 | azureuser |
SSH公開キーのソース | 新しい組の生成 |
キーの組名 | vm-minecraft_key |
パブリック受信ポート | 選択したポートを許可する |
受信ポートを選択 | SSH (22) |
minebotサーバー用VMの設定
項目 | 記入例 |
---|---|
サブスクリプション | minebot-subsucription |
リソースグループ | minebot-resource-group |
仮想マシン名 | vm-minebot |
地域 | (Asia Pacific) Japan East |
可用性オプション | インフラストラクチャ冗長は必要ありません |
セキュリティの種類 | Standard |
イメージ | Ubuntu Server 20.04 LTS - Gen2 |
Azure スポットインスタンス | なし |
サイズ | Standard_B2s |
認証の種類 | SSH 公開キー |
ユーザ名 | azureuser |
SSH公開キーのソース | 新しい組の生成 |
キーの組名 | vm-minebot_key |
パブリック受信ポート | 選択したポートを許可する |
受信ポートを選択 | SSH (22) |
minecraftサーバー用ポートの設定
minecraftサーバー用ポートの設定
VMの左側のリストからネットワーク
を開く
受信ポートの規則を追加する
をクリックし、以下のポート設定を記入する
MinecraftServer用ポートの設定
項目 | 記入例 |
---|---|
ソース | IP Addresses |
ソースIP アドレス/CIDR 範囲 | 自分のIPアドレス |
ソースポート範囲 | * |
宛先 | Any |
サービス | Custom |
宛先ポート範囲 | 25565 |
プロトコル | TCP |
アクション | 許可 |
優先度 | 310 |
名前 | MinecraftServer |
説明 | なし |
MinecraftRcon用ポートの設定
項目 | 記入例 |
---|---|
ソース | IP Addresses |
ソースIP アドレス/CIDR 範囲 | 自分のIPアドレス |
ソースポート範囲 | * |
宛先 | Any |
サービス | Custom |
宛先ポート範囲 | 25575 |
プロトコル | TCP |
アクション | 許可 |
優先度 | 310 |
名前 | MinecraftRcon |
説明 | なし |
SSH接続
SSH接続
Azure上でMinecraftマルチサーバーを動かす
Azure上でMinecraftマルチサーバーを動かす
server.jarのダウンロード
server.jarのダウンロード
Javaのインストール
Javaのインストール
- パッケージリストのアップグレード
最初に、すべてのパッケージリストを最新のものに更新してから、アップグレードする。
$ sudo apt update
$ sudo apt upgrade -y
- OpenJDKのインストール
今回のminecraft 1.19のサーバーを起動させるためにはバージョン17以上openjdkが必要です。
$ sudo apt install openjdk-17-jdk -y
- Javaのバージョン確認
インストールが成功したことを確認するために、以下のコマンドを実行してJavaのバージョンをチェックする。
$ java -version
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7-Ubuntu-120.04.2)
OpenJDK 64-Bit Server VM (build 17.0.8+7-Ubuntu-120.04.2, mixed mode, sharing)
screenの起動
screenの起動
- screenのインストール
バックグラウンドでMinecraftサーバーを実行するために、screen を起動する。
まだscreenをインストールしていない場合は、以下のコマンドでインストールする。
$ sudo apt update
$ sudo apt install screen
- screenの起動
screen セッションを作成し、それに適当な名前(今回はminecraft)を付ける。
$ screen -S minecraft
これにより、新しいscreenセッションが開始され、そのセッション内でコマンドを実行することができる。
マルチサーバー起動
マルチサーバー起動
- eula.txtの生成
以下のコマンドでminecraft_server_1.19.jarを実行する。
$ java -Xmx1024M -Xms1024M -jar minecraft_server_1.19.jar nogui
実行したらlsコマンドなどで必要なファイルが生成されたか確認する。
$ ls
eula.txt libraries logs minecraft_server_1.19.jar server.properties versions
- eula.txtの変更
eula.txtの以下の部分をfalseからtrueに変更する。
#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Sun Aug 27 11:08:21 UTC 2023
- eula=false
+ eula=true
- マルチサーバーの起動
もう一度以下のコマンドでマルチサーバーを立ち上げる。
$ java -Xmx1024M -Xms1024M -jar minecraft_server_1.19.jar nogui
worldフォルダなどが生成されれば成功。
マルチサーバーへ接続
マルチサーバーへ接続
- Minecraftの起動
Minecraft Launcherから起動構成をバージョン1.19に設定しマインクラフトを起動する。 - マルチサーバーへのログイン
マルチプレイのサーバーを追加からサーバーアドレスに作成したVMのパブリックIPアドレスを入力する。サーバー名は自由に設定してください。
設定後に「サーバーに接続できません」などのエラーが出ていなければ成功。
VoyagerをAzure上のMinecraftマルチサーバーで動かしてみる
VoyagerをAzure上のMinecraftマルチサーバーで動かしてみる
Voyagerインストール
Voyagerインストール
以下のコマンドでVoyagerをインストールし、フォルダに移動する。
$ git clone https://github.com/MineDojo/Voyager
$ cd Voyager
python3&pipのインストール
python3&pipのインストール
以下のコマンドでpython3.9をインストールする。
Voyagerではバージョン3.9以上のPythonが必要。
$ sudo apt update
$ sudo apt install python3.9 python3.9-venv python3.9-dev
Python3.9のpipをインストールする。
$ sudo apt install python3.9-distutils
$ curl https://bootstrap.pypa.io/get-pip.py | sudo python3.9
Pythonパッケージのインストール
Pythonパッケージのインストール
以下のコマンドでPythonパッケージをインストールする。
$ python3.9 -m pip install -e .
npmのインストール
npmのインストール
以下のコマンドでnode.jsとnpmをインストールする。
$ sudo apt update
$ curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt install -y nodejs
npmおよびnpxのバージョンを確認して、正常にインストールされたかを確認する。
$ npm -v
$ npx -v
nodeモジュールのインストール
nodeモジュールのインストール
以下のコマンドで各ディレクトリに必要なnodeモジュールをインストールする。
$ cd voyager/env/mineflayer
$ sudo npm install -g npx
$ npm install
$ npx tsc
$ cd ..
$ npm install
サーバー起動時&停止時に自動的に処理が走るようにする
起動時に自動的に処理が開始されるようにする
minecraftサーバー用VMの設定
minecraftサーバー用VMの設定
サーバー起動時にminecraftが起動し、サーバー停止時にminecraftがデータ保存&終了されるようにする。
systemdサービスファイルを作成する。
$ sudo nano /etc/systemd/system/minecraft-server.service
以下のように記入する。
/path/to/your/minecraft/directory
はminecraft_server_1.19.jarを設置したディレクトリのパスで置き換える。
minecraft-server.service
[Unit]
Description=Minecraft Server
After=network.target
[Service]
User=azureuser
Nice=1
KillMode=none
SuccessExitStatus=0 1
ProtectHome=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true
WorkingDirectory=/path/to/your/minecraft/directory
ExecStart=/usr/bin/screen -DmS minecraft /usr/bin/java -Xmx1024M -Xms1024M -jar /path/to/your/minecraft/directory/minecraft_server_1.19.jar nog>
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "say SERVER SHUTTING DOWN. Saving map..."\015'
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "save-all"\015'
ExecStopSleep=5s
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "stop"\015'
[Install]
WantedBy=multi-user.target
サービスのリロードと有効化を行う。
$ sudo systemctl daemon-reload
$ sudo systemctl enable minecraft-server.service
今後の方針
今後の方針
- チャットでプレイヤーの指示を受け取って、取り組むタスクを決めるようにする
- チャットでプレイヤーの指示を受け取って、タスクの実行結果の評価を行うようにする
- サーバーをdiscordから起動・停止・状態取得できるようにする
実際のコード(githubリンク)
今回は私のではなくNVIDIAによるVoyagerのgithubリンクを置いておきます。
Discussion