ROS 2のプロセス内(intra-process)通信を理解する (1)
本日は、以下のROS 2のプロセス内(訳注:intra-processの意)通信のデモを見ていきます。
https://github.com/ros2/ros2/wiki/Intra-Process-Communication
プロセス内通信の技術紹介に関しては、ROSCon 2015の発表資料が一番詳しいです。記事の図はここから転載しています。
http://roscon.ros.org/2015/presentations/state-of-ros2.pdf
プロセス内通信
プロセス内通信とは、複数のノードをそれぞれ別のプロセスとして動作させる(inter-process)のではなく、一つのプロセスとして動作させることです。 これにより、メッセージのコピー、シリアライゼーション、ネットワーク配信を発生させず、高速・軽量なトピックのPub/Sub通信を実現できます。
ROSのアプリケーションは、個々の小さなノード単位で構成されます。これにより、障害点の切り出し、モジュール開発のしやすさ、ソースコードの再利用しやすさなどが生まれます。
しかし、その分、性能とトレードオフでした。ROS 1では、この問題を解決するために、nodelet
が実装されました。 ROS 2では、このnodelet
の設計を改良し、別個に定義されたノード同士がソースコードの変更なくプロセス内通信を行えるようになりました。
メッセージのゼロコピー
ROS 2のゼロコピー(メッセージのコピーなし)を実現している機能がC++11のstd::unique_ptr
です。
ROS 1のnodelet
では、boost::shared_ptr
を用いていましたが、メッセージのPublisherからSubscriberへの所有権の委譲が中途半端で、あるメッセージをPublish後にPublisher側でそのメッセージを書き換えができたりしました。
それがstd::unique_ptr
に変わり、メッセージのPublisherからSubscriberへの所有権の委譲が正しく機能するようになります。メッセージをPublish後は、そのメッセージをPublisherが変更することができません。
次回
今回はROS 2のプロセス内通信の概要の説明に留め、次回は実際の実装を見ていきます。
Comments powered by Disqus.