Unity-ROS2間の通信用パッケージ
UnityとROS2の間の通信を可能にすることで、ROS2を用いたUnityでのシミュレーション環境の構築を実現するためのパッケージを公開しています。
- Ubuntu Linux - Jammy Jellyfish (22.04)
- ROS 2 Humble Hawksbill
以下の手順に従ってパッケージのインストールを行います。
こちらの手順に従って、ROS 2 Humbleをインストールしてください。既にROS2 Humbleのインストールが完了していればこの操作は不要です。
2. Unity Hub のダウンロード:
- パブリックキーの追加
wget -qO - https://hub.unity3d.com/linux/keys/public | gpg --dearmor | sudo tee /usr/share/keyrings/Unity_Technologies_ApS.gpg > /dev/null
- リポジトリの追加
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/Unity_Technologies_ApS.gpg] https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list'
- ダウンロード
sudo apt update sudo apt-get install unityhub
3. Unity のインストール:
- 上記でダウンロードしたUnity Hubを起動
- Unity Hubへのサインインを求められるので、サインインをする。アカウントが無ければ作成する
- InstallsからInstall Editorを選択し、Unity 6をインストール。或いはインストールするようポップアップが出る。
-
ワークスペース作成
mkdir -p unity_ws/src
-
ROS2 branch of the ROS-TCP-EndpointリポジトリとROS2_Packageリポジトリの追加:
cd unity_ws/src git clone https://github.com/ndlab-ros2/Unity-ROS2.git
-
ビルド
source install/setup.bash colcon build source install/setup.bash
source install/setup.bash
ソースコマンドは2回実行する必要があります。1回目はcolcon build
ビルドを実行する際の環境設定を行い、2回目は新しくビルドされたパッケージを環境に追加します。
-
IPアドレスの確認
hostname -I
-
IPアドレスの変更
上記のコマンドの実行によって出力された自身のIPアドレスを
your IP address
に書き換えて次のコマンドを実行する。ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=your IP address
○上記のコマンドの出力が以下の様になっていれば変更完了です。ただし、
<your IP address>
この部分には自身のIPアドレスが表示されます。[INFO] [1741360093.885079373] [UnityEndpoint]: Starting server on <your IP address>:10000
※もし、サーバーがデフォルトの 10000 とは異なるポートにする必要がある場合は、次のコマンドを実行してください。
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=your IP address -p ROS_TCP_PORT:=10000
your IP address
:自身のIPアドレスに変更してください。
5. Unity のセットアップ:
- Unity Hubを起動し、必要であればサインインをする。
Projects
→New project
から新しいプロジェクトを作成する。- 新しいプロジェクトを開き、
Window
→Package Manager
でパッケージマネージャを起動 - 画面左上の
+
ボタンをクリックし、Install package from git URL...
を選択して、ROS-TCP-Connector(リンクはこちら)のURLをコピー&ペーストして、AddボタンをクリックしてROS-TCP-Connectorのパッケージを追加する。以下の画面の様になっていれば完了。
- 先程の操作によってUnityのメインメニューにRoboticsというタブが追加されていることを確認して、
Robotics
→ROS Settings
からROSの設定画面を表示
Protocol
をROS2に切り替えるROS IP Address
に自身のIPアドレスを入力する。自身のIPアドレスが分からない場合は以下のコマンドを実行して、出力されるIPアドレスをコピー&ペーストするhostname -I
ROS Port
に自身で設定したポートを入力する。
- Unityのメインメニューで
Robotics
→Generate ROS Messages...
より、メッセージブラウザーウィンドウを起動 - 「ROS message path」の
Browse
ボタンをクリックし、'~/unity_ws/src/ros2_packages/unity_robotics_demo_msgs'をROSメッセージパスに設定する。 - 「Built message path」の下部に表示されるunity_robotics_demo_msgsサブフォルダーを展開し、「msg」の
Build 2 msgs
と「srv」のBuild 2 srvs
をクリックして、ROS.msgファイルと.srvファイルからC#スクリプトを作成する。
-
Unityのメインメニューで
Project
→Assets
→RosMessages
→UnityRoboticsDemo
より、作成したC#スクリプトを編集する(C#スクリプトがない場合はその場で作成する)。 -
c#スクリプトの名前は自分が分かりやすい名前に変更しておく。今回は例として
Ros Publisher Example
としている。 -
次のコードをスクリプトに貼り付ける。
using System.Collections; using System.Collections.Generic; using UnityEngine; using Unity.Robotics.ROSTCPConnector; using RosMessageTypes.Std; public class MyPublisher : MonoBehaviour { ROSConnection ros; float time; // Start is called before the first frame update void Start() { // ROSコネクションの取得 ros = ROSConnection.GetOrCreateInstance(); // パブリッシャの登録 ros.RegisterPublisher<StringMsg>("my_topic"); } // Update is called once per frame void Update() { time += Time.deltaTime; if(time < 1.0f){ return; } time = 0.0f; // メッセージのパブッシュ StringMsg msg = new StringMsg("Hello Unity!"); ros.Publish("my_topic", msg); } }
-
Unityのメインメニューの
Hierarchy
にある+
ボタンをクリックし、Create Enpty
から空のGameObjectを作成する。(必要であればGameObjectの名前を変更しても良い) -
そのオブジェクト内にスクリプトを作成して、先程作成したスクリプトを貼り付ける
-
ROS2側のエンドポイントの起動
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=your IP address
※もし、サーバーがデフォルトの 10000 とは異なるポートにする必要がある場合は、次のコマンドを実行してください。
ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=your IP address -p ROS_TCP_PORT:=10000
your IP address
:自身のIPアドレスに変更してください。
○出力結果が以下の様になっていれば変更完了です。ただし、<your IP address>
この部分には自身のIPアドレスが表示され、には指定したポート番号が表示されます。(特に変更がなければデフォルトの10000が表示されます)
[INFO] [1741360093.885079373] [UnityEndpoint]: Starting server on <your IP address>:<Port number>
-
Unityのメインメニューから'▶'ボタンを押す
-
Game
ウィンドウの左上部分にある接続ライトが赤色🟥から青色🟦に変化していることを確認する -
「ROS2側のエンドポイント起動」のコマンドで以下の様な出力が表示されているかを確認する
[INFO] [1741678056.431790026] [UnityEndpoint]: Connection from <your IP address>
-
トピック出力の有無の確認 もう1つのterminalを開き、以下のコマンドを実行して、出力画面に
my_topic
というトピックが出力されているかを確認する。ros2 topic list
○トピックがあることが確認できれば
CTRL
とC
を同時に押してコマンドを終了する -
ROS2-Unity間の接続確認
ros2 topic list
○以下の様な出力になっていれば接続完了!