Unity + Oculus Quest2 + ROS2 + 箱庭でロボットを動かす(3/3)

# 概要
TOPPERS/箱庭では，ROS2 で Unity ロボット制御できるようにしていましたが，これが VR 空間上で体験・操作できるようになりました！

ちなみに，こんな感じのことができます！！

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

この体験をいろんな方と共有したく，3 回に分けてインストール手順を説明しています．

* 1 回目：[TOPPERS/箱庭に Oculus でダイブできるにようになる](https://qiita.com/kanetugu2018/items/95c16865b8ed4e2ed974)
* 2 回目：[VR 空間で移動してモノをつかめるようになる](https://qiita.com/kanetugu2018/items/0d57cf85f334cac39419)
* 3 回目：タッチセンサを追加して，VR 空間のロボットを動かせるようになる(本記事)

前回は，Oculus を使って，Unityで作られた箱庭VR空間にダイブして，移動することはもちろん，モノをつかむこともできるようになりました．

3 回目である今回は，ロボットを動かすためのタッチセンサを追加して，ロボットを箱庭 VR 空間で動かすための手順を説明していきます．

# 手順サマリ

1. Unity 環境でタッチセンサを追加する
* 追加したタッチセンサを箱庭に認識させる
* 箱庭/docker 環境を準備する
* ROS2のノードを起動する
* レッツ　ダイブ！

# Unity 環境でタッチセンサを追加する

まずは，タッチセンサを追加する場所を，Unityのヒエラルキービューで確認してみましょう．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/2bbd2212-d51f-7b4b-7b20-c21d09705164.png)

今回は，`Hakoniwa/Robot/RbotController/MainBody/Interface-U/Interface-UL` にしましょう．

次に，タッチセンサの prefab の場所を確認するために，プロジェクトビューを見ましょう．`Assets/Prefabs/RobotParts/03_Sensor` の `TouchSensor` です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/e361d84f-40be-594b-0d9c-0e33fb638d70.png)

TouchSensorを先ほどの Interface-UL に D&D します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/359d3777-2dba-ee73-5d41-7114914bd5ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/8eccc8b3-9c43-55ba-75e6-502635ee32a3.png)

この状態ですと，タッチセンサが Interface-ULに隠れていますので，少し移動します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/9bf1dd5c-3454-7d3b-bf19-ed884bb7bdd3.png)

同じ要領でもう１個追加．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/54a2f63d-4cd3-1c55-a4e8-9061803cc822.png)

この際，タッチセンサの位置が MainBody と重なっているので，タッチセンサのY軸の位置をそれぞれ `0.02` としましょう．また，TouchSensorのオブジェクト名をそれぞれ，`TouchSensor1`, `TouchSensor2`とします．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/0e21ac35-1eb9-7e3b-01c8-354704ebd482.png)


最後に，それぞれのタッチセンサが送信するトピック名を変更します．

## TouchSensor1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/54c51c4a-478f-6085-3f8b-18fa2cf7ab3c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/31fed012-d44b-e67b-e2fd-1ced462fcc46.png)


## TouchSensor2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/5c148f51-af2f-1569-61f8-92147d6d9da0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/9cb9c830-128f-51a1-86e2-67edc5eda325.png)

# 追加したタッチセンサを箱庭に認識させる

Unityのメニュー [Window]->[Hakoniwa]-[Genereate] をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/35b3f117-e312-37c6-73f5-e9281a6547a7.png)

これだけでOKです．

# 箱庭/docker 環境を準備する
箱庭 VR 空間のロボットを動かすためには，ROS2ノードで制御をおこなう必要があります．
箱庭を使うと，UnityとROSノードのトピック通信用の設定まわりを自動化してくれます．
さきほど追加したタッチセンサのトピック名もここで設定されます．

まずは，WSL2を 2 個起動してください．それぞれ端末A，Bとします．
そして，以下の要領で ROSノードの実行環境を整えます．

* [docker イメージを作成：端末A](https://qiita.com/kanetugu2018/items/b132b48be2b59eb214fb#docker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E4%BD%9C%E6%88%90)
* [箱庭ROS環境をインストール：端末A](https://qiita.com/kanetugu2018/items/b132b48be2b59eb214fb#docker%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B)
* [ROSノードをビルド：端末B](https://qiita.com/kanetugu2018/items/b132b48be2b59eb214fb#%E6%BA%96%E5%82%99)
* [ROS-TCP-ENDPOINTを起動：端末A](https://qiita.com/kanetugu2018/items/b132b48be2b59eb214fb#%E7%AB%AF%E6%9C%ABa-1)

# ROS2のノードを起動する

```
# bash run.bash robo_parts RobotController
```

# レッツ　ダイブ！

では，いざダイブです！
タッチセンサの反応が少し遅いですが，トピック配信周期を２秒周期にしているためと思います．
タッチセンサの UpdateCycle を `100` から `10` にすれば，0.2秒程度で反応するはず．

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


今回はタッチセンサの種類は１個だけとしましたが，同様なやり方で増やしていくことができます．
ちなみに，モータのトピックとしては以下がありますので，興味のある方はぜひチャレンジしてみてください！

* servo_base_move_left
  * モータが左にまわります．
* servo_base_move_right
  * モータが右にまわります．
* rotate_right
  * モーターの頭が右回転します．
* rotate_left
  * モーターの頭が左回転します．

どうしてもうまく行かない方，「箱庭もくもく会」にダイブしてみるのもありかもです．

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

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

https://hakoniwa.connpass.com/