Windows＋Unity＋Pythonで箱庭ロボットを強化学習できるようにするための手順書

本記事は、Windows のパソコン上で、[箱庭ロボットの強化学習](https://qiita.com/kanetugu2018/items/ee9b2bf0596a35e42b03)をできるようにするための手順書です。

ベースとなる考え方／アーキテクチャやインストールの流れは、こちらの記事に記載されています。

https://qiita.com/kanetugu2018/items/ee9b2bf0596a35e42b03

ただ、[TOPPERS/箱庭](https://toppers.github.io/hakoniwa/)は、クロスプラットフォーム対応しておりますので、ご使用の OS によって若干インストール手順が変わります。ですので、Windows の方向けの手順書をこちらで整理することにしました。

# 事前準備

Windows版では、WSL2を利用しますので、事前にインストールをお願いします。
また、インストール完了後、端末上で以下のコマンドを実行して、ネットワークツール(routeやifconfigコマンド)をインストールしてください。

```
sudo apt install net-tools
```

また、事前にUnityおよび [Blender](https://www.blender.org/) のインストールもお願いします！

さらに、Unityプロジェクトを開く際に Windows の Git がインストールされている必要があります。Windows用のGitがインストールされていない方は、こちらの記事を参考にして、インストールおよび環境変数のセットアップをお願いします。

https://www.hanachiru-blog.com/entry/2021/05/24/120000 

なお、環境変数設定後は、パソコンの再起動が必要となります。

# インストール手順

本環境を利用するための最初の一歩は、[hakoniwa-base の AI ブランチ](https://github.com/toppers/hakoniwa-base/tree/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 をインストールしたものを利用しますので、事前にご準備ください。インストール手順は、[こちら](https://docs.docker.com/engine/install/ubuntu/)です。


イメージを作成するディレクトリは、``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コマンドがないというエラーが出た場合は、こちらのインストール手順を参照して、インストールください。

https://github.com/toppers/hakoniwa-single_robot/blob/main/docker/install-docker.bash


あとは、docker イメージを作成するコマンドを実行します。(遅いと１時間くらいかかります…)

```
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 直下にいる場合は、以下のコマンドで１個上のディレクトリに移動してこうなっていれば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 を起動して、「開く」ボタンをクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/11c35e0c-ae00-d654-c863-6edb5d0b1cd4.png)

hakoniwa-ros2sim をクローンしたディレクトリ内の`hakoniwa-ros2sim\ros2\unity\tb3`を選択して、「開く」ボタンをクリックしてください(数分かかります...)。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/e861e00e-0882-4d80-25d8-5b073ef8bc90.png)

* 補足
 * この際、Unityバージョンが異なる旨のメッセージが出る場合があります。異なるバージョンであってもUnityがいい感じで変換してくれますので、問題ありません。 

起動すると以下の画面が現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/bd61b2f7-cb6d-aa07-194e-dfac777a6639.png)

# 強化学習の実行手順

解説長かったですが、強化学習の実行手順をご説明しましょう。

## 強化学習プログラムを編集する

強化学習プログラムは、先ほどクローンした `hakoniwa-base` の以下のファイルを直接編集します。

* workspace/dev/ai/ai_qtable.py
* workspace/dev/ai/hako_robomodel_ev3.py

なお、プログラム編集環境は、[VSCode](https://code.visualstudio.com/download) がお薦めです。

左側のビューでディレクトリ構成を一覧で見れますし、下側にWSL2のターミナルを開くこともできちゃいます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/66cc8779-8839-ee88-ff69-1ca5276ea1d9.png)


## 箱庭環境を起動する

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」というシーンがありますので、これをダブルクリックしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/127d409d-bee2-1470-6376-e27bad427aee.png)

以下のようにコースが表示されていれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/e54b7e60-7e55-7b90-73b2-7e9c063fead0.png)


この状態で、Unityエディタの再生ボタンをクリックしましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/6c093983-0687-d9fa-0dcf-e6759519b42b.png)

成功すると、以下のようにロボットが現れます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/3723ad0a-6540-70c4-4abb-c4bb9dc37bed.png)

この状態で、「開始」ボタンをクリックです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/9413e8d1-6342-58ce-968f-8fd5d82a2e02.png)

成功するとロボットが動き出します。

なお、強化学習中に、終了状態になった場合は、強制リセットがかかり、最初から学習をやり直しますので、学習状況が見えて楽しいですよ。

# トラブルシューティング

## 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 で、以下の２点をご確認ください。

* 詳細設定
* Windows Defenderファイアウォールを介したアプリまたは機能を許可
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/06ee552b-066a-d5e3-0fd3-2bcb6cf1a33a.png)

### 詳細設定
受信の規則を参照して、下図のように Unity Editor が赤になっている場合は、ブロックされています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/2232341e-3e08-d1ec-3f66-59562a251f1b.png)

プロパティを表示して許可してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/977e7921-6b16-86f2-86fc-700a9a043872.png)

### Windows Defenderファイアウォールを介したアプリまたは機能を許可
「許可されたアプリおよび機能(A):」を参照して、Unity Editor が下図のように、チェック入っていない場合は、ブロックされています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/89bc14ca-262e-6842-d39a-a78ac2a9b877.png)

設定変更して、チェックを入れてください。