本日は、以下の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のプロセス内通信の概要の説明に留め、次回は実際の実装を見ていきます。