rclcpp (ROS Client Library for C++) を読み解く (1)
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++は人類には早すぎたんでしょうか。
Comments powered by Disqus.