PublisherとSubscriberの間でデータを交換する


ROS 2は、ノード間のメッセージインタラクションを可能にする.ROS 2ネットワークでは、メッセージはトピックとして渡され、各トピックには特定の名前が付けられている.トピックはPublisherによって送信され、Subscriberによって送信されたトピックを受信する必要があります.トピックにはメッセージ・タイプが含まれます.メッセージ・タイプによって、トピックに必要なデータを含めることができます.

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は、新しいメッセージが受信されたときに呼び出され、画面にメッセージの内容が出力されます.

チャットのテーマを発表しましょう.コールバック関数に文字列が表示されます.