このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
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ネットワークから削除します。また,グローバル変数pos
および东方
をクリアします。
清楚的全球pos东方清楚的