主要内容

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

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

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

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

  • トピックは多対多の通信に使用されます。複数のパブリッシャーが同じトピックにメッセージを送信でき、複数のサブスクライバーがそれらを受信できます。

  • パブリッシャーとサブスクライバーはトピックを通じて分離され、任意の順序で作成および破棄できます。アクティブなサブスクライバーがない場合でも、メッセージをトピックにパブリッシュできます。

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

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

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

前提条件:从ROS 2开始ROS 2ネットワークへの接続

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

複数のパブリッシャーおよびサブスクライバーを含むサンプルのROS 2ネットワークを作成します。

示例HelpErrors2CreateSampleNetwork

ros2主题列表を使用して,使用可能なトピックを確認します。

ros2话题列表
/参数\u事件

/扫描トピックをサブスクライブすると仮定します。ros2subscriberを使用して/扫描トピックをサブスクライブします。ノードの名前をサブスクライバーで指定します。活性氧2ネットワーク内にトピックが既に存在する場合、メッセージ タイプはros2subscriberで自動的に検出されるため,指定する必要はありません。

detectNode = ros2node (“/检测”); 暂停(2)laserSub= ros2subscriber(detectNode,“/扫描”); 暂停(2)

收到を使用して新しいメッセージを待ちます。タイムアウトを10秒に指定します。出力scanDataに,受信したメッセージデータが含まれます。

scanData =接收(laserSub, 10);

これで、サブスクライバーlaserSubとそれに関連付けられたノードを削除できます。

清楚的laserSub清楚的detectNode

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

收到を使用してデータを取得する代わりに,新しいメッセージを受信したときに呼び出される関数を指定できます。これにより,サブスクライバーが新しいメッセージを待っている間に他のMATLABコードを実行できます。複数のサブスクライバーを使用する場合は,コールバックが不可欠です。

受信したメッセージを入力として受け取るコールバック関数exampleHelperROS2PoseCallbackを使用して,/构成トピックをサブスクライブします。メインのワークスペースとコールバック関数の間でデータを共有する方法の1つは,グローバル変数を使用することです。2つのグローバル変数pos东方を定義します。

controlNode = ros2node (“/ base_station”);poseSub = ros2subscriber (controlNode,“/姿势”, @exampleHelperROS2PoseCallback);全球pos全球东方

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

函数exampleHelperROS2PoseCallback(消息)声明全局变量来存储位置和方向全球pos全球东方%从ROS消息中提取位置和方向,并分配将%数据设置为全局变量。pos = [message.linear。x message.linear.y message.linear.z];东方= [message.angular。x message.angular.y message.angular.z];结束

ネットワークが別の/构成メッセージをパブリッシュするまで少し待ちます。更新された値を表示します。

暂停(3)disp (pos)
0.0416 -0.0499 -0.0038
disp(东方)
-0.0076 -0.0039 0.0270

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

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

清楚的poseSub清楚的controlNode

メモ:グローバル変数を使用する以外にも,コールバック関数から情報を抽出する方法があります。たとえば,ハンドルオブジェクトを追加の引数としてコールバック関数に渡すことができます。コールバック関数の定義の詳細については,コールバック定義ドキュメンテーションを参照してください。

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

ROS 2文字列メッセージを/喋喋不休トピックに送信するパブリッシャーを作成します。

chatterPub = ros2publisher (node_1,“/喋喋不休”“std_msgs /字符串”);

/喋喋不休トピックに送信する 活性氧2メッセージを作成して入力します。

chatterMsg = ros2message (chatterPub);chatterMsg。data =“hello world”

ros2主题列表を使用して、活性氧2ネットワークで/喋喋不休トピックが使用可能であることを確認します。

ros2话题列表
/chatter /parameter_events /pose /scan

/喋喋不休トピックのサブスクライバーを定義します。新しいメッセージを受信するとexampleHelperROS2ChatterCallbackが呼び出され,メッセージ内の文字列の内容が表示されます。

chatterSub = ros2subscriber (node_2,“/喋喋不休”@exampleHelperROS2ChatterCallback)
chatterSub = ros2subscriber with properties: TopicName: '/chatter' LatestMessage: [] MessageType: 'std_msgs/String' NewMessageFcn: @exampleHelperROS2ChatterCallback History: 'keeplast' Depth: 10 Reliability: 'reliable' Durability: 'volatile'

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

发送(chatterPub chatterMsg)暂停(3)
Ans = 'hello world'

サブスクライバーが文字列メッセージを受信すると,関数exampleHelperROS2ChatterCallbackが呼び出されました。

ROS 2ネットワークからの切断

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

清楚的全球pos东方清楚的

次のステップ