@@ -86,10 +86,11 @@ controller_interface::return_type ScaledJointTrajectoryController::update(const
8686 if (get_state ().id () == lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE) {
8787 return controller_interface::return_type::OK;
8888 }
89+ auto logger = this ->get_node ()->get_logger ();
8990 // update dynamic parameters
9091 if (param_listener_->is_old (params_)) {
9192 params_ = param_listener_->get_params ();
92- default_tolerances_ = get_segment_tolerances (params_);
93+ default_tolerances_ = get_segment_tolerances (logger, params_);
9394 }
9495
9596 auto compute_error_for_joint = [&](JointTrajectoryPoint& error, int index, const JointTrajectoryPoint& current,
@@ -138,6 +139,7 @@ controller_interface::return_type ScaledJointTrajectoryController::update(const
138139
139140 // currently carrying out a trajectory
140141 if (has_active_trajectory ()) {
142+ // Main Speed scaling difference...
141143 // Adjust time with scaling factor
142144 TimeData time_data;
143145 time_data.time = time;
@@ -153,9 +155,10 @@ controller_interface::return_type ScaledJointTrajectoryController::update(const
153155 if (!traj_external_point_ptr_->is_sampled_already ()) {
154156 first_sample = true ;
155157 if (params_.open_loop_control ) {
156- traj_external_point_ptr_->set_point_before_trajectory_msg (traj_time, last_commanded_state_);
158+ traj_external_point_ptr_->set_point_before_trajectory_msg (traj_time, last_commanded_state_,
159+ joints_angle_wraparound_);
157160 } else {
158- traj_external_point_ptr_->set_point_before_trajectory_msg (traj_time, state_current_);
161+ traj_external_point_ptr_->set_point_before_trajectory_msg (traj_time, state_current_, joints_angle_wraparound_ );
159162 }
160163 }
161164
@@ -178,12 +181,13 @@ controller_interface::return_type ScaledJointTrajectoryController::update(const
178181 bool outside_goal_tolerance = false ;
179182 bool within_goal_time = true ;
180183 const bool before_last_point = end_segment_itr != traj_external_point_ptr_->end ();
184+ auto active_tol = active_tolerances_.readFromRT ();
181185
182186 // have we reached the end, are not holding position, and is a timeout configured?
183187 // Check independently of other tolerances
184188 if (!before_last_point && *(rt_is_holding_.readFromRT ()) == false && cmd_timeout_ > 0.0 &&
185189 time_difference > cmd_timeout_) {
186- RCLCPP_WARN (get_node ()-> get_logger () , " Aborted due to command timeout" );
190+ RCLCPP_WARN (logger , " Aborted due to command timeout" );
187191
188192 traj_msg_external_point_ptr_.reset ();
189193 traj_msg_external_point_ptr_.initRT (set_hold_position ());
@@ -195,21 +199,25 @@ controller_interface::return_type ScaledJointTrajectoryController::update(const
195199
196200 // Always check the state tolerance on the first sample in case the first sample
197201 // is the last point
198- if ((before_last_point || first_sample) &&
199- !check_state_tolerance_per_joint (state_error_, index, default_tolerances_.state_tolerance [index], false ) &&
200- *(rt_is_holding_.readFromRT ()) == false ) {
202+ // print output per default, goal will be aborted afterwards
203+ if ((before_last_point || first_sample) && *(rt_is_holding_.readFromRT ()) == false &&
204+ !check_state_tolerance_per_joint (state_error_, index, active_tol->state_tolerance [index],
205+ true /* show_errors */ )) {
201206 tolerance_violated_while_moving = true ;
202207 }
203208 // past the final point, check that we end up inside goal tolerance
204- if (!before_last_point &&
205- !check_state_tolerance_per_joint (state_error_, index, default_tolerances_.goal_state_tolerance [index],
206- false ) &&
207- *(rt_is_holding_.readFromRT ()) == false ) {
209+ if (!before_last_point && *(rt_is_holding_.readFromRT ()) == false &&
210+ !check_state_tolerance_per_joint (state_error_, index, active_tol->goal_state_tolerance [index],
211+ false /* show_errors */ )) {
208212 outside_goal_tolerance = true ;
209213
210- if (default_tolerances_.goal_time_tolerance != 0.0 ) {
211- if (time_difference > default_tolerances_.goal_time_tolerance ) {
214+ if (active_tol->goal_time_tolerance != 0.0 ) {
215+ // if we exceed goal_time_tolerance set it to aborted
216+ if (time_difference > active_tol->goal_time_tolerance ) {
212217 within_goal_time = false ;
218+ // print once, goal will be aborted afterwards
219+ check_state_tolerance_per_joint (state_error_, index, default_tolerances_.goal_state_tolerance [index],
220+ true /* show_errors */ );
213221 }
214222 }
215223 }
@@ -263,54 +271,60 @@ controller_interface::return_type ScaledJointTrajectoryController::update(const
263271 if (tolerance_violated_while_moving) {
264272 auto result = std::make_shared<FollowJTrajAction::Result>();
265273 result->set__error_code (FollowJTrajAction::Result::PATH_TOLERANCE_VIOLATED);
274+ result->set__error_string (" Aborted due to path tolerance violation" );
266275 active_goal->setAborted (result);
267276 // TODO(matthew-reynolds): Need a lock-free write here
268277 // See https://github.com/ros-controls/ros2_controllers/issues/168
269278 rt_active_goal_.writeFromNonRT (RealtimeGoalHandlePtr ());
270279 rt_has_pending_goal_.writeFromNonRT (false );
271280
272- RCLCPP_WARN (get_node ()-> get_logger () , " Aborted due to state tolerance violation" );
281+ RCLCPP_WARN (logger , " Aborted due to state tolerance violation" );
273282
274283 traj_msg_external_point_ptr_.reset ();
275284 traj_msg_external_point_ptr_.initRT (set_hold_position ());
276285 } else if (!before_last_point) {
286+ // check goal tolerance
277287 if (!outside_goal_tolerance) {
278- auto res = std::make_shared<FollowJTrajAction::Result>();
279- res->set__error_code (FollowJTrajAction::Result::SUCCESSFUL);
280- active_goal->setSucceeded (res);
288+ auto result = std::make_shared<FollowJTrajAction::Result>();
289+ result->set__error_code (FollowJTrajAction::Result::SUCCESSFUL);
290+ result->set__error_string (" Goal successfully reached!" );
291+ active_goal->setSucceeded (result);
281292 // TODO(matthew-reynolds): Need a lock-free write here
282293 // See https://github.com/ros-controls/ros2_controllers/issues/168
283294 rt_active_goal_.writeFromNonRT (RealtimeGoalHandlePtr ());
284295 rt_has_pending_goal_.writeFromNonRT (false );
285296
286- RCLCPP_INFO (get_node ()-> get_logger () , " Goal reached, success!" );
297+ RCLCPP_INFO (logger , " Goal reached, success!" );
287298
288299 traj_msg_external_point_ptr_.reset ();
289300 traj_msg_external_point_ptr_.initRT (set_success_trajectory_point ());
290301 } else if (!within_goal_time) {
302+ const std::string error_string =
303+ " Aborted due to goal_time_tolerance exceeding by " + std::to_string (time_difference) + " seconds" ;
304+
291305 auto result = std::make_shared<FollowJTrajAction::Result>();
292306 result->set__error_code (FollowJTrajAction::Result::GOAL_TOLERANCE_VIOLATED);
307+ result->set__error_string (error_string);
293308 active_goal->setAborted (result);
294309 // TODO(matthew-reynolds): Need a lock-free write here
295310 // See https://github.com/ros-controls/ros2_controllers/issues/168
296311 rt_active_goal_.writeFromNonRT (RealtimeGoalHandlePtr ());
297312 rt_has_pending_goal_.writeFromNonRT (false );
298313
299- RCLCPP_WARN (get_node ()->get_logger (), " Aborted due goal_time_tolerance exceeding by %f seconds" ,
300- time_difference);
314+ RCLCPP_WARN (logger, error_string.c_str ());
301315
302316 traj_msg_external_point_ptr_.reset ();
303317 traj_msg_external_point_ptr_.initRT (set_hold_position ());
304318 }
305319 }
306320 } else if (tolerance_violated_while_moving && *(rt_has_pending_goal_.readFromRT ()) == false ) {
307321 // we need to ensure that there is no pending goal -> we get a race condition otherwise
308- RCLCPP_ERROR (get_node ()-> get_logger () , " Holding position due to state tolerance violation" );
322+ RCLCPP_ERROR (logger , " Holding position due to state tolerance violation" );
309323
310324 traj_msg_external_point_ptr_.reset ();
311325 traj_msg_external_point_ptr_.initRT (set_hold_position ());
312326 } else if (!before_last_point && !within_goal_time && *(rt_has_pending_goal_.readFromRT ()) == false ) {
313- RCLCPP_ERROR (get_node ()-> get_logger () , " Exceeded goal_time_tolerance: holding position..." );
327+ RCLCPP_ERROR (logger , " Exceeded goal_time_tolerance: holding position..." );
314328
315329 traj_msg_external_point_ptr_.reset ();
316330 traj_msg_external_point_ptr_.initRT (set_hold_position ());
0 commit comments