15 #ifndef NAV2_BEHAVIOR_TREE__UTILS__LOOP_RATE_HPP_
16 #define NAV2_BEHAVIOR_TREE__UTILS__LOOP_RATE_HPP_
21 #include "rclcpp/rclcpp.hpp"
22 #include "behaviortree_cpp/bt_factory.h"
23 #include "behaviortree_cpp/behavior_tree.h"
25 namespace nav2_behavior_tree
32 const rclcpp::Duration & period, BT::Tree * tree,
33 rclcpp::Clock::SharedPtr clock)
34 : clock_(std::move(clock)), period_(period),
35 last_interval_(clock_->now()), tree_(tree)
42 auto now = clock_->now();
44 auto next_interval = last_interval_ + period_;
46 if (now < last_interval_) {
48 next_interval = now + period_;
51 last_interval_ += period_;
53 if (next_interval <= now) {
57 if (now > next_interval + period_) {
58 last_interval_ = now + period_;
64 auto wake_up = tree_->wakeUpSignal();
65 const bool is_sim_time =
66 clock_->get_clock_type() == RCL_ROS_TIME &&
67 clock_->ros_time_is_active();
71 while (clock_->now() < next_interval) {
72 if (wake_up->waitFor(std::chrono::microseconds(500))) {
79 auto remaining = next_interval - clock_->now();
81 std::chrono::duration_cast<std::chrono::microseconds>(
82 std::chrono::nanoseconds(remaining.nanoseconds())));
87 std::chrono::nanoseconds period()
const
89 return std::chrono::nanoseconds(period_.nanoseconds());
93 rclcpp::Clock::SharedPtr clock_;
94 rclcpp::Duration period_;
95 rclcpp::Time last_interval_;