このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
ROS のパブリッシャーおよびサブスクライバーとのデータ交換
ROS ノードがデータを交換するための主なメカニズムは、"メッセージ"を送受信することです。メッセージは "トピック"上で送信され、各トピックは ROS ネットワーク内で一意の名前をもちます。あるノードが情報を共有する場合、そのノードは "パブリッシャー"をを用してデータをトピックに送信します。その情報を受信するノードは、同じトピックの "サブスクライバー"を使用します。各トピックには一意の名前の他に "メッセージ タイプ"もあり、そのトピックで送信可能なメッセージのタイプが決まります。
このパブリッシャーとサブスクライバーの通信には,次のような特性があります。
トピックは多重多の通信ににさトピックにメッセージを送,多数のサブスクライバーそれらを信できますをを受できますをを受できますをを信できサブスクライバーそれら
パブリッシャーとサブスクライバーはトピックトピックされ,任意の顺序でないますます。
トピック,パブリッシャーパブリッシャーおよびサブスクライバーののを次の図に示し
この例では、ROS ネットワーク内でトピックにパブリッシュおよびサブスクライブする方法を説明します。また、次の方法も示します。
新しいメッセージを受信するまで待機する
コールバックを使用して、新しいメッセージをバックグラウンドで処理する
前提条件:ROS 入門、ROS ネットワークへの接続
サブスクライブしてメッセージを待つ
罗斯尼特
コマンドコマンド使使用ししmatlab®でrosマスターを起起ます。
罗斯尼特
Launching ROS Core... .Done in 1.7048 seconds. Initializing ROS master on http://192.168.0.10:60945. Initializing global node /matlab_global_node_09828 with NodeURI http://dcc464535glnxa64:43497/
提供された補助関数exampleHelperROSCreateSampleNetwork.
をを用して、複数のパブリッシャーおよびサブスクライバーを含むサンプルの ROS ネットワークを作成します。
exampleHelperROSCreateSampleNetwork
叛逆
list
をを使し,可用可致なを确认ますますます。
叛逆list
/姿势/rosout /scan /tf
叛逆info
をを用して、/扫描
トピックトピックにパブリッシュしいるがあるかどうかチェックします以以ししコマンド以ししコマンドnode_3
がパブリッシュしていることを示しています。
叛逆info/扫描
类型:Sensor_msgs / Laserscan发布商:* / node_3(http:// dcc464535glnxa64:35697 /)订阅者:* / node_1(http:// dcc464535glnxa64:40173 /)* / node_2(http:// dcc464535glnxa64:38245 /)
rossubscriber
をを用して/扫描
トピックをサブスクライブします。このケースのように,rosネットワーク内にトピックが既にする场场料,メッセージタイプはrossubscriber
で自動的に検出されるため、指定する必要はありません。メッセージを struct 形式で使用すると効率性が向上します。
laser = rossubscriber("/scan","DataFormat",“结构”);暂停(2)
receive
をを用して新しいメッセージを待ちます (2 番目の引数は秒単位のタイムアウト)。出力斯堪的数据
に,诚信したメッセージが含まれます。
Scandata =接收(激光,10)
斯堪的数据=struct with fields:MessageType: 'sensor_msgs/LaserScan' Header: [1x1 struct] AngleMin: -0.5467 AngleMax: 0.5467 AngleIncrement: 0.0017 TimeIncrement: 0 ScanTime: 0.0330 RangeMin: 0.4500 RangeMax: 10 Ranges: [640x1 single] Intensities: []
一部のメッセージ タイプには、可視化機能が関連付けられています。LaserScan メッセージの場合は、ROSPOT.
がスキャン データをプロットします。MaximumRange
の名前と値のペアは、最大プロット範囲を指定します。
figure rosPlot(scandata,"MaximumRange"7)
コールバック関数を使用したサブスクライブ
receive
をを使しててをする代わりに,新しいメッセージを函数したとき呼び出さ关键词指定によりますますますますますますますますますいるに他のmatlabコードを実行のサブスクライバーを使使用するする合,コールバックが不可能です。
コールバック関数exampleHelperROSPoseCallback
をを用して、/姿势
トピックをサブスクライブします。
robotpose = rossubscriber("/pose",@exampleHelperROSPoseCallback,"DataFormat",“结构”)
robotpose = Subscriber with properties: TopicName: '/pose' LatestMessage: [] MessageType: 'geometry_msgs/Twist' BufferSize: 1 NewMessageFcn: @exampleHelperROSPoseCallback DataFormat: 'struct'
メインのワークスペースとコールバック関数の間でデータを共有する方法の 1 つは、グローバル変数を使用することです。2 つのグローバル変数pos
と东方
を定義します。
globalposglobal东方
グローバル変数pos
および东方
は/姿势
トピックで新しいメッセージ データが受信されたときに、関数exampleHelperROSPoseCallback
内で代入されます。
数秒間待機して、サブスクライバーがメッセージを受信できることを確認します。変数pos
および东方
には、常に最新の位置と向きのデータが保存されます。
暂停(2)pos
pos =1×3-0.0242 -0.0091 0.0095
东方
东方=1×3-0.0238 0.0103 0.0211
コマンド ラインでpos
と东方
を数回入力すると、値が継続的に更新されることを確認できます。
サブスクライバーサブスクライバー数をクリアして姿势サブスクライバーサブスクライバーをを停止し
清除robotpose
メモ:グローバルグローバル数をも,コールバック关键词がが抽出,ハンドルオブジェクトオブジェクトますますコールバック关键词关键词たとえば关键はコールバック定義ドキュメンテーションを参照してください。
メッセージのパブリッシュ
ROS 文字列メッセージを/chatter
トピックに送信するパブリッシャーを作成します (Work with Basic ROS Messagesを参照)。
chatterpub = rospublisher("/chatter","std_msgs/String","DataFormat",“结构”)
chatterpub = Publisher with properties: TopicName: '/chatter' NumSubscribers: 0 IsLatching: 1 MessageType: 'std_msgs/String' DataFormat: 'struct'
暂停(2)% Wait to ensure publisher is registered
/chatter
トピックに送信する ROS メッセージを作成して入力します。
Chattermsg = Rosmessage(Chatterpub);chattermsg.data ='hello world'
chattermsg =struct with fields:MessageType:'std_msgs / string'数据:'hello world'
叛逆list
をを用して、ROS ネットワークで/chatter
トピックが使用可能であることを確認します。
叛逆list
/chatter /pose /rosout /scan /tf
/chatter
トピックのサブスクライバーを定义します。新しいメッセージをを信するとexampleHelperROSChatterCallback
が呼び出され、メッセージ内の文字列の内容が表示されます。
chattersub = rossubscriber("/chatter",@exampleHelperROSChatterCallback,"DataFormat",“结构”)
chattersub = Subscriber with properties: TopicName: '/chatter' LatestMessage: [] MessageType: 'std_msgs/String' BufferSize: 1 NewMessageFcn: @exampleHelperROSChatterCallback DataFormat: 'struct'
/chatter
トピックにメッセージをパブリッシュします。サブスクライバーのコールバックによって文字列が表示されます。
发送(Chatterpub,Chattermsg)暂停(2)
ans = 'hello world'
文字列メッセージをパブリッシュするとすぐに、関数exampleHelperROSChatterCallback
が呼び出されました。
ROSネットワークネットワークのシャット
サンプルノード,パブリッシャーおよびサブスクライバーをrosネットワークから削除し。pos
および东方.
をクリアします。
examplehelperrosshutdownsamplenetwork清晰globalpos东方
ROS マスターをシャットダウンしてグローバル ノードを削除します。
rosshutdown
Shutting down global node /matlab_global_node_09828 with NodeURI http://dcc464535glnxa64:43497/ Shutting down ROS master on http://192.168.0.10:60945.
次のステップ
MATLAB での ROS メッセージの処理方法の詳細については、Work with Basic ROS MessagesおよびWork with Specialized ROS Messagesを参照してください。
ROSサービスサービスを调べる调べるに,致电并提供ROS服务を参照してください。