@@ -33,16 +33,15 @@ using ControllerReferenceMsg =
3333
3434// called from RT control loop
3535void 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
308304controller_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(
341337controller_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