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

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

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

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

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

# 事前準備

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


# インストール手順

本環境を利用するための最初の一歩は、[hakoniwa-base の AI ブランチ](https://github.com/toppers/hakoniwa-base/tree/ai)をクローンすることです。

```
git clone -b ai --recursive https://github.com/toppers/hakoniwa-base.git
```

## Python 実行環境のインストール

強化学習用の Python プログラムは、ホスト上で直接実行しますので、以下の手順で必要なツール類をインストールします。

インストールを実行するディレクトリは、``hakoniwa-base``直下です。
```
cd hakoniwa-base
```

Intel系Mac版の場合は、以下のコマンドでインストール実行します。


```
bash native/template/runtime/ai/mac/install.bash intel
```

Arm系Mac版の場合は、以下のコマンドでインストール実行します。

```
bash native/template/runtime/ai/mac/install.bash arm
```

インストール途中でパスワード聞かれますが、`/usr/local/lib/hakoniwa`と`/usr/local/bin/hakoniwa`に各種ツール類を配置するためです。


## 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 <port>
```

port には，ネットワークポート名（例："en0"）を引数に指定する必要がありまます。 ポート名は ifconfig コマンド等で確認できます．

次に、以下の手順で必要なUnityモデルなどをインストールします。

```
bash hako-install.bash cpp
```

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

次に、画面左下にある「プロジェクトビュー」の「Assets/Scenes/Transport」を選択し、画面下にある「Shm_Configurator」というシーンをダブルクリックします。

この状態で、以下のように「Generate」を実行してください。

![スクリーンショット 2023-02-05 19.34.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/2eab054a-46a0-39da-5a4a-b182279b7337.png)

その後、もう一度、以下のコマンドを実行してください。

```
bash hako-install.bash cpp
```

# 強化学習の実行手順

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

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

強化学習プログラムは、先ほどクローンした `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)


## 箱庭環境を起動する

以下のコマンドで箱庭環境を起動します。

```
bash native/template/runtime/ai/mac/run.bash
```

起動成功すると、以下のログが出力されます。

```
INFO: ACTIVATING HAKONIWA-CONDUCTOR
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)

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

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

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

現時点（2023/04/22）では、特にありません。