ROS 2のクライアントライブラリ構造

本日からROS 2のソースコードを読み解く記事を書いていきます。

まずはクライアントライブラリのソースコードを読んでいきましょう。 ROS 2のクライアントライブラリは、階層構造に分かれています。

http://roscon.ros.org/2016/presentations/ROSCon%202016%20-%20ROS%202%20Update.pdf

  • rclcpp:C++用クライアントライブラリ
  • rclpy:Python用クライアントライブラリ
  • rcl:各言語用クライアントライブラリの共通部分(Cライブラリ)
  • rmw:DDSベンダー非依存のDDSミドルウェアインタフェース
  • DDS vendor:rmw_fastrtpsのようなDDSベンダー特化のDDSミドルウェア実装

上から順に取り上げていく予定です。

rclcpp (ROS Client Library for C++)

ソースコードを直に読むと、それだけで数日を消費してしまうため、Doxygenが生成したインタフェース定義のHTMLを読みます。 各クラス間をリンクで飛べるので、ソースコードリーディングが捗ります。

http://docs.ros2.org/beta1/api/rclcpp/index.html

rclcpp::node::Node

rclcppを知る上で一番大事なクラスは、rclcpp::node::Nodeでしょう。 ユーザコードを書くだけなら、これさえ分かっていれば、ほとんどのケースで満足しそうです。

重要なメソッドのインタフェースを列挙します。

コンストラクタ

  • Node:ノードを生成します。
    • node_name:ノード名
    • use_intra_process_comms:trueならプロセス内通信のパイプラインを使用

トピック関連

  • create_publisher:トピックのPublisherを生成します。

    • topic_name:トピック名
    • qos_profile:QoS (Quality of Service)プロファイル
  • create_subscription:トピックのSubscriberを生成します。

    • topic_name:トピック名
    • callback:コールバック関数オブジェクト
    • qos_profile:QoS (Quality of Service)プロファイル

トピックのPublisher数、Subscriber数を得るメソッドや、定義されたトピック名と型の一覧を得るメソッドもあります。

サービス関連

  • create_service:サービスを定義します。

    • service_name:サービス名
    • callback:コールバック関数オブジェクト
    • qos_profile:QoS (Quality of Service)プロファイル
  • create_client:サービスを呼び出します。

    • service_name:サービス名
    • qos_profile:QoS (Quality of Service)プロファイル

パラメータ関連

  • set_parameters:パラメータを設定します。

    • parameters:パラメータ名と値のリスト
  • get_parameter:パラメータを読み取ります。

    • name:パラメータ名

パラメータの変更を通知するコールバック関数も登録できます。

その他

  • create_wall_timer:時間間隔で定期的にコールバックを実行します。
    • period:時間間隔
    • callback:コールバック関数オブジェクト

ところで、ROS 2のソースコードは美しいです。C++11以降の技巧的な書き方を知る上で、非常に参考になります。

どのように書くとメモリ効率が良くなるのか、ムーブセマンティクスの使い方の実例があって理解が深まります。ただ、テンプレートとかマクロももりもり使われていて、実行時の流れを想像するのが難しいです。 C++は人類には早すぎたんでしょうか。