M1 Mac+DockerのROS2-humbleとUnityをつなぎ、Moveit2も導入する

![SS 192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/a41cd967-f549-8677-1efa-2e99bf69518d.png) （ちょっと動かしたいダケ...）

## やること
DockerでROS2_humbleを起動して、Unityとデータ通信するところの自分用のメモです。
後半のMoveit2のチュートリアル実行までいろいろと大変でした。
変なところがあったらすみません。

## 作業環境

* Mac M1（apple silicon）
* Unity (バージョン 2022.3.8f1)
* ROS2 humble

## 方法

### STEP:1　DockerでROS2を開く
まず、ROS用のポート番号10000とワークスペースのマウント付きでDockerを開きます。
（以下はApple silicon用です。インテルPCの場合などは行末の-arm64を削除して実行するとうまくいくかもしれません。）
```
docker run -v ~/ros2_ws:/home/ubuntu/colcon_ws:cached -p 6080:80 -p 10000:10000 --shm-size=1024m tiryoh/ros2-desktop-vnc:humble-arm64
```
ROS2_humbleのDockerイメージを開きます。
同時にMacのディレクトリ「/Users/[ユーザー名]/」の中にros2_wsのディレクトリがマウントされます。
そのディレクトリにはDockerの中からもMacのデスクトップからもアクセスできて超便利です。

必要に応じてリネームする。
```
docker rename 古いコンテナ名 新しいコンテナ名
```


### STEP:2　ROS2のエンドポイントを立ち上げる
ブラウザで
http://127.0.0.1:6080/
を開き、Ubuntuのデスクトップに入る。

ROS2用のROS-TCP-Endpointをインストールする。
```
cd ~/colcon_ws/src
git clone -b ROS2v0.7.0 https://github.com/Unity-Technologies/ROS-TCP-Endpoint
cd ~/colcon_ws/
colcon build
source ~/colcon_ws/install/setup.bash
echo "source ~/colcon_ws/install/setup.bash" >> ~/.bashrc
```

DockerとMacを繋ぐエンドポイントを立ち上げます。
```
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0
```


### STEP:3　UnityのROS2を立ち上げる
MacでUnityを開く。バージョンは2022.3.8f1。
M1Mac対応なので物理演算がなめらか快適。

メニューの「Window」→「Package Manager」を開き、左上の「＋」ボタンから「Add Package from git URL...」を選択。
https://github.com/Unity-Technologies/ROS-TCP-Connector?path=/com.unity.robotics.ros-tcp-connector#v0.7.0
を入力する。

Unityのメニューに「Robotics」が現れるので、プルダウンから「ROS Settings」を選択する。
チェックボックスをROS2に、ROS portを10000にする。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/882d5dd9-06a2-6589-a04e-488d49312723.png" width = 300>



同様の手順で、Visualizationsを導入する。
「Add Package from git URL...」で、  
https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.visualizations#v0.7.0
を入力。 
Unityの画面下にあるProjectから「Packages」→「Unity Robotics Visualizations」の中の「DefaultVisualizationSuite」を見つけてヒエラルキーウィンドウにドロップ。

### STEP:4　UnityとDocekrROS2間の通信を確立する
急にはしょります。
DockerのROS2でパブリッシュ、Unityのスクリプトでサブスクライブするコードなどを使えば通信が成立するはずです。
スクリプトは記の最後にある本などにあります。


### STEP:5　Moviit2を導入する

Moveit2を導入します。以下を参考に、

https://moveit.ros.org/install-moveit2/binary/

```
 sudo apt install ros-humble-moveit 
```
とします。

次に、以下を参考にTutorialを進めます。

https://moveit.picknik.ai/humble/doc/tutorials/getting_started/getting_started.html

が、自分の場合そのままではうまく行かなかったので、
Dockerのメモリが少ない場合には設定で増やしておきます。
Cpus:4
Memory:6GB
Swap:2GB
VirtualDiskLimit:24GB
にしました。もっと少なくても大丈夫とは思います。

その上で、ビルドのところは、
```
colcon build --mixin release  --cmake-clean-cache --parallel-workers 1
```
として、前回のインストール失敗のキャッシュをクリアにしつつメモリの使用を抑えたりしました。

Macに扇風機を当てるなどで排熱することでなんとかビルドは最後まで通ります。
ビルド時間はかなり長時間になりました。（１時間ぐらい？）

### STEP:6　Moviitのtutorialを実行する

https://moveit.picknik.ai/humble/doc/tutorials/quickstart_in_rviz/quickstart_in_rviz_tutorial.html

を参考に、

```
ros2 launch moveit2_tutorials demo.launch.py rviz_config:=panda_moveit_config_demo_empty.rviz
```
とします。

RVizの立ち上げまでは確認できますので、先ほどのtutorial記事に沿ってすすめると、pandaが立ち上がります。

![SS 1075.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565043/317e9878-b9f4-3918-20fd-5770c342b29e.png)

これでチュートリアルができる...はず！

## 参考
『UnityではじめるROS 人工知能 ロボットプログラミング 実践入門』布留川英一著

https://note.com/npaka/n/n2d683d74acf7