昨日の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を使ったサンプルプログラムを書いていきます。