![見出し画像](https://assets.st-note.com/production/uploads/images/66045568/rectangle_large_type_2_b274e984c15d5e37763a2ff7dc47ff73.png?width=800)
ROS入門 (16) - ROS-Unity間のトピックによる通信
「ROS-TCP-Connector」と「ROS-TCP-Endpoint」によるROS-Unity間のトピックによる通信の手順をまとめました。
・Melodic
・Unity 2020.3
・ROS-TCP-Connector 0.6.0
・ROS-TCP-Endpoint 0.5.0
「ROS入門 (10) - ROS1のトピックによる通信」で作成したhelloパッケージの「talker」「listener」とUnityのメッセージの送受信を行います。
前回
1. ROS-Unity間の通信
ROS-Unity間の通信は、Unityの「ROS-TCP-Connector」パッケージと、ROSの「ROS-TCP-Endpoint」パッケージとを介して行います。
![画像5](https://assets.st-note.com/production/uploads/images/66034888/picture_pc_9b8923963883b6c344702270bb58f628.png?width=800)
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」がインストールされます。
![画像1](https://assets.st-note.com/production/uploads/images/66031462/picture_pc_8de2c4a0312e25d4eb890fe3f7dd4b1b.png?width=800)
3-2. ROSの設定の確認
ROSの設定を確認します。
(1) Unityのメニュー「Robotics → ROS Settings」を選択。
![画像5](https://assets.st-note.com/production/uploads/images/66032365/picture_pc_17865245124636be59d33d2645a28e5d.png?width=800)
以下の設定であることを確認します。
・Connect on Startup : True
・Protocol : ROS1
・ROS IP Address : 127.0.0.1
・ROS Port : 10000
・Show HUD : True
・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」に「catkin_ws/src」を選択。
「ROS入門 (10) - ROS1のトピックによる通信」で作成したワークスペースになります。
ワークスペース内のメッセージ一覧が表示されます。
![画像2](https://assets.st-note.com/production/uploads/images/66031835/picture_pc_fd1aa01ceeb419935bc43e0503028054.png?width=800)
(3) 「MyString.msg」の「Build msg」をクリック。
「MyString.msg」はC#スクリプト「MyStringMsg」に変換され、Projectウィンドウの「RosMessages」出力されます。
![画像3](https://assets.st-note.com/production/uploads/images/66031900/picture_pc_c47e3c1ce8607c4bbf865d013a5a35b0.png?width=800)
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の矢印が青く表示されています。
![画像6](https://assets.st-note.com/production/uploads/images/66035662/picture_pc_9e7cbec1610405937f9ae407d4a4be3f.png?width=800)
(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. 参考
次回
この記事が気に入ったらサポートをしてみませんか?