メインコンテンツ

rossubscriber

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

説明

rossubscriber を使用して、ROS ネットワーク上でメッセージを受信するための ROS サブスクライバーを作成します。メッセージを送信するには、rospublisher を使用します。ROS ネットワークでのメッセージのパブリッシュに合わせて継続的にメッセージを受信する最も信頼性の高い方法は、rossubscriber オブジェクトのコールバックを作成する方法です。詳細については、コールバック関数を使用するサブスクライバーの作成を参照してください。あるいは、新しい 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" とスカラーからなるコンマ区切りのペアとして指定します。コールバックの処理を上回る速度でメッセージが到着する場合、受信キューが一杯になるとメッセージが削除されます。

MATLAB では、既定の再帰限界値 500 が設定されています。したがって、500 よりも大きいバッファー サイズ値 N を指定する場合は、次のコードを使用して、MATLAB の再帰限界値を N に変更する必要があります。

set(0,'RecursionLimit',N)
使用可能なスタック領域を超過するような過度に大きい再帰限界値を指定しないようにしてください。

コールバック プロパティ。関数ハンドルまたは 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 メッセージ構造体を参照してください。

オブジェクト関数

receive新しい ROS メッセージを待機
rosmessageROS メッセージの作成

すべて折りたたむ

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

rosinit
Launching ROS Core...
Status before launching ros core :0
result before launching ros core: Microsoft.Management.Serv     2068 Services                   0    109,360 K
Microsoft.SharePoint.exe      9248 Console                    1    376,460 K

......Done in 7.1031 seconds.
* Inside getProcessPID function *
Process Name: rosmaster  - rosmaster  --core -p 54700 -w 3
Status before getting PID :0
Result before getting PID :Microsoft.Management.Serv     2068 Services                   0    109,328 K
Microsoft.SharePoint.exe      9248 Console                    1    376,460 K
WindowsTerminal.exe          10860 Console                    1     70,124 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,016 K

Result: 
WindowsTerminal.exe          10860 Console                    1     70,128 K

Status: 0
PID obtained: 10860
Status after getting PID :0
Result after getting PID :Microsoft.Management.Serv     2068 Services                   0    109,328 K
Microsoft.SharePoint.exe      9248 Console                    1    376,460 K
WindowsTerminal.exe          10860 Console                    1     70,128 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,016 K

* Exiting getProcessPID function *
Status after launching ros core :0
result after launching ros core: Microsoft.Management.Serv     2068 Services                   0    109,356 K
Microsoft.SharePoint.exe      9248 Console                    1    376,460 K
WindowsTerminal.exe          10860 Console                    1     70,128 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,016 K

Status before deleting node :0
Result before deleting node :Microsoft.Management.Serv     2068 Services                   0    109,360 K
Microsoft.SharePoint.exe      9248 Console                    1    376,460 K
WindowsTerminal.exe          10860 Console                    1     70,128 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,124 K
libmwros1server.exe          21352 Console                    1     29,488 K

Status after deleting node :0
Result after deleting node :Microsoft.Management.Serv     2068 Services                   0    109,356 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,128 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,084 K

Initializing ROS master on http://172.31.78.36:54700.
Initializing global node /matlab_global_node_41904 with NodeURI http://vdi-ah2wsp-001:64594/ and MasterURI http://localhost:54700.
exampleHelperROSCreateSampleNetwork

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

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

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

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

status = logical
   1

statustext = 
'success'

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

exampleHelperROSShutDownSampleNetwork
Status before deleting node :0
Result before deleting node :Microsoft.Management.Serv     2068 Services                   0    109,360 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,316 K
libmwros1server.exe          12768 Console                    1     32,476 K
libmwros1server.exe          16724 Console                    1     33,272 K
libmwros1server.exe           8552 Console                    1     33,128 K
libmwros1server.exe          10272 Console                    1     32,844 K

Status after deleting node :0
Result after deleting node :Microsoft.Management.Serv     2068 Services                   0    109,328 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,276 K
libmwros1server.exe          12768 Console                    1     32,480 K
libmwros1server.exe           8552 Console                    1     33,128 K
libmwros1server.exe          10272 Console                    1     32,844 K

Status before deleting node :0
Result before deleting node :Microsoft.Management.Serv     2068 Services                   0    109,328 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,276 K
libmwros1server.exe          12768 Console                    1     32,500 K
libmwros1server.exe           8552 Console                    1     33,128 K
libmwros1server.exe          10272 Console                    1     32,844 K

Status after deleting node :0
Result after deleting node :Microsoft.Management.Serv     2068 Services                   0    109,356 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,236 K
libmwros1server.exe          12768 Console                    1     32,500 K
libmwros1server.exe          10272 Console                    1     32,844 K

Status before deleting node :0
Result before deleting node :Microsoft.Management.Serv     2068 Services                   0    109,356 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     30,236 K
libmwros1server.exe          12768 Console                    1     32,500 K
libmwros1server.exe          10272 Console                    1     32,844 K

Status after deleting node :0
Result after deleting node :Microsoft.Management.Serv     2068 Services                   0    109,356 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     31,448 K
libmwros1server.exe          12768 Console                    1     32,552 K

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

rosshutdown
Shutting down global node /matlab_global_node_41904 with NodeURI http://vdi-ah2wsp-001:64594/ and MasterURI http://localhost:54700.
Status before deleting node :0
Result before deleting node :Microsoft.Management.Serv     2068 Services                   0    109,356 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     31,448 K
libmwros1server.exe          12768 Console                    1     32,576 K

Status after deleting node :0
Result after deleting node :Microsoft.Management.Serv     2068 Services                   0    109,328 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     31,408 K

Shutting down ROS master on http://172.31.78.36:54700.
Status before deleting core :0
Result before deleting core :Microsoft.Management.Serv     2068 Services                   0    109,328 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K
WindowsTerminal.exe          10860 Console                    1     70,132 K
rosmaster.exe                21056 Console                    1      4,968 K
python.exe                   19980 Console                    1      4,736 K
python.exe                   13016 Console                    1     31,420 K

* Inside killROSProcess function *
Status after Process Killed: 0
Result after Process Killed: SUCCESS: Sent termination signal to the process with PID 10860.

Status after deleting core :0
Result after deleting core :Microsoft.Management.Serv     2068 Services                   0    109,328 K
Microsoft.SharePoint.exe      9248 Console                    1    376,580 K

* Exiting killROSProcess function *

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

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

rosinit
Launching ROS Core...
Done in 0.83117 seconds.
Initializing ROS master on http://172.30.10.237:50765.
Initializing global node /matlab_global_node_43883 with NodeURI http://dcc2206601glnxa64:44721/ and MasterURI http://localhost:50765.

'/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_43883 with NodeURI http://dcc2206601glnxa64:44721/ and MasterURI http://localhost:50765.
Shutting down ROS master on http://172.30.10.237:50765.

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

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

master = ros.Core;
Launching ROS Core...
Done in 0.77655 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 で導入

すべて展開する