PublisherとSubscriberの間でデータを交換する
ROS 2は、ノード間のメッセージインタラクションを可能にする.ROS 2ネットワークでは、メッセージはトピックとして渡され、各トピックには特定の名前が付けられている.トピックはPublisherによって送信され、Subscriberによって送信されたトピックを受信する必要があります.トピックにはメッセージ・タイプが含まれます.メッセージ・タイプによって、トピックに必要なデータを含めることができます.
例を使用してROS 2ネットワークを作成します.
スキャントピックを送信しましょう.ros 2 subscriberを使用して/scanトピックを送信できます.テーマに名前をつけてください.ROS 2ネットワークにすでにトピックが存在する場合、ros 2 subscriberはメッセージタイプを自動的に検出します.
右側のワークスペースにLaserSubというSubscriberが作成されていることがわかります.
receiveを使用して、新しいメッセージの受信を待つことができます.10秒以内に受信するように設定します.scandDataの出力には、受信したメッセージデータが含まれます.
右側のワークスペースのscanData変数をダブルクリックすると表示されます.
LaserSubとその関連ノードを削除できます.
receiveを使用してデータを受信するのではなく、関数を使用して新しいメッセージを受信できます.
/poseトピックをリリースし、exampleHelperS 2 PoseCallbackというコールバックを取得します.グローバル変数を使用すると、主に使用されるワークスペースと呼び出し関数の間にデータを割り当てることができます.グローバル変数posとorientを定義します.
orientも印刷しましょう
コマンドラインにdisp(pos)とdisp(orient)を入力するたびに、値が変化します.次に、最初に作成したSubscriberとノードを整理してください.
Publisherを作成して、チャットのトピックのテキスト列を送信します.
チャットのテーマを発表しましょう.コールバック関数に文字列が表示されます.
1.メッセージを送信して待機
例を使用してROS 2ネットワークを作成します.
exampleHelperROS2CreateSampleNetwork
ros 2トピックのリストを使用して、使用可能なトピックを決定します.ros2 topic list
スキャントピックを送信しましょう.ros 2 subscriberを使用して/scanトピックを送信できます.テーマに名前をつけてください.ROS 2ネットワークにすでにトピックが存在する場合、ros 2 subscriberはメッセージタイプを自動的に検出します.
detectNode = ros2node("/detection");
pause(2)
laserSub = ros2subscriber(detectNode,"/scan");
pause(2)
右側のワークスペースにLaserSubというSubscriberが作成されていることがわかります.
receiveを使用して、新しいメッセージの受信を待つことができます.10秒以内に受信するように設定します.scandDataの出力には、受信したメッセージデータが含まれます.
右側のワークスペースのscanData変数をダブルクリックすると表示されます.
LaserSubとその関連ノードを削除できます.
clear laserSub
clear detectNode
コールバック関数を使用したメッセージの受信
receiveを使用してデータを受信するのではなく、関数を使用して新しいメッセージを受信できます.
/poseトピックをリリースし、exampleHelperS 2 PoseCallbackというコールバックを取得します.グローバル変数を使用すると、主に使用されるワークスペースと呼び出し関数の間にデータを割り当てることができます.グローバル変数posとorientを定義します.
controlNode = ros2node("/base_station");
poseSub = ros2subscriber(controlNode,"/pose",@exampleHelperROS2PoseCallback);
global pos
global orient
左側の現在のフォルダにexampleHelperS 2 PoseCallbackが表示されます.mファイルにコールバック関数が作成されました.function exampleHelperROS2PoseCallback(message)
%exampleHelperROS2PoseCallback Subscriber callback function for pose data
% exampleHelperROS2PoseCallback(MESSAGE) returns no arguments - it instead sets
% global variables to the values of position and orientation that are
% received in the ROS 2 message MESSAGE.
%
% See also ROSPublishAndSubscribeExample.
% Copyright 2019 The MathWorks, Inc.
% Declare global variables to store position and orientation
global pos
global orient
% Extract position and orientation from the ROS message and assign the
% data to the global variables.
pos = [message.linear.x message.linear.y message.linear.z];
orient = [message.angular.x message.angular.y message.angular.z];
end
受け取ったposデータを画面に印刷します.disp(pos)
orientも印刷しましょう
disp(orient)
コマンドラインにdisp(pos)とdisp(orient)を入力するたびに、値が変化します.次に、最初に作成したSubscriberとノードを整理してください.
clear poseSub
clear controlNode
メッセージの送信
Publisherを作成して、チャットのトピックのテキスト列を送信します.
chatterPub = ros2publisher(node_1,"/chatter","std_msgs/String");
次に、chatterトピックにメッセージを作成して入力します.chatterMsg = ros2message(chatterPub);
chatterMsg.data = 'hello world';
Subscriberを定義して/chatterトピックを受信します.例HelperS 2 ChatterCallbackは、新しいメッセージが受信されたときに呼び出され、画面にメッセージの内容が出力されます.チャットのテーマを発表しましょう.コールバック関数に文字列が表示されます.
Reference
この問題について(PublisherとSubscriberの間でデータを交換する), 我々は、より多くの情報をここで見つけました https://velog.io/@chimul/Publisher와-Subscriber간의-데이터-교환テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol