【ROS/Unity/WSL】Windows上でmyCobotをROSとUnity上で動かす

# はじめに
みなさんはmyCobotというロボットアームを知っていますか？

https://www.elephantrobotics.com/en/myCobot-en/

衝撃的な値段のロボットアームで、「実質無料」とも言われてきました。Googleで「myCobot 実質無料」で検索するとたくさんの人が実質無料でmyCobotを手に入れていることがわかります(？)

ROSのMoveIt!と連携してUnityでも動くらしい。ROSだとgazeboとかのシミュレータが動かしやすくて有名ですよね。Unityでも動かすことができるらしいというツイートを見つけ、このようなコメントを見ました。
「**仮想環境でも多分大丈夫ですけど、未確認…**」

https://twitter.com/karaage0703/status/1393755274557607939?s=20

ということで、WSL2上のUbuntuとWindows上のUnityでやりました。

# 環境
 - Windows 10 Home
 - Unity 2020.3.8f1  

WSL2

 - Ubuntu 18.04
 - ROS Melodic

# 手順
基本的に、先ほど紹介したツイートにあったこの記事のとおりに進めていきます。
**特に、Ubuntu上でのROSのセットアップなどは以下の記事の通りなので、説明などは省略しながら進めていきます。**

また、WSLとROSのインストールが済んでいる方は MoveItのインストール辺りからの作業になるかと思います。

https://zenn.dev/karaage0703/books/3be6bad93b0c8e/viewer/eec47d

# Windows上
## WSL2とUbuntuのインストール
WSL(Windows Subsystem Linux)と、その上で動作するUbuntuをインストールします。これでWindows上でUbuntuを動作させることができます。
以下の記事通りでインストールできます。UbuntuはMicrosoft Storeを起動し、Ubuntu等のディストリビューションを検索した際に、18.04を選択することで18.04をインストールすることができます。

https://qiita.com/whim0321/items/ed76b490daaec152dc69

# Ubuntu上
**(再掲)Ubuntu上でのROSのセットアップなどは先ほど紹介したの記事の通りなので、説明などは省略しながら進めていきます。**
## ROSのインストール
ここから、インストールしたUbuntuのターミナルでの作業になります。
既にインストール済みの方は、catkinのビルドシステムはcatkin buildを使用するので注意してください。

インストールから行う場合は、以下のディレクトリのインストールスクリプトを使用させてもらいましょう。

https://github.com/karaage0703/ubuntu-setup

```bash
curl -s https://raw.githubusercontent.com/karaage0703/ubuntu-setup/master/install-ros-melodic.sh | /bin/bash
```


また、ROSのGUIをWindows上で使用する際は以下の記事通りに設定する必要があります。

https://qiita.com/comocc/items/68d4ca02277abd2c457c

## MoveItなど各種必要なソフトのインストール
MoveItとは、マニピュレーターの動作計画をしてくれるソフトウェアです。
以下のコマンドでインストールします。

```bash
$ sudo apt update
$ sudo apt install -y ros-melodic-moveit
$ sudo apt install -y ros-melodic-ros-control ros-melodic-ros-controllers
$ sudo apt install -y ros-melodic-gazebo-ros
$ sudo apt install -y ros-melodic-jsk-rviz-plugins
```

## myCobot用のソフトウェアのインストール
myCobotのMoveIt用のソフトウェアをダウンロードしてビルドすると、すぐに使えるようになります。以下のリポジトリにありますが、これも[この記事](https://zenn.dev/karaage0703/books/3be6bad93b0c8e/viewer/eec47d)を参考にダウンロードとビルドを行います。

https://github.com/nisshan-x/mycobot_moveit

```bash
$ cd ~/catkin_ws/src
$ git clone https://github.com/Tiryoh/mycobot_ros
$ git clone -b fix_gazebo https://github.com/karaage0703/mycobot_moveit
$ catkin build
```

## Gazeboでの動作確認
正常にインストールできていれば、以下のコマンドでRvizとGazeboが立ち上がります。

```bash
$ roslaunch mycobot_moveit mycobot_moveit_gazebo.launch 
```


右にRviz、左がGazeboですね。これでWindows上でGazeboとRvizが立ち上がることも確認できました。
Rvizの方で手先を適当な場所に動かし、Plan&Executeを実行するとGazebo上のmyCobotも動くことがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/c7a64ce3-3366-9906-20c4-e9ddf8aeced0.png)

※Windows上でGazeboなどのソフトウェアが立ち上がらない場合は以下の記事の設定がうまくいっていない可能性が高いです。

https://qiita.com/comocc/items/68d4ca02277abd2c457c



## Unityと通信用のソフトウェアのインストール
Gazeboでの動作確認ができたら、Unityと通信用のソフトウェアをインストールしましょう。

```bash
$ sudo apt install -y ros-melodic-rosbridge-server
```


## UbuntuのIPアドレスの確認
あとでWSL上のUbuntuとWindowsで通信を行うので、UbuntuのIPアドレスを確認しておきます。eth0の部分に出ているIPアドレスを使用します。
今回は、`172.21.168.185`となります。
細かい仕様は分かっていないですが、起動するたびに変わるようなので注意してください。

```bash
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.21.168.185  netmask 255.255.240.0  broadcast 172.21.175.255
        inet6 fe80::215:5dff:fea0:702c  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:a0:70:2c  txqueuelen 1000  (Ethernet)
        RX packets 360754  bytes 24703826 (24.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 646362  bytes 29983555789 (29.9 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 10029818  bytes 755374944 (755.3 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 10029818  bytes 755374944 (755.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```


**次からは、Windows上での作業になります。**
# Windows上での作業
## Unity Hubのダウンロード
まず、Unity Hubをインストールします。Unity Hubは、Unity本体ではなく、Unity自体を管理できるソフトウェアのようなものです。
以下のサイトの、「Unity Hubをダウンロード」ボタンからダウンロードして、Unity Hubのインストールを行います。

https://unity3d.com/jp/get-unity/download

## Unityのインストール
続いて、Unityをダウンロードします。ネットワーク次第で時間がかかるので気長に待ちましょう。
自分が動作確認したバージョンは2020.3.8f1かでした。
Unity Hubの「インストール」メニュー、右側の青いインストールボタンを押してインストールを行います。初回はライセンスの認証が必要なのでメールアドレスをいれて認証しましょう。個人での使用は無料です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/68574ebb-06ad-3922-4d76-5ad504158ead.png)


## myCobotに必要なソフトウェアをダウンロード
**これらはわかりやすいWindows上のフォルダに置いてください。**
myCobotのUnity環境をダウンロードします。

```bash
$ git clone https://github.com/Ry0/mycobot_unity_ros_sharp.git
```

UnityとROSの通信に必要なソフトウェアをダウンロードします。
以下のリポジトリの、"RosSharp.unitypackage"をダウンロードしてください。

https://github.com/siemens/ros-sharp/releases

自分が使用したものはROS# Version 1.7です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/2af1f47c-6a79-5299-10d9-788610d8ea03.png)


※これらのファイルをWSL上に置いても、アクセスはできるがUnityのバージョン違いに対応できず、Unityが立ち上がらなかったです。

## Unityプロジェクトを立ち上げて、ROSとの通信をできるようにする
Unity Hubの、プロジェクトメニュー　＞　「リストに追加」からダウンロードした `mycobot_unity_ros_sharp`のフォルダを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/e3ad0306-2a22-26d9-81b1-37098878930c.png)

プロジェクト名をダブルクリックすると立ち上がります。(Unity Hubが落ちてUnityが立ち上がります)

### ROS#のAssetをimport
UnityのProjectタブのAssetsから右クリックでImport Package > Custom Package... から、先ほどダウンロードしたRosSharp.unitypackageを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/b4d79078-6454-643f-1330-95e7be5a17fb.png)


### ROSとの通信の設定
ROSとwebsocket通信で通信するため、WSL上のUbuntuのipアドレスを入力します。
左側の Hierarchyメニューの中のROSConnectorをクリックすると、右側に色々メニューが出てきます。その中の`ROS Bridge Server Url`のIPアドレスをWSL上のUbuntuのIPアドレスにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426354/38b3e9fc-e02c-a218-355f-14f83d267adb.png)


また、Joint Namesの名前を変えます。
`joint1`〜`joint6` を `arm1_joint`〜`arm6_joint` のようにしてください。
ここまでの変更を保存したら準備は完了です。

# 動作確認
## ROSの立ち上げ
以下のコマンドで立ち上げます。
Gazeboの時と同様に、myCobotのMoveItを立ち上げます。

```
$ roslaunch mycobot_moveit mycobot_moveit_gazebo.launch
```

Unity通信用に以下のコマンドを実行します。

```
$ roslaunch rosbridge_server rosbridge_websocket.launch
```

## Unityの立ち上げ
先ほどと同様の手順でUnityを起動し、中央上部の再生ボタンを押します。
Rviz上でMoveItを動かすとUnity上のMyCobotも動くと思います。

https://twitter.com/ko1_baseba11/status/1393932530148012035

以上です！！！！！

# 参考
素晴らしいソフトウェアを公開してくれている皆さん、ありがとうございます！！！

## myCobotについて
https://zenn.dev/karaage0703/books/3be6bad93b0c8e

## myCobotをUnityで動かす
https://github.com/Ry0/mycobot_unity_ros_sharp

## UnityのPlaymode中は変更の保存ができない
https://unity-beginners-blog.unity3d.jp/2019/06/25/playmodecolor/