docker環境でUnity上のTurtleBot3をROS2で動かすまで

# 概要
「[ROS2でUnity上のTurtleBot3を動かそう！](https://qiita.com/kanetugu2018/items/26170fab17c74635ea91)」では，WSL2/Ubuntu20.0.4環境上にROS2をインストールする手順を紹介しました．

ここでは，dockerコンテナ使った手順を説明します．
ROS2をインストールするのが面倒な方は便利かもです．

* 2022.01.01
    * Mac環境での導入手順を追加
* 2022.01.02
    * Linux環境での導入手順を追加
* 2022.01.23
    * 箱庭ロボット組み立てキットの導入手順を追加
* 2022.03.20
    * インストール手順を簡略化した

# 前提とする環境
# Unity
* Unity Hub
  * Unity Hub 3.1.1
* Unity
  * Unity 2021.2.1f1

## Windows環境
* Windows10 Home, Windows 11
* WSL2/WSLg/Ubuntu20.0.4
* WSL2/[Docker Engine](https://github.com/toppers/hakoniwa-single_robot#docker-engine%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

## Mac環境
* MacBook Air
    * macOS Catalina ver.10.15.7
    * メモリ：4GB
* Docker for Mac

## Linux環境
* Ubuntu20.0.4
    * メモリ：4GB
* docker

# インストール手順
## Windows環境
### ルートプロジェクト構成
WSL2/Ubuntu20.0.4 を起動し，以下のプロジェクトを作成します(Cドライブ直下にプロジェクトを作成)．

```
$ mkdir /mnt/c/project
$ cd /mnt/c/project
```

## Mac/Linux環境
### ルートプロジェクト構成
Terminal を起動し，以下のプロジェクトを作成します(ホーム直下にプロジェクトを作成)．

```
$ cd ${HOME}
$ mkdir project
$ cd project
```


## ROS対応版箱庭リポジトリのクローン
ルートプロジェクトへ移動した状態で，以下のコマンドを実行してください．

```
git clone --recursive https://github.com/toppers/hakoniwa-ros-samples.git
```

箱庭ロボット組み立てキットを利用される場合は，さらに以下のコマンドを実行してください．

```
$ cd hakoniwa-ros-samples
$ git checkout robo-parts
```

## dockerイメージの作成
### Windows環境

```
$ sudo service docker start
$ cd /mnt/c/project/hakoniwa-ros-samples/ros2/docker
$ bash create-image.bash
```

### Mac環境

```
$ cd hakoniwa-ros-samples/ros2/docker
$ bash create-image.bash
```

### Linux環境

```
$ cd hakoniwa-ros-samples/ros2/docker
$ bash create-image-linux.bash
```

## dockerを起動する
まずは，端末を２個(端末A，端末B)起動して，以下のディレクトリへ移動してください．

```
$ cd project/hakoniwa-ros-samples/ros2/docker
```

### 端末A
端末Aでdockerコンテナを起動します．端末Bは後で使います．

#### Windows環境の場合

```
$ bash run.bash
```

#### Mac環境の場合

Mac環境の場合は，イーサーネット名を引数に指定してください．
イーサーネット名は，ifconfigコマンドで確認できます。

```
$ bash run-mac.bash <ether>
```

#### Linux環境の場合

```
$ bash run-linux.bash
```

## 起動した dockerコンテナ上で箱庭のROS環境をインストール

```
# bash hako-install.bash
```

# Unity プロジェクトを開く

Unity Hubを起動し，右上の「開く」をクリックして、先ほどクローンしたROS対応版箱庭ソース上の以下のディレクトリを指定します．

* 場所：hakoniwa-ros-samples/ros2/unity/tb3

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/9536ba7c-8927-8070-a947-3ad899d6671b.png)



うまく起動すると、こういう画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/309efb99-d6ca-897a-5b34-348b337c5392.png)


この状態で、画面左下にある「プロジェクトビュー」の「Assets/Scenes」を選択すると、画面下に「Toppers_Course」というシーンがありますので、これをダブルクリックしましょう。

![スクリーンショット 2022-03-20 21.41.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/00703a5d-7014-ec12-9c4a-1aab06b028da.png)

そうすると、以下のようにコースが表示されます。

![スクリーンショット 2022-03-20 21.43.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/dfce9516-f067-03de-6a1b-427dbe2c9b23.png)

これでインストール終了です！


# シミュレーション実行する

## 準備
端末Aと端末Bでdockerコンテナに入りましょう．
端末B側は，以下のコマンドで入ります．

```
$ bash attach.bash
```

## 端末A
端末AでROS-TCP-ENDPOINTを起動しましょう．

```
# bash launch.bash
```

## Unityのシミュレーション開始する

Unityのシミュレーション開始ボタンをクリックすると，いつもの起動画面が出てきます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/d9be050a-96b5-5022-e20d-9dac2c1fa402.png)



## 端末B
端末BでROS2プログラムを起動しましょう．

```
# bash run.bash tb3 TB3RoboModel
```

この状態で，Unity側の「開始」ボタンをクリックすると箱庭のシミュレーション開始し，TurtleBot3が動き出します．

今までの操作を実演すると，こんな感じです．

![demo9999.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/21d3387b-3fce-0402-b746-6f53357cd29a.gif)



ちなみに，Unityシミュレーション実行時に，「Gizmos」をクリックすると，レーザスキャナの光線が見えます．

![demo17.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/5d0cfe0f-b35d-52a2-0a85-6373362a3070.gif)

# トラブルシューティング
## Mac上でUnityのシミュレーション開始ボタンを押すとgrpc_csharp_ext.bundleがないとエラーになる
原因：MacのファイアウォールがUnity内のgrpcの実行を監視しているため
対処：ファイアウォールの設定で許可する
参考：https://github.com/Cysharp/MagicOnion/issues/212

# お知らせ：箱庭もくもく会

TOPPERS箱庭WGでは，もくもく会を不定期に開催しています．
本記事の内容を実際に試してみたい方や試してみたけど詰まっている方は，ぜひご参加ください．画面共有しながら参加者同士でサポートしたり，一緒に新しい機能を実装したりと”もくもく”しましょう．

https://hakoniwa.connpass.com/


# 参考情報

以下のセットアップ手順は、2022.03.20時点では不要となりましたが、個別にカスタマイズしたくなった場合に備えて、情報は残しておくというくらいの意図のものです。


## Unityプロジェクトの作成
Unityを起動し，クローンしたROS対応版箱庭ソース上の以下に新規プロジェクトを作成します．

* 作成場所：hakoniwa-ros-samples/ros2/unity
* プロジェクト名：tb3_ros2

※補足：プロジェクト名は任意のもので大丈夫です．
※箱庭ロボット組み立てキットの場合は，「robo-parts」として説明します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/a9b83761-1082-f0bf-9338-c47ab4a7029e.png)

「作成」ボタンをクリックすると，以下の状態になります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/484866a3-91ed-3883-b334-87c500336f5a.png)

## Unity ROS パッケージのインストール
まずは，以下のUnityのパッケージマネージャを起動しましょう．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/c4ba33b8-7a4b-c521-2559-e254b9ae1673.png)

起動するとこんな画面が出てきます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/f09316e0-77e5-36cd-1641-857b43d6b95b.png)

画面左上の「＋」ボタンをクリックして，git URLからパッケージを追加します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/590bc737-5bae-0fb8-672b-88bd19599340.png)

追加対象は以下の２個です．それぞれ，URLを入力してインストールしてください．

### ROS-TCP-CONNECTOR
URL：`https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector#v0.6.0`

以下のように入力して，「Add」ボタンをクリックするとインストール始まります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/7f1af2e4-0ad7-dd5b-4297-850d76a2ef99.png)

成功するとこうなります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/f513d24c-7a0b-7b1a-6448-d3384f390a02.png)


### URDFインポータ
URL：`https://github.com/Unity-Technologies/URDF-Importer.git?path=/com.unity.robotics.urdf-importer#v0.5.0`

以下のように入力して，「Add」ボタンをクリックするとインストール始まります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/f3f284d0-aa4f-3dc6-2474-4248a64e51aa.png)

成功するとこうなります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/e8bd07ee-5966-9435-ba5c-a92595f61354.png)

## UnityのROSバージョンをROS2に設定
Unityのメニュー「Robotics」の「ROS Settings」を選択してください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/a27e5767-f79c-8982-3a7e-d3a70e49765e.png)

デフォルトでは，「ROS1」になっていますので，下図のように`ROS2`にしましょう．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/a6f17955-e431-bb8e-85ac-f6194817e2b4.png)


## 箱庭のUnityパッケージのダウンロード
### TurtleBot3の場合
以下から，最新の箱庭Unityパッケージ(`single-robot-TB3-hakoniwa-core-ros2.unitypackage`)をダウンロードしてください．

https://github.com/toppers/hakoniwa-ros-samples/releases/tag/v1.2.0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/63b03622-8027-5c43-e9d0-635c35440543.png)

### 箱庭ロボット組み立てキットの場合
以下から，最新の箱庭Unityパッケージ(`hakoniwa-mini.unitypackage`)をダウンロードしてください．

https://github.com/toppers/hakoniwa-ros-samples/releases/tag/v1.3.0

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/5591ef7c-4377-3491-3f49-16c8533bf39d.png)



## Unityに箱庭Unityパッケージのインポート
ダウンロードしたUnityパッケージを以下のメニューからインポートしてください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/53f5971b-cc52-feeb-9df5-f102bbad49cf.png)

以下のポップアップが出てきますので，「Import」をクリックしてください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/cc33e4f0-f860-4f5c-d46f-fed5257ebf5c.png)

インポート成功すると，箱庭のシーンがあります．下図のように「Toppers_Course」をダブルクリックしてください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/fd9f35f2-7a4c-f869-728e-d552c9771f13.png)

成功すると，こうなります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/1367b83b-3fd3-2369-04ee-64398b4cd75d.png)

これで，Unity側のインストールは完了です．ここからdocker環境に戻ります．