receive
新しいメッセージを待機
説明
[ は、上記構文の任意の引数を使用して、メッセージが正常に受信されたかどうかを示す msg,status,statustext] = receive(___)status と、status に関する追加情報を取得する statustext を返します。指定したタイムアウト内にメッセージが受信されないなどのエラー条件が発生した場合、status は false となり、この関数はエラーを表示しません。
例
この例では、ROS 2 ネットワーク内でトピックにパブリッシュおよびサブスクライブする方法を説明します。
ROS 2 ノードがデータを交換するための主なメカニズムは、"メッセージ" を送受信することです。メッセージは "トピック" 上で送信され、各トピックは ROS 2 ネットワーク内で一意の名前をもちます。あるノードが情報を共有する場合、そのノードは "パブリッシャー" を使用してデータをトピックに送信しなければなりません。その情報を受信するノードは、同じトピックの "サブスクライバー" を使用しなければなりません。各トピックには一意の名前の他に "メッセージ タイプ" もあり、それによって特定のトピックで送信可能なメッセージのタイプが決まります。
このパブリッシャーとサブスクライバーの通信には、次の特性があります。
トピックは多対多の通信に使用されます。複数のパブリッシャーが同じトピックにメッセージを送信でき、複数のサブスクライバーがそれらを受信できます。
パブリッシャーとサブスクライバーはトピックを通じて分離され、任意の順序で作成および破棄できます。アクティブなサブスクライバーがない場合でも、メッセージをトピックにパブリッシュできます。

この例では、ROS 2 ネットワーク内でトピックにパブリッシュおよびサブスクライブする方法の他、以下の方法についても説明します。
新しいメッセージを受信するまで待機する
コールバックを使用して、新しいメッセージをバックグラウンドで処理する
前提条件:ROS 2 入門、ROS 2 ネットワークへの接続
サブスクライブしてメッセージを待つ
複数のパブリッシャーおよびサブスクライバーを含むサンプルの ROS 2 ネットワークを作成します。
exampleHelperROS2CreateSampleNetwork
ros2 topic list を使用して、使用可能なトピックを確認します。
ros2 topic list
/parameter_events /pose /rosout /scan
/scan トピックをサブスクライブすると仮定します。ros2subscriber を使用して /scan トピックをサブスクライブします。ノードの名前をサブスクライバーで指定します。ROS 2 ネットワーク内にトピックが既に存在する場合、メッセージ タイプは ros2subscriber で自動的に検出されるため、指定する必要はありません。
detectNode = ros2node("/detection"); pause(5) laserSub = ros2subscriber(detectNode,"/scan"); pause(5)
receive を使用して新しいメッセージを待ちます。タイムアウトを 10 秒に指定します。出力 scanData に、受信したメッセージ データが含まれます。status はメッセージを正常に受信したかどうかを示し、statustext は status に関する追加情報を提供します。
[scanData,status,statustext] = receive(laserSub,10);
これで、サブスクライバー laserSub とそれに関連付けられたノードを削除できます。
clear laserSub clear detectNode
コールバック関数を使用したサブスクライブ
receive を使用してデータを取得する代わりに、新しいメッセージを受信したときに呼び出される関数を指定できます。これにより、サブスクライバーが新しいメッセージを待っている間に他の MATLAB コードを実行できます。複数のサブスクライバーを使用する場合は、コールバックが不可欠です。
受信したメッセージを入力として受け取るコールバック関数 exampleHelperROS2PoseCallback を使用して、/pose トピックをサブスクライブします。メインのワークスペースとコールバック関数の間でデータを共有する方法の 1 つは、グローバル変数を使用することです。2 つのグローバル変数 pos と orient を定義します。
controlNode = ros2node("/base_station"); pause(5) poseSub = ros2subscriber(controlNode,"/pose",@exampleHelperROS2PoseCallback); global pos global orient
グローバル変数 pos および orient は、/pose トピックで新しいメッセージ データが受信されたときに、関数 exampleHelperROS2PoseCallback 内で代入されます。
function exampleHelperROS2PoseCallback(message) % 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
ネットワークが別の /pose メッセージをパブリッシュするまで少し待ちます。更新された値を表示します。
pause(3) disp(pos)
0.00235920447111606 -0.0201184589892978 0.0203969078651195
disp(orient)
-0.0118389124011118 0.00676849978014866 0.0387860955311228
コマンド ラインで pos と orient を数回入力すると、値が継続的に更新されることを確認できます。
サブスクライバー変数をクリアして pose サブスクライバーを停止します。
clear poseSub clear controlNode
メモ: グローバル変数を使用する以外にも、コールバック関数から情報を抽出する方法があります。たとえば、ハンドル オブジェクトを追加の引数としてコールバック関数に渡すことができます。コールバック関数の定義の詳細については、グラフィックス オブジェクトのコールバックの作成ドキュメンテーションを参照してください。
メッセージのパブリッシュ
ROS 2 文字列メッセージを /chatter トピックに送信するパブリッシャーを作成します。
chatterPub = ros2publisher(node_1,"/chatter","std_msgs/String");
/chatter トピックに送信する ROS 2 メッセージを作成して入力します。
chatterMsg = ros2message(chatterPub);
chatterMsg.data = 'hello world';ros2 topic list を使用して、ROS 2 ネットワークで /chatter トピックが使用可能であることを確認します。
ros2 topic list
/chatter /parameter_events /pose /rosout /scan
/chatter トピックのサブスクライバーを定義します。新しいメッセージを受信すると exampleHelperROS2ChatterCallback が呼び出され、メッセージ内の文字列の内容が表示されます。
chatterSub = ros2subscriber(node_2,"/chatter",@exampleHelperROS2ChatterCallback)chatterSub =
ros2subscriber with properties:
TopicName: '/chatter'
LatestMessage: []
MessageType: 'std_msgs/String'
NewMessageFcn: @exampleHelperROS2ChatterCallback
History: 'keeplast'
Depth: 10
Reliability: 'reliable'
Durability: 'volatile'
/chatter トピックにメッセージをパブリッシュします。サブスクライバーのコールバックによって文字列が表示されることを確認します。
send(chatterPub,chatterMsg) pause(3)
ans = 'hello world'
サブスクライバーが文字列メッセージを受信すると、関数 exampleHelperROS2ChatterCallback が呼び出されました。
ROS 2 ネットワークからの切断
サンプル ノード、パブリッシャーおよびサブスクライバーを ROS 2 ネットワークから削除します。また、グローバル変数 pos および orient をクリアします。
clear global pos orient clear
次のステップ
入力引数
特定のトピックをサブスクライブする ros2subscriber オブジェクト。ハンドルとして指定します。
それまでにメッセージを受信しなかった場合に関数 receiver をエラーで終了させる時間。
データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64
出力引数
ROS 2 メッセージ。Message オブジェクト ハンドルとして指定します。
メッセージ受信のステータス。logical スカラーとして返されます。メッセージが受信されない場合、ステータスは false となります。
メモ
コード生成で receive を使用する場合は、status 出力引数を使用します。これにより実行時エラーが回避され、代わりにステータスが出力されますが、これは呼び出しコードでの対処が可能です。
メッセージ受信に関連付けられたステータス テキスト。以下のいずれかとして返されます。
'success'— メッセージは正常に受信されました。'timeout'— メッセージは指定したタイムアウト内に受信されませんでした。'unknown'— 原因不明のエラーによりメッセージは受信されませんでした。
ヒント
receive とコールバックの使用の選択:
トピックの次のメッセージを受信するまでプログラムを待機し、その間に他のいずれの処理も発生しないようにする必要がある場合は、
receiveを使用します。プログラムの実行を続けながら、新しいメッセージが到着するたびに通知を受け取る場合は、receive の代わりにコールバックを使用することを検討してください。
サブスクライバーが受信した最新のデータをプログラムで定期的に使用する場合は、receive またはコールバックを使用する代わりに
LatestMessageプロパティにアクセスすることを検討してください。
拡張機能
使用上の注意および制限:
メッセージ受信ステータスを監視して呼び出しコードで対処するには、
status出力引数を使用します。これにより、メッセージが受信されない場合に実行時エラーを回避することができます。
バージョン履歴
R2019b で導入
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)