rclcpp (ROS Client Library for C++) を読み解く (2)
昨日のrclcpp (ROS Client Library for C++) を読み解く (1)のフォーマットを変更しました。 Gistを使った方が正しくシンタックスハイライトが効いて、やはり読みやすいですね。
rclcppのソースコードを本日も見ていきます。
昨日も出てきていましたが、読み飛ばしていたCallbackGroup, CallbackGroupTypeというクラスを見ていきます。
rclcpp::callback_group::CallbackGroupType
後述するCallbackGroupの性質を表す列挙型です。ROS 2では、コールバック関数をその性質別にグループでくくって扱うことができるようになりました。
C++11ではenum classという列挙型が新たに導入され、CallbackGroupType::Reentrantという具合にスコープがつくようになりました。
C++03以前はグローバルスコープで欠点もたくさんあるenumしかありませんでした…
定数
MutuallyExclusive:前回のコールバック関数が実行完了するまで、次回のコールバック関数の実行を抑制します。Reentrant:前回のコールバック関数が実行完了していなくても、次回のコールバック関数が呼び出されれば実行します。
rclcpp::callback_group::CallbackGroup
CallbackGroupTypeをコンストラクタでとり、各コールバックの種類別にコールバック関数をリストに追加します。
コンストラクタ
CallbackGroup:コールバックグループを作成します。group_type:コールバックの性質
コールバック関数の追加
add_subscriptionなどのメソッドはprotected宣言されているため、そのまま外から呼ぶことはありません。 例えば、rclcpp::node::create_subsction()のgroup引数が与えられていた場合に、その内部で、add_subsction()が呼び出されます。
rclcpp::parameter::ParameterVariant
次に、パラメータの引数に用いられていたParameterVariantを見ていきます。
コンストラクタ
コンストラクタの引数を見る限り、ROS 2のパラメータには
- Boolean
- 整数
- 浮動小数点数
- 文字列
- バイト列
が使えることがわかります。
値取得
get_value()のtypenameにC++の魔術を見た気がします。 std::enable_if<A, B>はコンパイル時にAを評価して、Bの型を返す型支援機能だそうです。
これはちょっと使ってみないと、僕には動きがつかめません。 そこで、次回はrclcppを使ったサンプルプログラムを書いていきます。