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