DonkeyCarのマイシミュレータを作ろう

# はじめに
自動運転ミニカーバトル参加者がシミュレーションを活用できるように極力シンプルな構成で構築しました。ネット上にあるリソースを組み合わせることで構築しております。ですので、サンプルコードを参考にしながら構築、読み解くことで改良も出来ると思います。ぜひ、ご活用くださいませ。また、不明点などあれば、問い合わせ頂ければと思います。

### できること
- 某自動車会社有志団体主催の自動運転ミニカーバトル2022大会・2023大会のコースをシミュレーションし、DonkeyCarを実機レスで動作させ、ロジック検証・データ取りを自宅で行う。
- 使えるセンサ：カメラ、距離センサ、IMU、車速センサ　など（追加が必要であれば要実装）

### 想定する読者
- DonkeyCarを一から環境構築を行い一連の手動・自動運転、学習を行った事がある
- DonkeyCarのVehicleクラスを使ったフレームワークを理解できる

　　参考：https://qiita.com/hara2dev/items/1c2c30a93c7fb8e9861d

- Pythonが理解できている
- ミニカーバトル2023の参加者
- マイシミュレータを作ろう座学編を見て頂いた方

### 役に立つ知識
- ROS２
- Unity、C#


#### テスト環境
CPU：Core i9-12900H
GPU：RTX 3050 Ti
メモリ：16GB LPDDR5-5200
OS:Windows11

#### 推奨環境
- Unityが動作するスペックが必要です。
- 学習を行う場合、GPUが必要です。
CPU:Core i5以上、GPU：RTX系、メモリ：16GB以上であれば動作すると思われます。
（もっと低くても大丈夫かも・・・）

#### 問い合わせ
不明点あると思いますので、ご質問はお気軽にTwitterやメッセージからお願いいたします。

# Unity側環境の構築

## 1.Unityの環境構築
UnityHubをインストールし、Ver2021.3.24f1のUnityをセットアップします。
[Start Your Creative Projects and Download the Unity Hub | Unity](https://unity.com/download)

インストール方法は、以下を参考にしてください。
[初めてUnityをインストールする手順について＜Windows編＞ – Unity for Pro (unity3d.jp)](https://forpro.unity3d.jp/tutorial/unity-install-windows/)

## 2.シミュレータ環境をクローンします。
以下からクローンもしくは、ダウンロードしてください。
https://github.com/taigamaru/donkey-my-sim/
![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/1e30bf53-d258-08bf-0d58-c4c4b3d4221d.png)

<>Codeをクリックすると、URLとDownloadリンクが出てくるので、お好きな方法でソースコードをダウンロードしてください。

## 3.Unityを起動してシミュレータを起動する。
Unityを起動してください。
ProjectsのOpenをクリックして、先ほど取得したソースコードを開きます。

![Untitled (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/a49349ae-9ebd-3f61-7841-0d1d283fca2d.png)


「donkey-my-sim」フォルダを選択してください。
![Untitled (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/5bf4f967-b1a3-52f5-3613-7ee9993b5a75.png)

Openをクリックし起動します。
初回の起動は、パッケージの展開があり、時間がかかります。
起動すると以下のような画面になるので、シミュレータのシーンを開きます。
![Untitled (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/80ae48c8-833e-e0a6-db7e-f30a5ad22328.png)

projectウィンドウのAssets/ScenesフォルダにSampleScenes1をクリックしてください。
![Untitled (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/aaefa7bb-99a7-2f58-e930-fe9618610a55.png)

うまく開けると、以下のように、シーンが表示されます。
![Untitled (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/6e144cc2-c33c-c52e-a0d9-a8ebbec7140d.png)

手前のコースが2022年のコースで奥側が2023年のコースになります。
2023年のコース側には、テキスト表示の補助表示が出てしまっているので、非表示にします。
Sceneウィンドウの一番右側にあるアイコン[Gismosスイッチ]をクリックして非表示にすることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/01941c48-042f-adb0-8d6a-bca67c12f7bc.png)

ここまででUnity側の環境構築は、終了です。

# Ubuntu環境の構築
次にDonkeyCarが動作するUbuntu環境を構築します。

## 1.Windows Subsystem for Linux2 (WSL2)をインストールします。
（Windows10の場合）
　公式：[以前のバージョンの WSL の手動インストール手順 | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/wsl/install-manual)

（Windws11の場合）
　公式：[WSL のインストール | Microsoft Learn](https://learn.microsoft.com/ja-jp/windows/wsl/install)
以下を参考にしてUbuntu20.04をインストールしましょう。
[Windows11にWSL2＋Ubuntu20.04をインストールする | Asterisk::Asterisk (relaxes.jp)](https://development.relaxes.jp/windows11%e3%81%abwsl2%ef%bc%8bubuntu20-04%e3%82%92%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%bc%e3%83%ab%e3%81%99%e3%82%8b/#:~:text=1.%E3%80%8CWindows%E3%81%AE%E6%A9%9F%E8%83%BD%E3%80%8D%E3%81%8B%E3%82%89%E3%80%8CLinux%E7%94%A8Windows%E3%82%B5%E3%83%96%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%80%8D%E3%81%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B%20%EF%BC%88%EF%BC%92%EF%BD%9E%EF%BC%94%E3%81%AE%E6%89%8B%E9%A0%86%E3%82%92%E8%A1%8C%E3%82%8F%E3%81%9A%E3%80%81%E3%81%93%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%A7%E5%86%8D%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%A7WSL1%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%82%8B%EF%BC%89%202.%E3%80%8CWindows%E3%81%AE%E6%A9%9F%E8%83%BD%E3%80%8D%E3%81%8B%E3%82%89%E3%80%8C%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%80%8D%E3%81%AB%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E5%85%A5%E3%82%8C%E3%81%A6%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%99%E3%82%8B,3.Linux%20%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%E6%9B%B4%E6%96%B0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%20%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%204.WSL2%E3%82%92%E6%97%A2%E5%AE%9A%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%81%A8%E3%81%99%E3%82%8B%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E5%AE%9F%E8%A1%8C)

## 2.ROS2をインストールします。
Unity環境とDonkeyCarプログラムの通信のベースとしているROS2をインストールします。
以下を参考にして、ROS２をインストールしましょう。
[ubuntu20.04LTSへのROS2 Foxyのインストール - Qiita](https://qiita.com/porizou1/items/53053ce806304fd71f06)

## 3.Xserverをインストールします。(Windows11の場合は、不要になったみたいです。)
WSL環境でGUIを起動するために必要になります。
ROS2のツールを使わない場合は、スキップしてください。
以下を参考にして、Xserverをインストールしましょう。
[WSL2＋Ubuntu 20.04でGUIアプリを動かす | AsTechLog (astherier.com)](https://astherier.com/blog/2020/08/run-gui-apps-on-wsl2/)

## 4.ROS-TCP-Endopointをセットアップします。
以下より、ソースコードをzip形式でダウンロードしてください。
(クローン→チェックアウトでもOKです。)
ROS2版を使います、バージョンに注意してください。
[GitHub - Unity-Technologies/ROS-TCP-Endpoint at ROS2v0.7.0](https://github.com/Unity-Technologies/ROS-TCP-Endpoint/tree/ROS2v0.7.0)

![Untitled (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/d7ab0e8a-8c9c-6336-b00b-33562632d784.png)


ダウンロードしたROS-TCP-Endpointを解凍して、ROS2インストール時に作った、ワークスペース内のros2_ws/srcにROS-TCP-Endpointを移動します。
WSL内のフォルダをエクスプローラーで開く場合は、以下を参考にしてください。
※zipをダウンロードする場合は、ファイ名が変わるので注意してください。
　（ROS-TCP-Endpoint-ROS2v0.7.0）
![Untitled (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/7e43e61f-480d-0488-cd07-143188952d8c.png)


Ubuntu上でROS-TCP-Endpointをビルドします。
以下のコマンドを実行してビルドします。

```
cd ros2_ws
colcon build
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/57c74709-84db-c406-d384-4b2f96633e59.png)

ROS-TCP-Endpointの動作確認を行います。
```
source /home/ubuntu/ros2_ws/install/setup.bash
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=<your IP address>
```
１行目でパスを通しています。起動毎に行う必要があるため、ROS2と同じように起動時に読み込むようにしましょう。
```
echo "source /home/ubuntu/ros2_ws/install/setup.bash" >> ~/.bashrc
```
２行目で起動しています。IP addressについては、今回１台のPC内で完結するため、127.0.0.1としましょう。
```
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=127.0.0.1
```

起動すると以下のように表示されます。
![Untitled (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/0827d11f-9404-eddd-bdf8-1356675f2d2e.png)

## 5.image-transportをインストールします。
Unity側から圧縮された画像が送信されてくるため、圧縮＆解凍用のパッケージをインストールします。
```
sudo apt install -y ros-foxy-image-transport
sudo apt install -y ros-foxy-image-transport-plugins
```
以下のコマンドで起動します。
```
ros2 run image_transport republish compressed --ros-args -r in/compressed:=image/compressed -r out:=image_raw
```
オプションでinとoutを指定します。

今回の場合は、Unity側で圧縮されているため、inを圧縮されている画像イメージである、image/compressedを指定します。outは、image_rawと指定し、解凍したものをrepublishします。


# ここまでの動作確認
ここまで読んでいただきありがとうございます。お疲れ様でした！
ここまででUnityの世界とUbuntuの世界がROS2の通信を使ってつながっています。
いったんここまでの環境構築が正しく行えているか動作確認を行いましょう。

## 1.Unityを起動して、シミュレーションを実行します。
画面中央にある、再生ボタンをクリックしてください。

![Untitled (11).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/33d1cf93-523b-46bd-3ecc-ed842b4b8479.png)


## 2.ROS-TCP-Endpointを起動します。

```
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=127.0.0.1
```

## 3.image-transportを起動します。
別ウインドウを開き、以下のコマンドを実行してください。
```
ros2 run image_transport republish compressed --ros-args -r in/compressed:=image/compressed -r out:=image_raw
```

## 4.Rvizを起動します。
Rvizは、ROSに付属している可視化ツールです。
Rvizを使うことでUnityから送信されたカメラ映像や通信しているスロットルやステアリングなどの制御信号を可視化します。
先ほどとは、別のウィンドウで「rviz2」コマンドで起動します。
起動したら、左下のaddボタンから画像を追加します。

![Untitled (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/530170b3-364d-197d-2493-d49f2f8ffaa4.png)

以下のウィンドウでtopicを指定します。（By topicタブです。）

![Untitled (13).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/2e7ad756-f167-0231-491a-84bb92184c6c.png)


ここの画面上の/image_rawnの下のImageを選択します。
ここになければ、どこかで通信が出来ていない可能性があります。
　・各コマンドが実行できているか？
　・EndpointのIPがあっているか？
　・Unityのシミュレータが実行されているか？
　・ファイアウォールなどの設定は、適切か？
選択ができると、Unity上のシミュレータが送信している画像が左したに表示されます。

![Untitled (14).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378484/00b0430f-bd4b-fa98-f4c3-85afa07237bc.png)


後編のDonkeyCar環境構築編に続く・・・