ROS入門 (16) - ROS-Unity間のトピックによる通信
「ROS-TCP-Connector」と「ROS-TCP-Endpoint」によるROS-Unity間のトピックによる通信の手順をまとめました。
「ROS入門 (10) - ROS1のトピックによる通信」で作成したhelloパッケージの「talker」「listener」とUnityのメッセージの送受信を行います。
前回
1. ROS-Unity間の通信
ROS-Unity間の通信は、Unityの「ROS-TCP-Connector」パッケージと、ROSの「ROS-TCP-Endpoint」パッケージとを介して行います。
2. ROS側の準備
ROS側の準備手順は、次のとおりです。
(1) ポート番号「10000」「5005」を追加して、Dockerイメージを起動。
UnityとROSの間の通信は、ポート番号「10000」「5005」が必要です。Unityにメッセージファイルをインポートするため、フォルダのマウントも行っています。
$ docker run -p 6080:80 -p 10000:10000 -p 5005:5005 --shm-size=1024m tiryoh/ros-desktop-vnc:melodic
(2) 「helloパッケージ」の準備。
「ROS入門 (10) - ROS1のトピックによる通信」と同様です。
(3) 「ROS-TCP-Endpoint」パッケージのインストール。
$ cd ~/catkin_ws/src
$ git clone https://github.com/Unity-Technologies/ROS-TCP-Endpoint
$ cd ..
$ catkin build
$ source ~/catkin_ws/devel/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. ROSの設定の確認
ROSの設定を確認します。
(1) Unityのメニュー「Robotics → ROS Settings」を選択。
以下の設定であることを確認します。
3-3. メッセージのインポート
メッセージのUnityへのインポート手順は、次のとおりです。
(1) Unityのメニュー「Robotics → Generate ROS Messages...」を選択。
(2) 「ROS message path」に「catkin_ws/src」を選択。
「ROS入門 (10) - ROS1のトピックによる通信」で作成したワークスペースになります。
ワークスペース内のメッセージ一覧が表示されます。
(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.Hello.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.Hello.MyStringMsg;
public class ChatterSubscriber : MonoBehaviour{
void Start(){
// ROSコネクションへのサブスクライバーの登録
ROSConnection.instance.Subscribe<MyStringMsg>("chatter", Callback);
}
void Callback(MyStringMsg msg){
Debug.Log(msg.data);
}
}
4. 実行
実行手順は、次のとおりです。
◎ ROS側の実行
(1) ターミナルを開き、「roscore」を実行。
$ roscore
(2) もう1つのターミナルを開き、ROSのIPとポートを指定して、「ROS-TCP-Endpoint」を実行。
$ rosparam set ROS_IP 0.0.0.0
$ rosparam set ROS_TCP_PORT 10000
$ rosrun ros_tcp_endpoint default_server_endpoint.py
(3) もう1つのターミナルを開き、「listener」を実行。
$ rosrun hello listener.py
◎ UnityからROSへのメッセージ送信
(1) Unityの「Publisher」をアクティブ、「Subscriber」を非アクティブにして、Playボタンで実行。
ROSとの接続が成功している場合は画面上のROSの矢印が青く表示されています。
(2) ROSでターミナルを開き、「listener」を実行。
$ rosrun hello listener.py
[INFO] [1637364640.078955]: Subscribe Hello Unity!
[INFO] [1637364640.084934]: Subscribe Hello Unity!
[INFO] [1637364640.090199]: Subscribe Hello Unity!
◎ ROSからUnityへのメッセージ送信
(1) Unityの「Publisher」を非アクティブ、「Subscriber」をアクティブにして、Playボタンで実行。
(2) ROSでターミナルを開き、「talker」を実行。
$ rosrun hello talker.py
Unityのコンソールを見ると、ログが出力されています。
Hello World!
Hello World!
Hello World!
:
5. 参考
次回
この記事が気に入ったらサポートをしてみませんか?