見出し画像

ROS入門 (41) - ROS2-Unity間のトピックによる通信

「ROS-TCP-Connector」と「ROS-TCP-Endpoint」によるROS2-Unity間のトピックによる通信の手順をまとめました。

・Galactic
・Unity 2020.3
・ROS-TCP-Connector 0.6.0
・ROS-TCP-Endpoint 0.5.0

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」を選択。

以下の設定であることを確認します。

・Connect on Startup : True
・Protocol : ROS2
・ROS IP Address : 127.0.0.1
・ROS Port : 10000
・Show HUD : True
・KeepAlive time (secs) : 1
・Network timeout (secs) : 2
・Sleep time (secs) : 0.01

オプションの意味は、次のとおりです。

・KeepAlive time (secs) : 指定秒数以上他のメッセージが送信されていない場合は、頻繁に接続をテストする。この時間が長いほど、ROSConnectionがエンドポイントが応答を停止したことを認識するのにかかる時間が長くなる。
・Network timeout (secs) : 指定秒数以上メッセージの送信にかかる場合は、接続失敗とみなす。この時間が長いほど、ROSConnectionがエンドポイントが応答を停止したことを認識するのにかかる時間が長くなる。
・Sleep time (secs) : 新しいメッセージをチェックする前に、スリープする秒数。この時間を減らすと、応答が速くなるが、より多くのCPUを消費。

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!
   :

次回



この記事が気に入ったらサポートをしてみませんか?