@@ -74,7 +74,7 @@ controller_interface::InterfaceConfiguration ToolContactController::command_inte
7474 const std::string tf_prefix = tool_contact_params_.tf_prefix ;
7575
7676 // Start or stop tool contact functionality
77- config.names .emplace_back (tf_prefix + " tool_contact/tool_contact_status " );
77+ config.names .emplace_back (tf_prefix + " tool_contact/tool_contact_set_state " );
7878 return config;
7979}
8080
@@ -84,28 +84,29 @@ controller_interface::InterfaceConfiguration ToolContactController::state_interf
8484 config.type = controller_interface::interface_configuration_type::INDIVIDUAL;
8585
8686 const std::string tf_prefix = tool_contact_params_.tf_prefix ;
87- config.names .push_back (tf_prefix + " tool_contact/tool_contact_result" );
88- config.names .push_back (tf_prefix + " get_robot_software_version/get_version_major" );
87+ config.names .emplace_back (tf_prefix + " tool_contact/tool_contact_result" );
88+ config.names .emplace_back (tf_prefix + " get_robot_software_version/get_version_major" );
89+ config.names .emplace_back (tf_prefix + " tool_contact/tool_contact_state" );
8990 return config;
9091}
9192
9293controller_interface::CallbackReturn
9394ToolContactController::on_activate (const rclcpp_lifecycle::State& /* previous_state */ )
9495{
96+ double val;
9597 {
9698 const std::string interface_name = tool_contact_params_.tf_prefix + " tool_contact/tool_contact_state" ;
9799 auto it = std::find_if (state_interfaces_.begin (), state_interfaces_.end (),
98100 [&](auto & interface) { return (interface.get_name () == interface_name); });
99101 if (it != state_interfaces_.end ()) {
100102 tool_contact_state_interface_ = *it;
101- if (!tool_contact_state_interface_->get ().get_value ()) {
103+ if (!tool_contact_state_interface_->get ().get_value (val )) {
102104 RCLCPP_ERROR (get_node ()->get_logger (),
103- " Failed to set '%s' command interface, aborting activation of controller." ,
104- interface_name.c_str ());
105+ " Failed to read '%s' state interface, aborting activation of controller." , interface_name.c_str ());
105106 return controller_interface::CallbackReturn::ERROR;
106107 }
107108 } else {
108- RCLCPP_ERROR (get_node ()->get_logger (), " Did not find '%s' in command interfaces." , interface_name.c_str ());
109+ RCLCPP_ERROR (get_node ()->get_logger (), " Did not find '%s' in state interfaces." , interface_name.c_str ());
109110 return controller_interface::CallbackReturn::ERROR;
110111 }
111112 }
@@ -132,7 +133,7 @@ ToolContactController::on_activate(const rclcpp_lifecycle::State& /* previous_st
132133 [&](auto & interface) { return (interface.get_name () == interface_name); });
133134 if (it != state_interfaces_.end ()) {
134135 tool_contact_result_interface_ = *it;
135- if (!tool_contact_result_interface_->get ().get_value ()) {
136+ if (!tool_contact_result_interface_->get ().get_value (val )) {
136137 RCLCPP_ERROR (get_node ()->get_logger (),
137138 " Failed to read '%s' state interface, aborting activation of controller." , interface_name.c_str ());
138139 return controller_interface::CallbackReturn::ERROR;
@@ -165,8 +166,7 @@ ToolContactController::on_activate(const rclcpp_lifecycle::State& /* previous_st
165166 }
166167 }
167168
168- action_monitor_period_ =
169- rclcpp::duration<std::chrono::nanoseconds>(rclcpp::Rate (tool_contact_params_.action_monitor_rate ).period ());
169+ action_monitor_period_ = rclcpp::Duration (rclcpp::Rate (tool_contact_params_.action_monitor_rate ).period ());
170170 return controller_interface::CallbackReturn::SUCCESS;
171171}
172172
@@ -179,9 +179,9 @@ ToolContactController::on_deactivate(const rclcpp_lifecycle::State& /* previous_
179179 RCLCPP_INFO (get_node ()->get_logger (), " Aborting tool contact, as controller has been deactivated." );
180180 // Mark the current goal as abort
181181 auto result = std::make_shared<ur_msgs::action::ToolContact::Result>();
182- result->result = ur_msgs::action::ToolContact::Result::ABORTED_BY_CONTROLLER ;
182+ result->result = ur_msgs::action::ToolContact::Result::ABORTED ;
183183 active_goal->setAborted (result);
184- rt_active_goal_. writeFromNonRT ( RealtimeGoalHandlePtr ()) ;
184+ should_reset_goal = true ;
185185 }
186186 if (tool_contact_active_) {
187187 tool_contact_active_ = false ;
@@ -212,7 +212,8 @@ rclcpp_action::GoalResponse ToolContactController::goal_received_callback(
212212 return rclcpp_action::GoalResponse::REJECT;
213213 }
214214
215- if (tool_contact_active_) {
215+ const auto active_goal = *rt_active_goal_.readFromNonRT ();
216+ if (active_goal) {
216217 RCLCPP_ERROR (get_node ()->get_logger (), " Tool contact already active, rejecting goal." );
217218 return rclcpp_action::GoalResponse::REJECT;
218219 }
@@ -229,22 +230,22 @@ void ToolContactController::goal_accepted_callback(
229230 rt_goal->execute ();
230231 rt_active_goal_.writeFromNonRT (rt_goal);
231232 goal_handle_timer_.reset ();
232- goal_handle_timer_ =
233- get_node ()->create_wall_timer (action_monitor_period_, std::bind (&ToolContactController::action_handler, rt_goal));
233+ auto period = std::chrono::duration_cast<std::chrono::nanoseconds>(
234+ std::chrono::nanoseconds (action_monitor_period_.nanoseconds ()));
235+ goal_handle_timer_ = get_node ()->create_wall_timer (period, std::bind (&ToolContactController::action_handler, this ));
234236 return ;
235237}
236238
237- void ToolContactController::action_handler (RealtimeGoalHandlePtr rt_goal )
239+ void ToolContactController::action_handler ()
238240{
239241 const auto active_goal = *rt_active_goal_.readFromNonRT ();
240242 if (active_goal) {
241- // Save the value if any of the goal ending conditions have been activated
242- static bool reset_goal = active_goal->req_abort_ | active_goal->req_cancel_ | active_goal->req_succeed_ ;
243243 // Allow the goal to handle any actions it needs to perform
244- rt_goal ->runNonRealtime ();
244+ active_goal ->runNonRealtime ();
245245 // If one of the goal ending conditions were met, reset our active goal pointer
246- if (reset_goal ) {
246+ if (should_reset_goal ) {
247247 rt_active_goal_.writeFromNonRT (RealtimeGoalHandlePtr ());
248+ should_reset_goal = false ;
248249 }
249250 }
250251}
@@ -259,7 +260,7 @@ rclcpp_action::CancelResponse ToolContactController::goal_cancelled_callback(
259260
260261 // Mark the current goal as canceled
261262 auto result = std::make_shared<ur_msgs::action::ToolContact::Result>();
262- result->result = ur_msgs::action::ToolContact::Result::CANCELLED_BY_USER ;
263+ result->result = ur_msgs::action::ToolContact::Result::PREEMPTED ;
263264 active_goal->setCanceled (result);
264265 rt_active_goal_.writeFromNonRT (RealtimeGoalHandlePtr ());
265266 tool_contact_abort_ = true ;
@@ -305,6 +306,7 @@ controller_interface::return_type ToolContactController::update(const rclcpp::Ti
305306 auto result = std::make_shared<ur_msgs::action::ToolContact::Result>();
306307 result->result = ur_msgs::action::ToolContact::Result::SUCCESS;
307308 active_goal->setSucceeded (result);
309+ should_reset_goal = true ;
308310 }
309311 } else if (result == 1.0 ) {
310312 tool_contact_active_ = false ;
@@ -313,8 +315,9 @@ controller_interface::return_type ToolContactController::update(const rclcpp::Ti
313315 write_success &= tool_contact_set_state_interface_->get ().set_value (TOOL_CONTACT_STANDBY);
314316 if (active_goal) {
315317 auto result = std::make_shared<ur_msgs::action::ToolContact::Result>();
316- result->result = ur_msgs::action::ToolContact::Result::ABORTED_BY_HARDWARE ;
318+ result->result = ur_msgs::action::ToolContact::Result::ABORTED ;
317319 active_goal->setAborted (result);
320+ should_reset_goal = true ;
318321 }
319322 }
320323 } break ;
@@ -327,8 +330,9 @@ controller_interface::return_type ToolContactController::update(const rclcpp::Ti
327330
328331 if (active_goal) {
329332 auto result = std::make_shared<ur_msgs::action::ToolContact::Result>();
330- result->result = ur_msgs::action::ToolContact::Result::ABORTED_BY_HARDWARE ;
333+ result->result = ur_msgs::action::ToolContact::Result::ABORTED ;
331334 active_goal->setAborted (result);
335+ should_reset_goal = true ;
332336 }
333337 } break ;
334338
@@ -348,8 +352,9 @@ controller_interface::return_type ToolContactController::update(const rclcpp::Ti
348352
349353 if (active_goal) {
350354 auto result = std::make_shared<ur_msgs::action::ToolContact::Result>();
351- result->result = ur_msgs::action::ToolContact::Result::ABORTED_BY_HARDWARE ;
355+ result->result = ur_msgs::action::ToolContact::Result::ABORTED ;
352356 active_goal->setAborted (result);
357+ should_reset_goal = true ;
353358 }
354359 } break ;
355360 case static_cast <int >(TOOL_CONTACT_STANDBY):
0 commit comments