本記事は、Windows のパソコン上で、箱庭ロボットの強化学習をできるようにするための手順書です。
ベースとなる考え方/アーキテクチャやインストールの流れは、こちらの記事に記載されています。
ただ、TOPPERS/箱庭は、クロスプラットフォーム対応しておりますので、ご使用の OS によって若干インストール手順が変わります。ですので、Windows の方向けの手順書をこちらで整理することにしました。
事前準備
Windows版では、WSL2を利用しますので、事前にインストールをお願いします。
また、インストール完了後、端末上で以下のコマンドを実行して、ネットワークツール(routeやifconfigコマンド)をインストールしてください。
sudo apt install net-tools
また、事前にUnityおよび Blender のインストールもお願いします!
さらに、Unityプロジェクトを開く際に Windows の Git がインストールされている必要があります。Windows用のGitがインストールされていない方は、こちらの記事を参考にして、インストールおよび環境変数のセットアップをお願いします。
なお、環境変数設定後は、パソコンの再起動が必要となります。
インストール手順
本環境を利用するための最初の一歩は、hakoniwa-base の AI ブランチをクローンすることです。
git clone -b ai --recursive https://github.com/toppers/hakoniwa-base.git
※注意:クローンする場所は、WSL2内のディレクトリではなく、/mnt/c
の配下に任意のディレクトリを作成して、クローンしてください
Python 実行環境のインストール
Windows版の場合、強化学習用の Python プログラムは、docker コンテナ上で実行しますので、以下の手順でイメージを作成します。
- 補足
- Windows版では、
Docker Desktop for Windows
は利用しません。WSL2上のUbuntu環境に Docker Engine をインストールしたものを利用しますので、事前にご準備ください。インストール手順は、こちらです。
- Windows版では、
イメージを作成するディレクトリは、hakoniwa-base
直下です。
cd hakoniwa-base
Dockerfileを以下のコマンドで作成します。
bash docker/template/make_dockerfile.bash runtime ai
成功すると、docker/docker_runtime/
直下にDockerfile等、必要なファイルが作成されます。
$ ls docker/docker_runtime/
Dockerfile env.bash image_name.txt
WSL2の場合は、事前に以下のコマンドを実施ください。
sudo service docker start
ちなみに、dockerコマンドがないというエラーが出た場合は、こちらのインストール手順を参照して、インストールください。
あとは、docker イメージを作成するコマンドを実行します。(遅いと1時間くらいかかります…)
bash docker/pull-image.bash runtime
上記コマンドを実行すると、以下のようなエラーが発生する場合があります。
permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/create?fromImage=toppersjp%2Fhakoniwa-ai-runtime&tag=v1.1.0": dial unix /var/run/docker.sock: connect: permission denied
この場合は、/var/run/docker.sock
にアクセス権限を与えてください。
例:
sudo chown tmori /var/run/docker.sock
成功するとこうなります。
v1.1.0: Pulling from toppersjp/hakoniwa-ai-runtime
846c0b181fff: Already exists
926155154545: Already exists
f05a15472990: Already exists
53f4d548dafb: Already exists
7146a00cd0f1: Already exists
8ada1c4d4d00: Already exists
466896f80f3c: Already exists
c3cc726e92d7: Already exists
233ebe6d53ab: Already exists
1b48cf0b8567: Already exists
f72eb56f56a5: Already exists
a8d3ad5ddf87: Already exists
d78b6291d9de: Pull complete
ce0b145408f9: Pull complete
28837015782f: Pull complete
1faeca461321: Pull complete
76eae063f731: Pull complete
bf1e75ac7168: Pull complete
6c796242ce3e: Pull complete
2ca15a4b2714: Pull complete
d4615d565d7f: Pull complete
779d46d60227: Pull complete
286cf632a6c5: Pull complete
3b70f2e8eb3c: Pull complete
b6dcfcf91fe7: Pull complete
9564277f649d: Pull complete
0ee98b65e6d1: Pull complete
Digest: sha256:b942d475b046b28b26e2e52a0b67dc041247dec63ec484ae92d1e0345e41cb1e
Status: Downloaded newer image for toppersjp/hakoniwa-ai-runtime:v1.1.0
Unity環境のセットアップ
次に、以下のリポジトリを hakoniwa-base
と同じディレクトリ階層でクローンします。
現在、hakoniwa-base 直下にいる場合は、以下のコマンドで1個上のディレクトリに移動してこうなっていればOKです。
$ cd ..
$ ls
hakoniwa-base
この状態で、以下のようにクローンします。
git clone -b unity-asset --recursive https://github.com/toppers/hakoniwa-ros2sim.git
クローン後、こうなっていればOKです。
$ ls
hakoniwa-base hakoniwa-ros2sim
hakoniwa-ros2sim
ディレクトリ直下で docker コンテナを起動します。
cd hakoniwa-ros2sim
bash docker/run.bash
成功すると、以下のようにログ出力され、 docker コンテナに入った状態になります。
Unable to find image 'toppersjp/hakoniwa-ros2sim:v1.1.4' locally
v1.1.4: Pulling from toppersjp/hakoniwa-ros2sim
675920708c8b: Pull complete
7cf19bc0e0d1: Pull complete
ff483ca449e2: Pull complete
077f60b8d79e: Pull complete
c152c32a5dfa: Pull complete
f6e812731a44: Pull complete
430ce07703bc: Pull complete
1890f880d76a: Pull complete
6d1250a90908: Pull complete
67e10b955d67: Pull complete
7586ba8a5351: Pull complete
eb755f666a22: Pull complete
300c9890b2ce: Pull complete
6255f065a4c1: Pull complete
2f7b7f67ac87: Pull complete
91b397254f1b: Pull complete
9523e9a1b772: Pull complete
468c589c4d42: Pull complete
5bc814b1466b: Pull complete
dbbc7427638a: Pull complete
23569c6c3f51: Pull complete
522d18578c32: Pull complete
Digest: sha256:5c34e2185b39363a5e53df7e852dec88677ce57477120be52f62b840833df5a8
Status: Downloaded newer image for toppersjp/hakoniwa-ros2sim:v1.1.4
root@LAPTOP-FHREG47I:~/workspace/hakoniwa-ros2sim/ros2/workspace#
次に、以下の手順で必要なUnityモデルなどをインストールします。
bash hako-install.bash opt all
なお、上記コマンドでは、Unityと箱庭間の通信用のIPアドレス(WSL2向けの仮想IPアドレス)を自動設定します。Windows/WSL2の場合、パソコンを再起動しますと、IPアドレスが変わってしまいますので、再起動された場合は、上記コマンドを再実行していただく必要があります。
Unity環境の起動
いよいよ、Unityを起動していきます。
まずは、Unity Hub を起動して、「開く」ボタンをクリックしてください。
hakoniwa-ros2sim をクローンしたディレクトリ内のhakoniwa-ros2sim\ros2\unity\tb3
を選択して、「開く」ボタンをクリックしてください(数分かかります...)。
- 補足
- この際、Unityバージョンが異なる旨のメッセージが出る場合があります。異なるバージョンであってもUnityがいい感じで変換してくれますので、問題ありません。
起動すると以下の画面が現れます。
強化学習の実行手順
解説長かったですが、強化学習の実行手順をご説明しましょう。
強化学習プログラムを編集する
強化学習プログラムは、先ほどクローンした hakoniwa-base
の以下のファイルを直接編集します。
- workspace/dev/ai/ai_qtable.py
- workspace/dev/ai/hako_robomodel_ev3.py
なお、プログラム編集環境は、VSCode がお薦めです。
左側のビューでディレクトリ構成を一覧で見れますし、下側にWSL2のターミナルを開くこともできちゃいます!
箱庭環境を起動する
WSL2 のターミナル上で、hakoniwa-base
直下に移動し、以下のコマンドで箱庭環境を起動します。
bash docker/run.bash runtime
起動成功すると、以下のログが出力されます。
INFO: ACTIVATING HAKO-MASTER
INFO: ACTIVATING :dev/ai/ai_qtable.py
create_channel: id=0 size=196
Unityのシミュレーションを開始する
Unityエディタの画面左下にある「プロジェクトビュー」の「Assets/Scenes/Transport」を選択すると、画面下に「Simulation」というシーンがありますので、これをダブルクリックしましょう。
以下のようにコースが表示されていれば成功です。
この状態で、Unityエディタの再生ボタンをクリックしましょう。
成功すると、以下のようにロボットが現れます。
この状態で、「開始」ボタンをクリックです!
成功するとロボットが動き出します。
なお、強化学習中に、終了状態になった場合は、強制リセットがかかり、最初から学習をやり直しますので、学習状況が見えて楽しいですよ。
トラブルシューティング
docker 起動時にエラー発生する
docker 起動時に以下のようなエラーが出る場合があります。
$ bash docker/run.bash
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
* Starting Docker: docker waiting for docker service activation..
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create?name=hakoniwa-ros2sim": dial unix /var/run/docker.sock: connect: permission denied.
原因は、/var/run/docker.sock
にアクセス権がないためですので、以下のコマンドでアクセス権を与えることで直ります。
例:ユーザ名が tmori
の場合
sudo chown tmori /var/run/docker.sock
シミュレーション開始したけど、ロボットが動かない
考えられる原因として、Unityの通信がWindowsのセキュリティでブロックされている可能性があります。
Windows Defender で、以下の2点をご確認ください。
詳細設定
受信の規則を参照して、下図のように Unity Editor が赤になっている場合は、ブロックされています。
プロパティを表示して許可してください。
Windows Defenderファイアウォールを介したアプリまたは機能を許可
「許可されたアプリおよび機能(A):」を参照して、Unity Editor が下図のように、チェック入っていない場合は、ブロックされています。
設定変更して、チェックを入れてください。