15 #ifndef NAV2_BEHAVIOR_TREE__UTILS__LOOP_RATE_HPP_
16 #define NAV2_BEHAVIOR_TREE__UTILS__LOOP_RATE_HPP_
21 #include "rclcpp/clock.hpp"
22 #include "rclcpp/duration.hpp"
23 #include "rclcpp/rate.hpp"
24 #include "rclcpp/time.hpp"
25 #include "behaviortree_cpp/bt_factory.h"
26 #include "behaviortree_cpp/behavior_tree.h"
28 namespace nav2_behavior_tree
35 const rclcpp::Duration & period, BT::Tree * tree,
36 rclcpp::Clock::SharedPtr clock)
37 : clock_(std::move(clock)), period_(period),
38 last_interval_(clock_->now()), tree_(tree)
45 auto now = clock_->now();
47 auto next_interval = last_interval_ + period_;
49 if (now < last_interval_) {
51 next_interval = now + period_;
54 last_interval_ += period_;
56 if (next_interval <= now) {
60 if (now > next_interval + period_) {
61 last_interval_ = now + period_;
67 auto wake_up = tree_->wakeUpSignal();
68 const bool is_sim_time =
69 clock_->get_clock_type() == RCL_ROS_TIME &&
70 clock_->ros_time_is_active();
74 while (clock_->now() < next_interval) {
75 if (wake_up->waitFor(std::chrono::microseconds(500))) {
82 auto remaining = next_interval - clock_->now();
84 std::chrono::duration_cast<std::chrono::microseconds>(
85 std::chrono::nanoseconds(remaining.nanoseconds())));
90 std::chrono::nanoseconds period()
const
92 return std::chrono::nanoseconds(period_.nanoseconds());
96 rclcpp::Clock::SharedPtr clock_;
97 rclcpp::Duration period_;
98 rclcpp::Time last_interval_;