16 #include "nav2_loopback_sim/clock_publisher.hpp"
22 namespace nav2_loopback_sim
26 nav2::LifecycleNode::WeakPtr node,
29 logger_(rclcpp::get_logger(
"nav2_loopback_sim")),
30 speed_factor_(speed_factor),
31 sim_time_(0, 0, RCL_ROS_TIME),
32 last_wall_time_(std::chrono::steady_clock::now())
34 auto shared_node = node_.lock();
36 throw std::runtime_error(
"Node expired during ClockPublisher construction");
38 logger_ = shared_node->get_logger();
39 clock_pub_ = rclcpp::create_publisher<rosgraph_msgs::msg::Clock>(
40 shared_node->get_node_topics_interface(),
"/clock", 10);
45 last_wall_time_ = std::chrono::steady_clock::now();
49 "Sim clock publisher started (resolution: %.3fs, speed: %.2fx)",
50 kResolution, speed_factor_);
63 if (speed_factor <= 0.0) {
66 "Ignoring non-positive speed_factor %.2f", speed_factor);
69 speed_factor_ = speed_factor;
75 "Clock speed factor changed to %.2fx", speed_factor_);
84 auto shared_node = node_.lock();
88 double wall_period = std::max(kResolution / speed_factor_, kMinWallPeriod);
89 timer_ = rclcpp::create_wall_timer(
90 std::chrono::duration<double>(wall_period),
93 shared_node->get_node_base_interface().get(),
94 shared_node->get_node_timers_interface().get());
95 if (kResolution / speed_factor_ < kMinWallPeriod) {
98 "Wall period clamped to %.1fms (requested %.3fms from resolution=%.3f, speed=%.1f)",
99 kMinWallPeriod * 1000.0, (kResolution / speed_factor_) * 1000.0,
100 kResolution, speed_factor_);
106 auto now_wall = std::chrono::steady_clock::now();
107 double wall_dt = std::chrono::duration<double>(now_wall - last_wall_time_).count();
108 last_wall_time_ = now_wall;
110 sim_time_ += rclcpp::Duration::from_seconds(wall_dt * speed_factor_);
112 auto msg = std::make_unique<rosgraph_msgs::msg::Clock>();
113 msg->clock = sim_time_;
114 clock_pub_->publish(std::move(msg));
void start()
Start publishing /clock.
void setSpeedFactor(double speed_factor)
Update the simulation speed factor.
void resetTimer()
(Re)create the wall timer based on current speed_factor
void stop()
Stop publishing /clock.
ClockPublisher(nav2::LifecycleNode::WeakPtr node, double speed_factor=1.0)
Construct a ClockPublisher.
void timerCallback()
Wall-timer callback that advances sim time and publishes /clock.