ROS 2 公式文書(英語) 日本語訳シリーズです。
本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。
※2019/05/06 現在のものです。
概要
クライアントライブラリは、ユーザーが自分のROSコードを実装できるようにする API です。例えば、ノード、トピック、サービスなどの ROS のコンセプトにアクセスするためにユーザーが使用するものです。
ユーザー独自のアプリケーションに最適な言語で ROS コードを書くことができるように、クライアントライブラリには様々なプログラミング言語が用意されています。例として、視覚化ツールを Python で作成する方がよい場合があります。これは、プロトタイプ作成のイテレーションが高速になるためです。
一方、システムの効率性に関係する部分では、ノードは C++ 実装された方が 良いパフォーマンスを発揮します。
全てのクライアントライブラリは、それぞれの言語で ROS インタフェースファイルと対話する機能をユーザーに提供するコードジェネレータを実装しているため、異なるクライアントライブラリを使用して作成されたノード同士でも互いにメッセージを共有できます。
言語固有のコミュニケーションツールに加えて、クライアントライブラリは ROS のコア機能をユーザーに公開します。例えば、これは通常クライアントライブラリからアクセスできる機能のリストです。
- 名前と名前空間
- 時間(実機またはシミュレーション)
- パラメータ
- コンソールロギング
- スレッドモデル
- プロセス内通信
サポートされているクライアントライブラリ
C++ クライアントライブラリ(rclcpp)と Python クライアントライブラリ(rclpy)はどちらも RCL の共通機能を利用するクライアントライブラリです。
C++ と Python のクライアントライブラリは ROS 2 のコアチームによって管理されていますが、ROS 2 コミュニティのメンバーは追加のクライアントライブラリも作成しました。
共通の機能:RCL
クライアントライブラリにある機能のほとんどは、クライアントライブラリのプログラミング言語に依存するものではありません。例えば、パラメータの振る舞いと名前空間のロジックは理想的にはすべてのプログラミング言語で同じであるべきです。
このため、共通の機能を最初から実装するのではなく、クライアントライブラリは、言語固有ではない ROS コンセプトのロジックと動作を実装する共通のコア ROS クライアントライブラリ(RCL)I/F を使用します。その結果、クライアントライブラリは RCL の共通機能を外部関数インタフェースでラップするだけで済みます。
これにより、クライアントライブラリは小規模で済み、開発が容易になります。このため、C 言語は一般にクライアントライブラリがラップするのが最も簡単な言語であるため、一般的なRCL 機能は C 言語の I/F で公開されています。
クライアントライブラリを軽量にすることに加えて、共通のコアを持つ利点は、言語間の動作がより一貫しているということです。たとえば、名前空間など、コア RCL の機能のロジックや動作に変更が加えられた場合、RCL を使用するすべてのクライアントライブラリにこれらの変更が反映されます。
さらに、共通のコアを持つということは、バグ修正に関して複数のクライアントライブラリを維持する負荷も軽減できます。
RCL の API ドキュメントはこちらにあります。
言語固有の機能
言語固有の機能/プロパティを必要とするクライアントライブラリの概念は RCL には実装されていませんが、代わりに各クライアントライブラリで個別に実装されています。たとえば、「spin」関数で使用されるスレッドモデルには、クライアントライブラリの言語に固有の実装があります。
デモ
rclpy
を使用しているパブリッシャとrclcpp
を使用しているサブスクライバとの間のメッセージ交換について理解を深めたければ、こちらの ROSCon プレゼン(17:25 から)を見ることを勧めます(ここにスライドがあります)。
ROS 1 との比較
ROS 1 では、すべてのクライアントライブラリは「ゼロから」開発されています。これにより、例えば ROS 1 Python クライアントライブラリを純粋に Python で実装できるようになり、コードをコンパイルする必要がないなどの利点がありました。
しかし、命名規則と振る舞いはクライアントライブラリ間で常に一貫しているわけではなく、バグ修正は複数の場所で行わなければなりませんでした。しかも、特定の1つのクライアントライブラリ(UDPROS など)にしか実装されていない機能もたくさんあります。
まとめ
ROS 2 では、共通のコア ROS クライアントライブラリを利用することを述べました。 これにより、種々のプログラミング言語で書かれたクライアントライブラリは、書くのがより簡単になり、挙動の一貫性も担保されるようになりました。