Skip to content

Commit 7d1737f

Browse files
author
Felix Exner (fexner)
authored
Updated scaled JTC to latest JTC updates (#1067)
1 parent a761807 commit 7d1737f

File tree

1 file changed

+36
-22
lines changed

1 file changed

+36
-22
lines changed

ur_controllers/src/scaled_joint_trajectory_controller.cpp

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

Comments
 (0)