Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

rossubscriber

トピック上のメッセージをサブスクライブ

説明

rossubscriber を使用して、ROS ネットワーク上でメッセージを受信するための ROS サブスクライバーを作成します。メッセージを送信するには、rospublisher を使用します。新しい ROS メッセージを待機するには、関数 receive を、作成したサブスクライバーと共に使用します。

関数 rossubscriber によって作成された Subscriber オブジェクトは、ROS ネットワーク上のサブスクライバーを表します。Subscriber オブジェクトは、使用可能なトピックまたは自ら作成したトピックをサブスクライブします。このトピックにはメッセージ タイプが関連付けられています。パブリッシャーは、Subscriber オブジェクトが受信するメッセージをネットワーク経由で送信できます。

メモ

将来のリリースでは、ROS Toolbox は ROS メッセージ用のオブジェクトではなくメッセージ構造体を使用します。

現時点でメッセージ構造体を使用する場合、名前と値の引数 "DataFormat""struct" に設定します。詳細については、ROS メッセージ構造体を参照してください。

Subscriber オブジェクトは、関数 rossubscriber を使用するか、ros.Subscriber を呼び出すことによって作成できます。

  • rossubscriber は、rosinit を使用するグローバル ノードでのみ機能します。引数としてノード オブジェクト ハンドルは必要ありません。

  • ros.Subscriber は、ros.Node を使用して作成された追加のノードで機能します。最初の引数としてノード オブジェクト ハンドルが必要です。

作成

説明

sub = rossubscriber(topicname) は、指定された TopicName をもつトピックをサブスクライブします。トピックは、確立されたメッセージ タイプと共に ROS マスターのトピック リスト上に既に存在しなければなりません。ROS ノードがそのトピック上にメッセージをパブリッシュすると、MATLAB® はこのサブスクライバーを通してそれらのメッセージを受信します。

sub = rossubscriber(topicname,msgtype) は、指定された名前 TopicName とタイプ MessageType をもつトピックをサブスクライブします。ROS マスター上のトピックに、指定された名前とタイプのトピックが含まれていない場合、該当するトピックがトピック リストに追加されます。この構文を使用すると、パブリッシャーが ROS マスター上のトピック リストにトピックを追加する前にそのトピックをサブスクライブしたときのエラーを回避できます。

sub = rossubscriber(topicname,callback) は、サブスクライバー オブジェクト ハンドルがトピック メッセージを受信したときに実行されるコールバック関数 callback を指定します。この構文を使用して、ブロッキング受信関数を回避します。関数 callback は 1 つの関数ハンドルまたは cell 配列にすることができます。cell 配列の最初の要素は、関数ハンドル、または関数の名前を含む string でなければなりません。cell 配列の残りの要素には、コールバック関数に渡される任意のユーザー データを指定できます。

sub = rossubscriber(topicname, msgtype,callback) は、コールバック関数を指定して、指定された名前 TopicName とタイプ MessageType をもつトピックをサブスクライブします。

sub = rossubscriber(___,Name,Value) は、これまでの構文のいずれかの引数を使用して 1 つ以上の Name,Value ペア引数によって指定された追加オプションを提供します。Name はプロパティ名で、Value は対応する値です。

sub = rossubscriber(___,"DataFormat","struct") はオブジェクトではなくメッセージ構造体を使用します。詳細については、ROS メッセージ構造体を参照してください。

sub = ros.Subscriber(node,topicname) は、TopicName という名前のトピックをサブスクライブします。node は、このパブリッシャーの接続先の ros.Node オブジェクト ハンドルです。

sub = ros.Subscriber(node,topicname,msgtype) は、トピックのメッセージ タイプ MessageType を指定します。名前が同じでメッセージ タイプが異なるトピックが存在する場合、MATLAB は、指定されたメッセージ タイプで新しいトピックを作成します。

sub = ros.Subscriber(node,topicname,callback) は、サブスクライバー オブジェクトがトピック メッセージを受信したときに実行するコールバック関数とオプションのデータを指定します。コールバック関数の詳細については、NewMessageFcn を参照してください。

sub = ros.Subscriber(node,topicname,type,callback) は、サブスクライバーのトピック名、メッセージ タイプおよびコールバック関数を指定します。

sub = ros.Subscriber(___,"BufferSize",value) は、受信メッセージのキュー サイズを BufferSize で指定します。この構文では、これまでの入力を任意に組み合わせて使用できます。

sub = ros.Subscriber(___,"DataFormat","struct") はオブジェクトではなくメッセージ構造体を使用します。詳細については、ROS メッセージ構造体を参照してください。

プロパティ

すべて展開する

このプロパティは読み取り専用です。

サブスクライブされるトピックの名前。string スカラーまたは文字ベクトルとして指定します。トピックが存在しない場合、オブジェクトは、関連付けられているメッセージ タイプを使用してトピックを作成します。

例: "/chatter"

データ型: char | string

このプロパティは読み取り専用です。

サブスクライブされるメッセージのメッセージ タイプ。string スカラーまたは文字ベクトルとして指定します。このメッセージ タイプとトピックとの関連付けは維持されます。

例: "std_msgs/String"

データ型: char | string

トピックに最後に送信されたメッセージ。Message オブジェクトとして指定します。Message オブジェクトは、指定された MessageType に固有です。サブスクライバーがメッセージを受信していない場合、Message オブジェクトは空です。

受信メッセージ キューのバッファー サイズ。"BufferSize" とスカラーからなるコンマ区切りのペアとして指定します。コールバックの処理を上回る速度でメッセージが到着する場合、受信キューが一杯になるとメッセージが削除されます。

コールバック プロパティ。関数ハンドルまたは cell 配列として指定します。cell 配列の最初の要素では、関数ハンドル、または関数名を表す string を指定します。それ以降の要素では、ユーザー データを指定します。

サブスクライバーのコールバック関数には、少なくとも 2 つの入力引数が必要です。最初の引数 src は、関連付けられているサブスクライバー オブジェクトです。2 番目の引数 msg は、受信したメッセージ オブジェクトです。コールバックの関数ヘッダーは次のとおりです。

function subCallback(src,msg)

NewMessageFcn プロパティを次のように指定します。

sub.NewMessageFcn = @subCallback;

コールバックを設定するときに、コールバック関数とパラメーターを cell 配列の要素として設定することで、追加パラメーターをコールバック関数に渡します。コールバックの関数ヘッダーは次のとおりです。

function subCallback(src,msg,userData)

NewMessageFcn プロパティを次のように指定します。

sub.NewMessageFcn = {@subCallback,userData};

メッセージ形式。"object" または "struct" として指定します。このプロパティは、作成時に名前と値の入力を使用して設定しなければなりません。詳細については、ROS メッセージ構造体を参照してください。

オブジェクト関数

receiveWait for new ROS message
rosmessageROS メッセージの作成

すべて折りたたむ

ROS ネットワークに接続します。サンプルの ROS ネットワークを設定します。'/scan' トピックはネットワーク上でパブリッシュされています。

rosinit
Launching ROS Core...
Done in 0.96107 seconds.
Initializing ROS master on http://192.168.0.10:53321.
Initializing global node /matlab_global_node_94575 with NodeURI http://bat800603glnxa64:40649/
exampleHelperROSCreateSampleNetwork

メッセージ構造体を使用して、'/scan' トピックのサブスクライバーを作成します。サブスクライバーがマスターに登録するまで待機します。

sub = rossubscriber('/scan','DataFormat','struct');
pause(1);

サブスクライバーから ROS メッセージ構造体としてデータを受信します。10 秒のタイムアウトを指定します。

msg2 = receive(sub,10)
msg2 = struct with fields:
       MessageType: 'sensor_msgs/LaserScan'
            Header: [1x1 struct]
          AngleMin: -0.5216
          AngleMax: 0.5243
    AngleIncrement: 0.0016
     TimeIncrement: 0
          ScanTime: 0.0330
          RangeMin: 0.4500
          RangeMax: 10
            Ranges: [640x1 single]
       Intensities: []

サンプル ネットワークで使用されているタイマーをシャットダウンします。

exampleHelperROSShutDownSampleNetwork

ROS ネットワークをシャットダウンします。

rosshutdown
Shutting down global node /matlab_global_node_94575 with NodeURI http://bat800603glnxa64:40649/
Shutting down ROS master on http://192.168.0.10:53321.

サブスクライバーがメッセージを受信したときにコールバック関数をトリガーできます。コールバックは、作成時、または NewMessageFcn プロパティを使用するときに指定します。

ROS ネットワークに接続します。

rosinit
Launching ROS Core...
Done in 0.91066 seconds.
Initializing ROS master on http://192.168.0.10:54203.
Initializing global node /matlab_global_node_08249 with NodeURI http://bat800603glnxa64:34995/

'/chatter' トピックにメッセージをパブリッシュするパブリッシャーを設定します。このトピックは、サブスクライバーのコールバックをトリガーするために使用されます。メッセージの Data プロパティを指定します。パブリッシャーがネットワークに登録できるように、1 秒間待機します。

pub = rospublisher('/chatter','std_msgs/String','DataFormat','struct');
msg = rosmessage(pub);
msg.Data = 'hello world';
pause(1)

指定したコールバック関数をもつサブスクライバーを設定します。関数 exampleHelperROSChatterCallback は、受信メッセージ内に Data を表示します。

sub = rossubscriber('/chatter',@exampleHelperROSChatterCallback,'DataFormat','struct');
pause(1)

パブリッシャー経由でメッセージを送信します。サブスクライバーは、コールバックを実行して新しいメッセージを表示する必要があります。メッセージが受信されるまで待機します。

send(pub,msg);
pause(1)
ans = 
'hello world'

ROS ネットワークをシャットダウンします。

rosshutdown
Shutting down global node /matlab_global_node_08249 with NodeURI http://bat800603glnxa64:34995/
Shutting down ROS master on http://192.168.0.10:54203.

ROS Subscriber オブジェクトを使用して、ROS ネットワーク経由でメッセージを受信します。

ROS コアおよびノードを起動します。

master = ros.Core;
Launching ROS Core...
Done in 0.74789 seconds.
node = ros.Node('/test');

ROS ネットワーク経由でメッセージを送受信するパブリッシャーとサブスクライバーを作成します。ROS メッセージを構造体として使用します。

pub = ros.Publisher(node,'/chatter','std_msgs/String','DataFormat','struct');
sub = ros.Subscriber(node,'/chatter','std_msgs/String','DataFormat','struct');

ネットワーク経由でメッセージを送信します。

msg = rosmessage(pub);
msg.Data = 'hello world';
send(pub,msg)

Subscriber オブジェクトの LatestMessage プロパティを使用してメッセージ データを表示します。

pause(1)
sub.LatestMessage
ans = struct with fields:
    MessageType: 'std_msgs/String'
           Data: 'hello world'

パブリッシャー、サブスクライバー、および ROS ノードをクリアします。ROS マスターをシャットダウンします。

clear('pub','sub','node')
clear('master')

互換性についての考慮事項

すべて展開する

将来のリリースで動作変更

拡張機能

R2019b で導入