DonkeyCarをUnity上で走らせる

# はじめに
DonkeyCarを作っても広い場所で走らせれないし、場所があっても行くのが面倒なので
Unity上に好きなコースを作って走らせれるようにしました。
備忘録として残します。



# 環境構築方法を決める
基本的な考え方は、UnityとDonkeyCar(python)間の通信としてROS2を採用します。
幾つかパターンを考えましたが、Ubuntu上でUnityを動かすことで落ち着きました。
（UbuntuでUnityが普通に動くの知らなかったです。）

1:WindowsでUnity WLS2でUbuntuしてDonkeyCar　USB△ GPU△
2:WindowsでUnity VirtualBoxでUbuntuしてDonkeyCar USB○　GPU☓
3:UbuntuでUnity UbuntuでDonkeyCar USB○　GPU○

結局３が一番かんたんでした。


# Ubuntu環境の準備
今回は、Ubuntu 22.04 で行いました。
https://jp.ubuntu.com/download

# Unityのインストール
以下を参考にしてUnityをインストール
https://unity3d.com/jp/get-unity/download

#### AppImage 実行できない場合の対処方法
https://gamingsym.in/jp/ubuntu-22-04%E3%81%A7appimage%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%EF%BC%9F-%E3%81%93%E3%82%8C%E3%82%92%E4%BF%AE%E6%AD%A3%E3%81%99%E3%82%8B%E6%96%B9/
https://qiita.com/YuukiToriyama/items/d4840dc31bdae65e8294
https://terminalroot.com/how-to-install-unity-engine-on-ubuntu-via-appimage/

#### エラーが出る「No usable version of libssl was found」
以下を参考にして対応
https://forum.unity.com/threads/workaround-for-libssl-issue-on-ubuntu-22-04.1271405/

　[1]install
　以下のURLからlibssl1.0.0_1.0.2n-1ubuntu5.8_amd64.debをダウンロード
　http://security.ubuntu.com/ubuntu/pool/main/o/openssl1.0/
　[2]install
　sudo apt install libssl-dev

# DonkeyCarのインストール
以下を参考にしてDonkeycarをインストール
https://docs.donkeycar.com/guide/host_pc/setup_ubuntu/
後のことを考えてPythonは、3.10.0がいい（3.7.0でやるとrclpyが使えませんでした。）
 ubuntu.ymlのpythonのバージョンを変えておく 3.7→3.10

# ROS2のインストール
以下を参考にしてROS２をインストールする
https://qiita.com/porizou1/items/5dd915402e2990e4d95f

# Unity-Robotics-Hubの導入
https://github.com/Unity-Technologies/Unity-Robotics-Hub
ダウンロードしたらどこかに置いておく

# ROS-TCP-Connectorの導入
Package Managerのgit URLに以下を追加
https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector

インストール後にすること
RoboticsSettingsでROS2を選択
RosMessageBrowserでUnity-Robotics-Hubにあるメッセージ型をビルド

# ROS-TCP-Endpointの導入
以下をwsでクローンする
https://github.com/Unity-Technologies/ROS-TCP-Endpoint.git
git checkout ROS2v0.7.0 してからビルドする


# ROS-Unity疎通確認
以下を参考にして「ROS–Unity Integration: Publisher」をトライする
https://github.com/Unity-Technologies/Unity-Robotics-Hub/blob/main/tutorials/ros_unity_integration/publisher.md
→エラー出てしまって出来なかったので、何でも良いのでパブリッシュしてみます。

以下のコマンドで実行します。
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=127.0.0.1

#### Rviz2で画像を表示
 圧縮画像を確認するために、image-transportパッケージの追加
 sudo apt install ros-humble-image-transport-plugins

 圧縮画像をRawデータに変換してあげる
 ros2 run image_transport republish compressed --ros-args -r in/compressed:=image/compressed -r out:=image_raw


# nvidia driverのinstall
https://codechacha.com/ja/install-nvidia-driver-ubuntu/
以下を参考にしてドライバをインストール
https://qiita.com/porizou1/items/74d8264d6381ee2941bd

# TensorFlowをインストールする
→GPUは、使える設定で入れれませんでした。
PytorchがGPU使えてるのでそちらで乗り切ってます。
あとで対応します。

# 書き残し
・DonkeyCarのROS2用のスクリプト
　https://github.com/taigamaru/donkeycar/tree/feature/add-ros2-and-pytorch
　（この中からros2.py manage.pyぐらいを参考にする。）

・Unityのカメラ映像を送るスクリプト
　https://github.com/Field-Robotics-Japan/UnitySensorsROSAssets
　以下をカメラにアタッチすることで映像をパブリッシュします。
　　RGBCamera.cs
　　RGBCameraPublisher.cs

# トラブルシュート
#### rclpyのimportでエラーが出る。
エラー:version `GLIBCXX_3.4.30'　のエラーが出る

解決策
conda install -c conda-forge gcc=12.1.0