Skip to content

Commit f093e00

Browse files
Use msg instead of shared_ptr in box
1 parent 449f133 commit f093e00

File tree

3 files changed

+126
-153
lines changed

3 files changed

+126
-153
lines changed

mecanum_drive_controller/include/mecanum_drive_controller/mecanum_drive_controller.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ class MecanumDriveController : public controller_interface::ChainableControllerI
110110
std::vector<std::string> state_joint_names_;
111111

112112
// the RT Box containing the command message
113-
realtime_tools::RealtimeThreadSafeBox<std::shared_ptr<ControllerReferenceMsg>> input_ref_;
113+
realtime_tools::RealtimeThreadSafeBox<ControllerReferenceMsg> input_ref_;
114114
// the reference timeout value from parameters
115115
rclcpp::Duration ref_timeout_ = rclcpp::Duration::from_seconds(0.0);
116116

mecanum_drive_controller/src/mecanum_drive_controller.cpp

Lines changed: 36 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,15 @@ using ControllerReferenceMsg =
3333

3434
// called from RT control loop
3535
void reset_controller_reference_msg(
36-
const std::shared_ptr<ControllerReferenceMsg> & msg,
37-
const std::shared_ptr<rclcpp_lifecycle::LifecycleNode> & node)
36+
ControllerReferenceMsg & msg, const std::shared_ptr<rclcpp_lifecycle::LifecycleNode> & node)
3837
{
39-
msg->header.stamp = node->now();
40-
msg->twist.linear.x = std::numeric_limits<double>::quiet_NaN();
41-
msg->twist.linear.y = std::numeric_limits<double>::quiet_NaN();
42-
msg->twist.linear.z = std::numeric_limits<double>::quiet_NaN();
43-
msg->twist.angular.x = std::numeric_limits<double>::quiet_NaN();
44-
msg->twist.angular.y = std::numeric_limits<double>::quiet_NaN();
45-
msg->twist.angular.z = std::numeric_limits<double>::quiet_NaN();
38+
msg.header.stamp = node->now();
39+
msg.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
40+
msg.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
41+
msg.twist.linear.z = std::numeric_limits<double>::quiet_NaN();
42+
msg.twist.angular.x = std::numeric_limits<double>::quiet_NaN();
43+
msg.twist.angular.y = std::numeric_limits<double>::quiet_NaN();
44+
msg.twist.angular.z = std::numeric_limits<double>::quiet_NaN();
4645
}
4746

4847
} // namespace
@@ -129,10 +128,9 @@ controller_interface::CallbackReturn MecanumDriveController::on_configure(
129128
"~/reference", subscribers_qos,
130129
std::bind(&MecanumDriveController::reference_callback, this, std::placeholders::_1));
131130

132-
std::shared_ptr<ControllerReferenceMsg> msg = std::make_shared<ControllerReferenceMsg>();
131+
ControllerReferenceMsg msg;
133132
reset_controller_reference_msg(msg, get_node());
134-
input_ref_.set([msg](std::shared_ptr<ControllerReferenceMsg> & stored_value)
135-
{ stored_value = msg; });
133+
input_ref_.set(msg);
136134

137135
try
138136
{
@@ -232,8 +230,7 @@ void MecanumDriveController::reference_callback(const std::shared_ptr<Controller
232230
// Check the timeout condition
233231
if (ref_timeout_ == rclcpp::Duration::from_seconds(0) || age_of_last_command <= ref_timeout_)
234232
{
235-
input_ref_.set([msg](std::shared_ptr<ControllerReferenceMsg> & stored_value)
236-
{ stored_value = msg; });
233+
input_ref_.set(*msg);
237234
}
238235
else
239236
{
@@ -243,10 +240,9 @@ void MecanumDriveController::reference_callback(const std::shared_ptr<Controller
243240
rclcpp::Time(msg->header.stamp).seconds(), age_of_last_command.seconds(),
244241
ref_timeout_.seconds());
245242

246-
std::shared_ptr<ControllerReferenceMsg> emtpy_msg = std::make_shared<ControllerReferenceMsg>();
243+
ControllerReferenceMsg emtpy_msg;
247244
reset_controller_reference_msg(emtpy_msg, get_node());
248-
input_ref_.set([emtpy_msg](std::shared_ptr<ControllerReferenceMsg> & stored_value)
249-
{ stored_value = emtpy_msg; });
245+
input_ref_.set(emtpy_msg);
250246
}
251247
}
252248

@@ -308,11 +304,11 @@ bool MecanumDriveController::on_set_chained_mode(bool /*chained_mode*/) { return
308304
controller_interface::CallbackReturn MecanumDriveController::on_activate(
309305
const rclcpp_lifecycle::State & /*previous_state*/)
310306
{
311-
// Set default value in command
312-
std::shared_ptr<ControllerReferenceMsg> emtpy_msg = std::make_shared<ControllerReferenceMsg>();
307+
// Try to set default value in command.
308+
// If this fails, then another command will be received soon anyways.
309+
ControllerReferenceMsg emtpy_msg;
313310
reset_controller_reference_msg(emtpy_msg, get_node());
314-
input_ref_.try_set([emtpy_msg](std::shared_ptr<ControllerReferenceMsg> & stored_value)
315-
{ stored_value = emtpy_msg; });
311+
input_ref_.try_set(emtpy_msg);
316312

317313
return controller_interface::CallbackReturn::SUCCESS;
318314
}
@@ -341,53 +337,51 @@ controller_interface::CallbackReturn MecanumDriveController::on_deactivate(
341337
controller_interface::return_type MecanumDriveController::update_reference_from_subscribers(
342338
const rclcpp::Time & time, const rclcpp::Duration & /*period*/)
343339
{
344-
std::shared_ptr<ControllerReferenceMsg> current_ref;
345-
if (!input_ref_.try_get([&](std::shared_ptr<ControllerReferenceMsg> value)
346-
{ current_ref = value; }))
340+
auto current_ref_op = input_ref_.try_get();
341+
if (!current_ref_op.has_value())
347342
{
348343
// reference_interfaces_ will remain unchanged
349344
return controller_interface::return_type::OK;
350345
}
351-
const auto age_of_last_command = time - (current_ref)->header.stamp;
346+
auto current_ref = current_ref_op.value();
347+
const auto age_of_last_command = time - current_ref.header.stamp;
352348

353349
// send message only if there is no timeout
354350
if (age_of_last_command <= ref_timeout_ || ref_timeout_ == rclcpp::Duration::from_seconds(0))
355351
{
356352
if (
357-
!std::isnan(current_ref->twist.linear.x) && !std::isnan(current_ref->twist.linear.y) &&
358-
!std::isnan(current_ref->twist.angular.z))
353+
!std::isnan(current_ref.twist.linear.x) && !std::isnan(current_ref.twist.linear.y) &&
354+
!std::isnan(current_ref.twist.angular.z))
359355
{
360-
reference_interfaces_[0] = current_ref->twist.linear.x;
361-
reference_interfaces_[1] = current_ref->twist.linear.y;
362-
reference_interfaces_[2] = current_ref->twist.angular.z;
356+
reference_interfaces_[0] = current_ref.twist.linear.x;
357+
reference_interfaces_[1] = current_ref.twist.linear.y;
358+
reference_interfaces_[2] = current_ref.twist.angular.z;
363359

364360
if (ref_timeout_ == rclcpp::Duration::from_seconds(0))
365361
{
366-
current_ref->twist.linear.x = std::numeric_limits<double>::quiet_NaN();
367-
current_ref->twist.linear.y = std::numeric_limits<double>::quiet_NaN();
368-
current_ref->twist.angular.z = std::numeric_limits<double>::quiet_NaN();
362+
current_ref.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
363+
current_ref.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
364+
current_ref.twist.angular.z = std::numeric_limits<double>::quiet_NaN();
369365

370-
input_ref_.try_set([current_ref](std::shared_ptr<ControllerReferenceMsg> & stored_value)
371-
{ stored_value = current_ref; });
366+
input_ref_.try_set(current_ref);
372367
}
373368
}
374369
}
375370
else
376371
{
377372
if (
378-
!std::isnan(current_ref->twist.linear.x) && !std::isnan(current_ref->twist.linear.y) &&
379-
!std::isnan(current_ref->twist.angular.z))
373+
!std::isnan(current_ref.twist.linear.x) && !std::isnan(current_ref.twist.linear.y) &&
374+
!std::isnan(current_ref.twist.angular.z))
380375
{
381376
reference_interfaces_[0] = 0.0;
382377
reference_interfaces_[1] = 0.0;
383378
reference_interfaces_[2] = 0.0;
384379

385-
current_ref->twist.linear.x = std::numeric_limits<double>::quiet_NaN();
386-
current_ref->twist.linear.y = std::numeric_limits<double>::quiet_NaN();
387-
current_ref->twist.angular.z = std::numeric_limits<double>::quiet_NaN();
380+
current_ref.twist.linear.x = std::numeric_limits<double>::quiet_NaN();
381+
current_ref.twist.linear.y = std::numeric_limits<double>::quiet_NaN();
382+
current_ref.twist.angular.z = std::numeric_limits<double>::quiet_NaN();
388383

389-
input_ref_.try_set([current_ref](std::shared_ptr<ControllerReferenceMsg> & stored_value)
390-
{ stored_value = current_ref; });
384+
input_ref_.try_set(current_ref);
391385
}
392386
}
393387

0 commit comments

Comments
 (0)