@@ -100,6 +100,7 @@ CallbackReturn DiffDriveController::on_init()
100100 auto_declare<double >(" angular.z.min_acceleration" , NAN);
101101 auto_declare<double >(" angular.z.max_jerk" , NAN);
102102 auto_declare<double >(" angular.z.min_jerk" , NAN);
103+ auto_declare<double >(" publish_rate" , publish_rate_);
103104 }
104105 catch (const std::exception & e)
105106 {
@@ -224,32 +225,37 @@ controller_interface::return_type DiffDriveController::update(
224225 tf2::Quaternion orientation;
225226 orientation.setRPY (0.0 , 0.0 , odometry_.getHeading ());
226227
227- if (realtime_odometry_publisher_-> trylock () )
228+ if (previous_publish_timestamp_ + publish_period_ < current_time )
228229 {
229- auto & odometry_message = realtime_odometry_publisher_->msg_ ;
230- odometry_message.header .stamp = current_time;
231- odometry_message.pose .pose .position .x = odometry_.getX ();
232- odometry_message.pose .pose .position .y = odometry_.getY ();
233- odometry_message.pose .pose .orientation .x = orientation.x ();
234- odometry_message.pose .pose .orientation .y = orientation.y ();
235- odometry_message.pose .pose .orientation .z = orientation.z ();
236- odometry_message.pose .pose .orientation .w = orientation.w ();
237- odometry_message.twist .twist .linear .x = odometry_.getLinear ();
238- odometry_message.twist .twist .angular .z = odometry_.getAngular ();
239- realtime_odometry_publisher_->unlockAndPublish ();
240- }
230+ previous_publish_timestamp_ += publish_period_;
241231
242- if (odom_params_.enable_odom_tf && realtime_odometry_transform_publisher_->trylock ())
243- {
244- auto & transform = realtime_odometry_transform_publisher_->msg_ .transforms .front ();
245- transform.header .stamp = current_time;
246- transform.transform .translation .x = odometry_.getX ();
247- transform.transform .translation .y = odometry_.getY ();
248- transform.transform .rotation .x = orientation.x ();
249- transform.transform .rotation .y = orientation.y ();
250- transform.transform .rotation .z = orientation.z ();
251- transform.transform .rotation .w = orientation.w ();
252- realtime_odometry_transform_publisher_->unlockAndPublish ();
232+ if (realtime_odometry_publisher_->trylock ())
233+ {
234+ auto & odometry_message = realtime_odometry_publisher_->msg_ ;
235+ odometry_message.header .stamp = current_time;
236+ odometry_message.pose .pose .position .x = odometry_.getX ();
237+ odometry_message.pose .pose .position .y = odometry_.getY ();
238+ odometry_message.pose .pose .orientation .x = orientation.x ();
239+ odometry_message.pose .pose .orientation .y = orientation.y ();
240+ odometry_message.pose .pose .orientation .z = orientation.z ();
241+ odometry_message.pose .pose .orientation .w = orientation.w ();
242+ odometry_message.twist .twist .linear .x = odometry_.getLinear ();
243+ odometry_message.twist .twist .angular .z = odometry_.getAngular ();
244+ realtime_odometry_publisher_->unlockAndPublish ();
245+ }
246+
247+ if (odom_params_.enable_odom_tf && realtime_odometry_transform_publisher_->trylock ())
248+ {
249+ auto & transform = realtime_odometry_transform_publisher_->msg_ .transforms .front ();
250+ transform.header .stamp = current_time;
251+ transform.transform .translation .x = odometry_.getX ();
252+ transform.transform .translation .y = odometry_.getY ();
253+ transform.transform .rotation .x = orientation.x ();
254+ transform.transform .rotation .y = orientation.y ();
255+ transform.transform .rotation .z = orientation.z ();
256+ transform.transform .rotation .w = orientation.w ();
257+ realtime_odometry_transform_publisher_->unlockAndPublish ();
258+ }
253259 }
254260
255261 const auto update_dt = current_time - previous_update_timestamp_;
@@ -464,6 +470,11 @@ CallbackReturn DiffDriveController::on_configure(const rclcpp_lifecycle::State &
464470 odometry_message.header .frame_id = odom_params_.odom_frame_id ;
465471 odometry_message.child_frame_id = odom_params_.base_frame_id ;
466472
473+ // limit the publication on the topics /odom and /tf
474+ publish_rate_ = node_->get_parameter (" publish_rate" ).as_double ();
475+ publish_period_ = rclcpp::Duration::from_seconds (1.0 / publish_rate_);
476+ previous_publish_timestamp_ = node_->get_clock ()->now ();
477+
467478 // initialize odom values zeros
468479 odometry_message.twist =
469480 geometry_msgs::msg::TwistWithCovariance (rosidl_runtime_cpp::MessageInitialization::ALL);
0 commit comments