Skip to content

Commit c987379

Browse files
authored
Add publish_rate option for the diff_drive_controller (#278)
1 parent 9733da0 commit c987379

File tree

2 files changed

+40
-24
lines changed

2 files changed

+40
-24
lines changed

diff_drive_controller/include/diff_drive_controller/diff_drive_controller.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ class DiffDriveController : public controller_interface::ControllerInterface
158158

159159
rclcpp::Time previous_update_timestamp_{0};
160160

161+
// publish rate limiter
162+
double publish_rate_ = 50.0;
163+
rclcpp::Duration publish_period_ = rclcpp::Duration::from_nanoseconds(0);
164+
rclcpp::Time previous_publish_timestamp_{0};
165+
161166
bool is_halted = false;
162167
bool use_stamped_vel_ = true;
163168

diff_drive_controller/src/diff_drive_controller.cpp

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)