rclcpp code reading 3 (TimersInterface)
はじめに
rclcppのコードリーディングをしています。
基本的にはardent branchのものを読んでいます。(コード量が少ないのと、把握してから変更点を追いかける方針)
なんちゃってロボットエンジニアなので間違っていれば教えてください。
コードは下記から引用しております。
timers interface
tutorialの最初でtimerを作成しています
class MinimalPublisher : public rclcpp::Node
{
public:
MinimalPublisher()
: Node("minimal_publisher"), count_(0)
{
publisher_ = this->create_publisher<std_msgs::msg::String>("topic", 10);
timer_ = this->create_wall_timer(
500ms, std::bind(&MinimalPublisher::timer_callback, this));
}
GenericTimerを作ってadd_timerを呼んでいますね。
add_timer実装はNodeTimersInterfaceを継承するNodeTimersクラスです
add_timer関数の定義しかないですね。
実装はtimerをcallback_groupに追加しているだけ。
rcl_trigger_guard_conditionについては別でまとめます。
GenericTimerをもう少し追います。
まず、GenericTimerはTimerBaseを継承しており、
TimerBaseはrcl_timerをラップしています。
また、rcl_timer_initの第3引数はcallbackを設定できますが、ここではnullptrを渡しています。
execute_callbackで指定されたcallbackを呼び出します。
callbackはrclではなくrclcpp側で管理する構成になっていますね。
callbackを呼ぶ前にrcl_timer_callを呼んでいますが、rcl側のcallbackはnullptrなので
実質やってるのはlast_call_timeの設定だけになります。
その1の記事で説明したように、executorでTimerBaseのコールバックを呼んでます。
実行可能かどうかはget_next_timerで判定
callback_groupから、TimerInterfaceを探して、is_readyがtrueならcallbackが実行されます。
最後に、is_readyの判定がどうなっているか
ここを読むと、last_call + periodとnowを比較しているということがわかります。
Discussion