この記事は、ROSについてまとめてみる #3の続きです。
*重複している部分もありますが、ひとまずこのまま公開します。
*この記事の記載内容はROS1に関するものです。
#ROSでの通信
ROSの肝は、まずこの通信を理解することです。
ここではROSの通信についてまとめます。
##メッセージ
ROSで使われるPub/Sub型の通信。TCPベースで実装されている。
Publisherは、プロセス起動時に、自身の発行するTopic名と、ノードのアドレスをMasterに登録します。
Subscriberは、起動時にMasterに購読したいTopicを検索してもらい、そのTopicを発行しているPublisherのアドレスを取得します。
あとは、SubscriberがPublisherに直接接続し、ピアツーピアのメッセージの送受信が行われます。
##サービス
ROSで使われるReq/Rep型の通信。あるノードが他のノードの関数を使う。RPCとも呼ばれる。
サービスはクライアント、サーバー形式の通信です。Serverは、起動時に自身のService名と、ノードのアドレスをMasterに登録します。
Clientはサービス利用時に、MasterにService名を検索してもらい、そのServiceを発行しているServerのアドレスを取得します。
Clientはその情報をもとにServerにリクエストを要求し、ServerはClientにレスポンスを返します。
##パラメータ
パラメータに関しては文献によって通信に分類されないものもありますが、用途としてはここにまとめてもいいような気もするので、書いておきます。
パラメータサーバーは、ROS Masterが有する機能で、システム内の全ノードから参照できる値を保持します。
利用できるデータ型が決まっているため、簡単に利用でき、システム内の全ノードから参照できます。
実際には文字列のやり取りが行わており、各ノードが適した形式に読み替えているようです。
##使い分け
- メッセージ: 非同期ストリーミング
- サービス: 同期での単一データ通信や、機器の操作など
- パラメータ: システム内の全ノードから参照できる値を保持する
#アクション
ROSのサービスは同期なので、クライアントがサーバーからレスポンスを受け取るまでプロセスがロックします。
単純なスイッチのOn/Offや、ステータスの取得等ならこれでもいいのですが、ロボットの移動などの時間のかかるタスクには向きません。移動中はサーバーから何も返ってこないばかりか、失敗すれば一生何も返ってこないこともあり得ます。
こういった時のために、ROSには、複数のトピックを組み合わせた、アクションと呼ばれる非同期の手法があります。
アクションでも基本的にはトピックの仕組みが使われています。
ゴールというトピックにメッセージを送信することで、アクションサーバーは動作を開始します。実行中、アクションクライアントはフィードバックというトピックを通じて、途中結果を受け取ることができます。そしてすべてが実行し終わると、リザルトというトピックから、結果を受け取ります。
#5へつづく
#参考
ROS
http://wiki.ros.org/
プログラミングROS(O'Reilly Japan)
https://www.oreilly.co.jp/books/9784873118093/
ROSプログラミング(森北出版株式会社)
https://www.morikita.co.jp/books/book/3010