最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

rossubscriber

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

説明

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

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

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

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

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

作成

構文

sub = rossubscriber(topicname)
sub = rossubscriber(topicname,msgtype)
sub = rossubscriber(topicname,callback)
sub = rossubscriber(topicname, msgtype,callback)
sub = rossubscriber(___,Name,Value)
sub = robotics.ros.Subscriber(node,topicname)
sub = robotics.ros.Subscriber(node,topicname,msgtype)
sub = robotics.ros.Subscriber(node,topicname,callback)
sub = robotics.ros.Subscriber(node,topicname,type,callback)
sub = robotics.ros.Subscriber(___,"BufferSize",value)

説明

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

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

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

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

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

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

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

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

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

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

プロパティ

すべて展開する

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

サブスクライブされるトピックの名前。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};

オブジェクト関数

receiveWait for new ROS message
rosmessageCreate ROS messages

すべて折りたたむ

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

rosinit
Initializing ROS master on http://bat5216glnxa64:42145/.
Initializing global node /matlab_global_node_53964 with NodeURI http://bat5216glnxa64:44351/
exampleHelperROSCreateSampleNetwork

'/scan' トピックのサブスクライバーを作成します。サブスクライバーがマスターに登録するまで待機します。

sub = rossubscriber('/scan');
pause(1);

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

msg2 = receive(sub,10)
msg2 = 
  ROS LaserScan message with properties:

       MessageType: 'sensor_msgs/LaserScan'
            Header: [1x1 Header]
          AngleMin: -0.5216
          AngleMax: 0.5243
    AngleIncrement: 0.0016
     TimeIncrement: 0
          ScanTime: 0.0330
          RangeMin: 0.4500
          RangeMax: 10
            Ranges: [640x1 single]
       Intensities: [0x1 single]

  Use showdetails to show the contents of the message

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

rosshutdown
Shutting down global node /matlab_global_node_53964 with NodeURI http://bat5216glnxa64:44351/
Shutting down ROS master on http://bat5216glnxa64:42145/.

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

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

rosinit
Initializing ROS master on http://bat5225glnxa64:37339/.
Initializing global node /matlab_global_node_63781 with NodeURI http://bat5225glnxa64:34053/

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

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

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

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

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

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

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

rosshutdown
Shutting down global node /matlab_global_node_63781 with NodeURI http://bat5225glnxa64:34053/
Shutting down ROS master on http://bat5225glnxa64:37339/.

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

ROS マスターおよびノードを起動します。

master = robotics.ros.Core;
node = robotics.ros.Node('/test');

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

pub = robotics.ros.Publisher(node,'/chatter','std_msgs/String');
pause(1)
sub = robotics.ros.Subscriber(node,'/chatter','std_msgs/String');

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

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

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

pause(1)
sub.LatestMessage
ans = 
  ROS String message with properties:

    MessageType: 'std_msgs/String'
           Data: 'hello world'

  Use showdetails to show the contents of the message

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

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

R2015a で導入