ROS入門 (41) - ROS2-Unity間のトピックによる通信
「ROS-TCP-Connector」と「ROS-TCP-Endpoint」によるROS2-Unity間のトピックによる通信の手順をまとめました。
「ROS入門 (11) - ROS2のトピックによる通信」で作成したhelloパッケージの「talker」「listener」とUnityのメッセージの送受信を行います。
前回
1. ROS2-Unity間の通信
ROS2-Unity間の通信は、Unityの「ROS-TCP-Connector」パッケージと、ROS2の「ROS-TCP-Endpoint」パッケージとを介して行います。
2. ROS2側の準備
ROS2側の準備手順は、次のとおりです。
(1) ポート番号「10000」「5005」を追加して、Dockerイメージを起動。
UnityとROS2の間の通信は、ポート番号「10000」「5005」が必要です。Unityにメッセージファイルをインポートするため、フォルダのマウントも行っています。
$ docker run -v ~/ros2_ws:/home/ubuntu/colcon_ws:cached -p 6080:80 -p 10000:10000 -p 5005:5005 --shm-size=1024m tiryoh/ros2-desktop-vnc:galactic
(2) 「helloパッケージ」の準備。
「ROS入門 (11) - ROS2のトピックによる通信」と同様です。
(3) 「ROS-TCP-Endpoint」パッケージのインストール。
「main-ros2」ブランチの「ROS-TCP-Endpoint」を使います。
$ cd ~/colcon_ws/src
$ git clone -b main-ros2 https://github.com/Unity-Technologies/ROS-TCP-Endpoint
$ cd ..
$ colcon build
$ source ~/colcon_ws/install/setup.bash
3. Unity側の準備
Unity側の準備手順は、次のとおりです。
3-1. ROS-TCP-Connectorのインストール
「ROS-TCP-Connector」のインストール手順は、次のとおりです。
(1) Unity 2020.2以降で、Unityプロジェクトを3Dテンプレートで作成。
(2) Unityのメニュー「Window → Package Manager」で「Package Manager」を開き、「+ → Add package from git URL....」で以下のURLを入力し、「Add」ボタンを押す。
https://github.com/Unity-Technologies/ROS-TCP-Connector.git?path=/com.unity.robotics.ros-tcp-connector
「ROS-TCP-Connector」がインストールされます。
3-2. ROS2の設定の確認
ROS2の設定を確認します。
(1) Unityのメニュー「Robotics → ROS Settings」を選択。
以下の設定であることを確認します。
オプションの意味は、次のとおりです。
3-3. メッセージのインポート
メッセージのUnityへのインポート手順は、次のとおりです。
(1) Unityのメニュー「Robotics → Generate ROS Messages...」を選択。
(2) 「ROS message path」に「colcon_ws/src」を選択。
「ROS入門 (11) - ROS2のトピックによる通信」で作成したワークスペースになります。
ワークスペース内のメッセージ一覧が表示されます。
(3) 「MyString.msg」の「Build msg」をクリック。
「MyString.msg」はC#スクリプト「MyStringMsg」に変換され、Projectウィンドウの「RosMessages」出力されます。
3-4. パブリッシャーとサブスクライバーの実装
パブリッシャーとサブスクライバーの実装手順は、次のとおりです。
◎ パブリッシャーの実装
(1) Hierarchyウィンドウの「+ → Create Empty」で空のGameObjectを作成し、「Publisher」と名前を指定。
(2) 「Publisher」に新規スクリプト「ChatterPublisher」を追加し、以下のように編集。
using UnityEngine;
using Unity.Robotics.ROSTCPConnector;
using MyStringMsg = RosMessageTypes.HelloInterfaces.MyStringMsg;
public class ChatterPublisher : MonoBehaviour
{
private ROSConnection ros;
// 初期化時に呼ばれる
void Start()
{
// ROSコネクションへのパブリッシャーの登録
ros = ROSConnection.instance;
ros.RegisterPublisher<MyStringMsg>("chatter");
}
// フレーム毎に呼ばれる
void FixedUpdate()
{
// メッセージの送信
MyStringMsg msg = new MyStringMsg("Hello Unity!");
ros.Send("chatter", msg);
}
}
◎ サブスクライバーの実装
(1) Hierarchyウィンドウの「+ → Create Empty」で空のGameObjectを作成し、「Subscriber」と名前を指定。
(2) 「Subscriber」に新規スクリプト「ChatterSubscriber」を追加し、以下のように編集。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Robotics.ROSTCPConnector;
using MyStringMsg = RosMessageTypes.HelloInterfaces.MyStringMsg;
public class ChatterSubscriber : MonoBehaviour{
void Start(){
// ROSコネクションへのサブスクライバーの登録
ROSConnection.instance.Subscribe<MyStringMsg>("chatter", Callback);
}
void Callback(MyStringMsg msg){
Debug.Log(msg.data);
}
}
4. 実行
実行手順は、次のとおりです。
◎ ROS2側の準備
(1) ターミナルを開き、エンドポイントを実行。
$ ros2 run ros_tcp_endpoint default_server_endpoint --ros-args -p ROS_IP:=0.0.0.0
◎ UnityからROSへのメッセージ送信
(1) Unityの「Publisher」をアクティブ、「Subscriber」を非アクティブにして、Playボタンで実行。
ROS2との接続に成功した場合は、左上の「ROS IP」の矢印が青くなります。
(2) ROS2でターミナルを開き、「listener」を実行。
$ ros2 run hello listener
[INFO] [1637364640.078955]: Subscribe Hello Unity!
[INFO] [1637364640.084934]: Subscribe Hello Unity!
[INFO] [1637364640.090199]: Subscribe Hello Unity!
◎ ROS2からUnityへのメッセージ送信
(1) Unityの「Publisher」を非アクティブ、「Subscriber」をアクティブにして、Playボタンで実行。
(2) ROS2でターミナルを開き、「talker」を実行。
$ ros2 run hello talker
Unityのコンソールを見ると、ログが出力されています。
Hello World!
Hello World!
Hello World!
:
次回
この記事が気に入ったらサポートをしてみませんか?