環境
この記事は以下の環境で動いています。
項目 | 値 |
---|---|
CPU | Core i5-8250U |
Ubuntu | 18.04 |
ROS | Melodic |
Gazebo | 9.0.0 |
python | 2.7.17 |
Unityの動作環境は以下です。
項目 | 値 |
---|---|
ホストマシン | Windows10 |
Unity | 2019.4 |
インストールについてはROS講座02 インストールを参照してください。
またこの記事のプログラムはgithubにアップロードされています。ROS講座11 gitリポジトリを参照してください。
概要
今までUnityのROS#でROSと標準で用意されているmsg(geometry_msgs、sensor_msgsなど)の型をやり取りしてきました。今回は独自に作成したROSの型で通信を行ってみます。
ROS#で標準で用意されている型の確認方法
std_msgsなどの標準の型も定義ファイルがあるのですが、すべてビルドされてDLLになっています。ソースはROS#のリポジトリで確認できます。
独自の型を使う
使い方としてまず独自の型の定義ファイルを生成して、それをスクリプトで使用します。リンクのチュートリアルにあるように、このファイルの生成方法は何通りかあるのですが、ROS#に付属のGUIを使って生成していきます。今回はROS講座で使っているros_lecture_msgs
パッケージのCustom.msg
を変換して使用します。
msgの定義ファイルの生成
-
msgファイルが入っているROSパッケージをWindowsにコピーします。
-
メニューバーの「RosBridgeClient」->「Auto Generate Message」->「Package Message」を選択します。
-
出てくるGUIでPackage PathとPackage Nameを正確に入れます。
-
「Generate」を押します。この時に警告が出ますがとりあえず無視します。
- 「Assets/RosSharpMessages/RosLecture/msg/Custom.cs」が生成されます。
上記のファイルの使い方
上記のCustom.msgをUnity側からPublishしていきます。
スクリプトの作成
以下のようなスクリプトを作成します
using UnityEngine;
namespace RosSharp.RosBridgeClient
{
public class CustomPublisher : UnityPublisher<MessageTypes.RosLecture.Custom>
{
protected override void Start()
{
RosConnector ros_connector = GetComponent<RosConnector>();
ros_connector.IsConnected.WaitOne(ros_connector.SecondsTimeout * 1000);
base.Start();
}
private void FixedUpdate()
{
MessageTypes.RosLecture.Custom message;
message = new MessageTypes.RosLecture.Custom();
message.word = "custom msg";
message.number = 42;
Publish(message);
}
}
}
- メッセージの型はMessageTypes.RosLecture.CustomのようにMessageTypes.{パッケージ名から_msgsを抜いてキャメルケースにしたもの}.{msg名}になります。
- あとは標準のmsgと同じように
Publish()
でpublishができます。
スクリプトのアタッチ
- 空のゲームオブジェクトを生成します。
- これに
Assets/RosSharp/Scripts/RosBridgeClient/RosCommuncation/RosConnector.cs
をアタッチ、urlを記入します。 - 上記で作った
scripts/CustomPublisher.cs
をアタッチ、topicを記入します。
実行
- ROS(Ubuntu)側では以下のように実行します。
roslaunch rosbridge_server rosbridge_websocket.launch
- Unityの「Play」ボタンを押します。
するとROS側で以下のようにSubscribeできます。
$ rostopic echo /custom
word: "custom msg"
number: 42