ロボット・マルチプレイ開発を実現する仮想化技術 Unity + Photon + ROS2 + Oculus Quest2 + 箱庭！(1/3)

# ロボット・マルチプレイ開発を体験する

この記事(3連載を予定)では，『[箱庭コンセプト](https://toppers.github.io/hakoniwa/docs/concept/)』の中で，以下あたりを実現する仮想化技術を箱庭機能として組み込んでみましたので，その内容を紹介していきます．

* Visualization(可視化)
  * システムの動きを「自分が見たい視点」で「見たいように」見えるようになること
* Experience(体験)
  * 箱庭ユーザが箱庭空間に入って，「同じ体験」ができるようになること

これらを実現する仮想化技術として最近自分の中でホットなものが以下です．

* [Photon](https://www.photonengine.com/ja/)
  * クラウド空間上で，オンライン・マルチプレイゲームを実現してくれるものです．
    * 例えば，複数のロボットで構成されるシステムがあったとして，
    * その開発を別拠点で開発しているとします．おそらくですが，この開発のどこかで，
    * ロボット間の協調動作確認をやってみたくなる時が来るはずです．
    * これを現場に行かずにできたら素敵じゃないですかね．
* [Oculus Quest2](https://www.oculus.com/quest-2/?locale=ja_JP)
  * 3D空間にダイブして，臨場感のあるVR体験を実現してくれるものです．
    * 例えば，ロボット開発において，分業・部品開発をやっていくと，
    * 全体象が見えなくなると思います．全体としてこういうロボット作っていて，
    * この部品が動くとロボットはこう動きます．的なのをパワポとかで説明して
    * 伝わるでしょうか．たぶんですが，現場で本物を見た方が早いですよね．
    * こういうのをVR空間上で手軽にやれたら素敵じゃないですかね．

# 連載記事の構成

* 1 回目：TOPPERS/箱庭に複数のロボット(TB3)を自由に配置して動かす(本記事)
* 2 回目：[Photon対応版箱庭を複数のパソコンで起動して，ロボット・マルチプレイする！](https://qiita.com/kanetugu2018/items/19d8fb22ef983cc5dc49)
* 3 回目：[Photon&Oculus対応版箱庭使って，複数人で箱庭VR空間にダイブする！](https://qiita.com/kanetugu2018/items/c7c43dd1dcc63292a39e)

# 環境構成
全体的な環境構成は以下の通りです．今回の記事では，「基本的な環境(Unity/箱庭)」があればOKです．

* 基本的な環境(Unity/箱庭)
  * 『[箱庭 ROS シミュレータの README](https://github.com/toppers/hakoniwa-ros2sim/blob/main/README.md)』を参照ください．
* Oculus
  * 『[Unity + Oculus Quest2 + ROS2 + 箱庭でロボットを動かす(1/3)](https://qiita.com/kanetugu2018/items/95c16865b8ed4e2ed974#%E7%92%B0%E5%A2%83%E6%A7%8B%E6%88%90)』を参照ください．

* Photon
  * 『[ロボット・マルチプレイ開発を実現する仮想化技術 Unity + Photon + ROS2 + Oculus Quest2 + 箱庭！(2/3)](https://qiita.com/kanetugu2018/items/19d8fb22ef983cc5dc49#photon-%E3%81%A8%E3%81%AF)』を参照ください．

# １個のロボットを動かす

何はともあれ，１個のロボットを動かすための手順を実施してみてください．
これが出来るようになったら，複数のロボットを配置して，同時に動かしてみましょう．

* [hakoniwa-ros2sim
](https://github.com/toppers/hakoniwa-ros2sim)

# 複数のロボットを動かす
箱庭で複数のロボットを動かせるようにするには，以下の３点を把握しておく必要があります．

* 箱庭ロボット・アセット
* 箱庭ロボット・コンフィギュレータ
* 箱庭ロボット・シミュレータ

## 箱庭ロボット・アセット
Unityエディタのプロジェクトビューの「Assets/Resources/Hakoniwa/Robots」を開くと，TB3RoboModelというロボットが見えます．これが箱庭のロボットアセットになります．今は１種類しかないですが，今後，増やしていく予定です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/92972ccf-9f55-30eb-e437-02c7231108df.png)

複数のロボットを配置する場合は，次に解説する「箱庭ロボット・コンフィギュレータ」上に，このロボットをドラッグ＆ドロップして，配置します．

## 箱庭ロボット・コンフィギュレータ
Unityエディタのプロジェクトビューの中に「Assets/Scenes/Configurator」があります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/861d7f50-ecf0-5587-9b05-ec830f8d822e.png)

これをダブルクリックすると，ロボット配置用のシーンが現れます．現状は１個のロボットしか見えませんが，ここにもう１個追加してみましょう．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/229dfc1a-ff98-f7ed-1e30-32e0cb509cb8.png)

やり方は単純で，箱庭ロボット・アセット(プロジェクトビューの「Assets/Resources/Hakoniwa/Robots」)から，TB3RoboModelをドラッグして，ヒエラルキービューの「Configurator/Hakoniwa/Robot」配下にドロップしてください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/917ef1ce-bd47-d001-b33c-4a464c715cd0.png)

うまく行くと，TB3RoboModel(1)が現れます．シーンビューでは１個しか見えませんが，重なっているからです．ロボットをマウスで移動させると，２個いるのがわかります．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/1f75bd95-0e57-8738-1f6b-625c47bd31ad.png)

ところで，ロボットの名前が気になりませんか？ロボットをクリックして，インスペクタービュー上でロボットの名前をそれぞれ「tb3_1」，「tb3_2」として変更してみます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/3cc0c510-ade0-5573-97a3-a703e020b82d.png)

ちなみに，１から配置するときの動画はこちらです．

https://twitter.com/kanetugu2020/status/1505711618390630403


これで，配置完了です．これを箱庭に認識させるために，以下の２ステップを実施します．

* Unityエディタ上からロボット構成をjsonファイルに変換する
* ロボット構成jsonファイルを箱庭定義ファイルに変換する

まずは，メニューの[Windows]->[Hakoniwa]->[Generate]をクリックしてください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/13e05a3c-b320-ef5b-75dc-a3d595b846b2.png)

成功すると，Consoleビューに，`json`ファイルを生成したログが見えます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/1bea00d6-1bc6-e204-a4f6-6398aea76408.png)

実は，このjsonファイル，``hakoniwa-ros2sim/settings/tb3/RosTopics.json``として生成されています．jsonファイルですので，テキストエディタで開くことができます．ロボットが出版・購読するROSトピック一覧が列挙されていますので，興味のある方はぜひご覧ください．

あとは，このjsonファイルをベースに，dockerコンテナ上で，箱庭のコンフィグファイルを生成して終了です．

```
# pwd
/root/workspace/hakoniwa-ros-samples/ros2/workspace
# bash hako-install.bash
###Phase3: Creating core_config
####Creating core_config
####Creating ros_topic_method
####Creating inside_assets
####Creating pdu_readers
####Creating pdu_writers
####Creating reader_channels
####Creating writer_channels
####Creating pdu_channel_connectors
####Creating unity_ros_params
####Creating pdu_config
####Creating param_world
####Creating tb3_parts
###Phase3: Succless
Model is already installed.
Plugin is already installed.
Resources is already installed.
```

## 箱庭ロボット・シミュレータ
ロボット配置は，箱庭ロボット・コンフィギュレータでやっていましたが，シミュレーションは箱庭ロボット・シミュレータで行います．プロジェクトビューの「Assets/Scenes/Toppers_Course」をダブルクリックしてください．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/45a120d2-88b3-f8bb-4d82-683a27d75ff8.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/8a0e0d4a-413b-bc9a-7e16-7cd6301f2304.png)

あれ？先ほど配置したロボット見えませんよね．大丈夫です．シミュレーション実行時に箱庭が自動的にインスタンス化してくれます．

シミュレーション実行方法は，ロボットが１個の場合と同じですが，今回はTB3がもう１個増えましたので，attach.bash でもう１個 docker コンテナを立ち上げましょう．

以下に，シミュレーション実行風景をお見せしますので，ぜひ試してみてください！

https://twitter.com/kanetugu2020/status/1505714014747500547


# この記事の背景的なところ

「[IoT（Internet of Things、モノのインターネット）は情報技術（IT）の総合格闘技です](https://monoist.itmedia.co.jp/mn/articles/2106/28/news012.html)」という名文句が示す通り，IoT のような複雑なシステム開発では，様々なエンジニアが様々な技術領域を横断して開発します．

こういう背景に対して，[TOPPERS](https://www.toppers.jp/) / [箱庭WG](https://toppers.github.io/hakoniwa/) では，『[箱庭](https://ja.m.wikipedia.org/wiki/%E7%AE%B1%E5%BA%AD)』 という新しいシミュレーション環境の構築を目指しています．この箱庭空間ができれば，様々なエンジニアが同じ仮想空間に集まって，ワイワイ議論しながら実証実験できるようになります．ただ，箱庭コンセプトを実現するのはなかなか大変なことだと思っており，出来るところから順番にやっています．

なお，ここ数年の活動のサマリはこちらをご参照ください．

* https://www.toppers.jp/newsletter/newsletter-2111.pdf
  * 上記記事の「箱庭 WG の活動紹介」のところです



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

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

https://hakoniwa.connpass.com/