主要内容

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

ROS のパブリッシャーおよびサブスクライバーとのデータ交換

ROS ノードがデータを交換するための主なメカニズムは、"メッセージ"を送受信することです。メッセージは "トピック"上で送信され、各トピックは ROS ネットワーク内で一意の名前をもちます。あるノードが情報を共有する場合、そのノードは "パブリッシャー"をを用してデータをトピックに送信します。その情報を受信するノードは、同じトピックの "サブスクライバー"を使用します。各トピックには一意の名前の他に "メッセージ タイプ"もあり、そのトピックで送信可能なメッセージのタイプが決まります。

このパブリッシャーとサブスクライバーの通信には,次のような特性があります。

  • トピックは多重多の通信ににさトピックにメッセージを送,多数のサブスクライバーそれらを信できますをを受できますをを受できますをを信できサブスクライバーそれら

  • パブリッシャーとサブスクライバーはトピックトピックされ,任意の顺序でないますます。

トピック,パブリッシャーパブリッシャーおよびサブスクライバーののを次の図に示し

この例では、ROS ネットワーク内でトピックにパブリッシュおよびサブスクライブする方法を説明します。また、次の方法も示します。

  • 新しいメッセージを受信するまで待機する

  • コールバックを使用して、新しいメッセージをバックグラウンドで処理する

前提条件:ROS 入門ROS ネットワークへの接続

サブスクライブしてメッセージを待つ

罗斯尼特コマンドコマンド使使用ししmatlab®でrosマスターを起起ます。

罗斯尼特
Launching ROS Core... .Done in 1.7048 seconds. Initializing ROS master on http://192.168.0.10:60945. Initializing global node /matlab_global_node_09828 with NodeURI http://dcc464535glnxa64:43497/

提供された補助関数exampleHelperROSCreateSampleNetwork.をを用して、複数のパブリッシャーおよびサブスクライバーを含むサンプルの ROS ネットワークを作成します。

exampleHelperROSCreateSampleNetwork

叛逆listをを使し,可用可致なを确认ますますます。

叛逆list
/姿势/rosout /scan /tf

叛逆infoをを用して、/扫描トピックトピックにパブリッシュしいるがあるかどうかチェックします以以ししコマンド以ししコマンドnode_3がパブリッシュしていることを示しています。

叛逆info/扫描
类型:Sensor_msgs / Laserscan发布商:* / node_3(http:// dcc464535glnxa64:35697 /)订阅者:* / node_1(http:// dcc464535glnxa64:40173 /)* / node_2(http:// dcc464535glnxa64:38245 /)

rossubscriberをを用して/扫描トピックをサブスクライブします。このケースのように,rosネットワーク内にトピックが既にする场场料,メッセージタイプはrossubscriberで自動的に検出されるため、指定する必要はありません。メッセージを struct 形式で使用すると効率性が向上します。

laser = rossubscriber("/scan","DataFormat",“结构”);暂停(2)

receiveをを用して新しいメッセージを待ちます (2 番目の引数は秒単位のタイムアウト)。出力斯堪的数据に,诚信したメッセージが含まれます。

Scandata =接收(激光,10)
斯堪的数据=struct with fields:MessageType: 'sensor_msgs/LaserScan' Header: [1x1 struct] AngleMin: -0.5467 AngleMax: 0.5467 AngleIncrement: 0.0017 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10 Ranges: [640x1 single] Intensities: []

一部のメッセージ タイプには、可視化機能が関連付けられています。LaserScan メッセージの場合は、ROSPOT.がスキャン データをプロットします。MaximumRangeの名前と値のペアは、最大プロット範囲を指定します。

figure rosPlot(scandata,"MaximumRange"7)

图的tains an axes object. The axes object with title Laser Scan contains an object of type line.

コールバック関数を使用したサブスクライブ

receiveをを使しててをする代わりに,新しいメッセージを函数したとき呼び出さ关键词指定によりますますますますますますますますますいるに他のmatlabコードを実行のサブスクライバーを使使用するする合,コールバックが不可能です。

コールバック関数exampleHelperROSPoseCallbackをを用して、/姿势トピックをサブスクライブします。

robotpose = rossubscriber("/pose",@exampleHelperROSPoseCallback,"DataFormat",“结构”)
robotpose = Subscriber with properties: TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' BufferSize: 1 NewMessageFcn: @exampleHelperROSPoseCallback DataFormat: 'struct'

メインのワークスペースとコールバック関数の間でデータを共有する方法の 1 つは、グローバル変数を使用することです。2 つのグローバル変数pos东方を定義します。

globalposglobal东方

グローバル変数posおよび东方/姿势トピックで新しいメッセージ データが受信されたときに、関数exampleHelperROSPoseCallback内で代入されます。

数秒間待機して、サブスクライバーがメッセージを受信できることを確認します。変数posおよび东方には、常に最新の位置と向きのデータが保存されます。

暂停(2)pos
pos =1×3-0.0242 -0.0091 0.0095
东方
东方=1×3-0.0238 0.0103 0.0211

コマンド ラインでpos东方を数回入力すると、値が継続的に更新されることを確認できます。

サブスクライバーサブスクライバー数をクリアして姿势サブスクライバーサブスクライバーをを停止し

清除robotpose

メモ:グローバルグローバル数をも,コールバック关键词がが抽出,ハンドルオブジェクトオブジェクトますますコールバック关键词关键词たとえば关键はコールバック定義ドキュメンテーションを参照してください。

メッセージのパブリッシュ

ROS 文字列メッセージを/chatterトピックに送信するパブリッシャーを作成します (Work with Basic ROS Messagesを参照)。

chatterpub = rospublisher("/chatter","std_msgs/String","DataFormat",“结构”)
chatterpub = Publisher with properties: TopicName: '/chatter' NumSubscribers: 0 IsLatching: 1 MessageType: 'std_msgs/String' DataFormat: 'struct'
暂停(2)% Wait to ensure publisher is registered

/chatterトピックに送信する ROS メッセージを作成して入力します。

Chattermsg = Rosmessage(Chatterpub);chattermsg.data ='hello world'
chattermsg =struct with fields:MessageType:'std_msgs / string'数据:'hello world'

叛逆listをを用して、ROS ネットワークで/chatterトピックが使用可能であることを確認します。

叛逆list
/chatter /pose /rosout /scan /tf

/chatterトピックのサブスクライバーを定义します。新しいメッセージをを信するとexampleHelperROSChatterCallbackが呼び出され、メッセージ内の文字列の内容が表示されます。

chattersub = rossubscriber("/chatter",@exampleHelperROSChatterCallback,"DataFormat",“结构”)
chattersub = Subscriber with properties: TopicName: '/chatter' LatestMessage: [] MessageType: 'std_msgs/String' BufferSize: 1 NewMessageFcn: @exampleHelperROSChatterCallback DataFormat: 'struct'

/chatterトピックにメッセージをパブリッシュします。サブスクライバーのコールバックによって文字列が表示されます。

发送(Chatterpub,Chattermsg)暂停(2)
ans = 'hello world'

文字列メッセージをパブリッシュするとすぐに、関数exampleHelperROSChatterCallbackが呼び出されました。

ROSネットワークネットワークのシャット

サンプルノード,パブリッシャーおよびサブスクライバーをrosネットワークから削除し。posおよび东方.をクリアします。

examplehelperrosshutdownsamplenetwork清晰globalpos东方

ROS マスターをシャットダウンしてグローバル ノードを削除します。

rosshutdown
Shutting down global node /matlab_global_node_09828 with NodeURI http://dcc464535glnxa64:43497/ Shutting down ROS master on http://192.168.0.10:60945.

次のステップ