Skip to content

Commit dfffd77

Browse files
committed
MoveTo/MoveRel: Report errors via solution comments instead of ROS_WARN
1 parent 5de9ce7 commit dfffd77

File tree

4 files changed

+29
-23
lines changed

4 files changed

+29
-23
lines changed

core/include/moveit/task_constructor/storage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ class SolutionBase
235235

236236
inline double cost() const { return cost_; }
237237
void setCost(double cost);
238-
void markAsFailure() { setCost(std::numeric_limits<double>::infinity()); }
238+
void markAsFailure(const std::string& msg = std::string());
239239
inline bool isFailure() const { return !std::isfinite(cost_); }
240240

241241
const std::string& comment() const { return comment_; }

core/src/stages/move_relative.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,12 @@ bool MoveRelative::compute(const InterfaceState& state, planning_scene::Planning
115115
const std::string& group = props.get<std::string>("group");
116116
const moveit::core::JointModelGroup* jmg = robot_model->getJointModelGroup(group);
117117
if (!jmg) {
118-
ROS_WARN_STREAM_NAMED("MoveRelative", "Invalid joint model group: " << group);
118+
solution.markAsFailure("invalid joint model group: " + group);
119119
return false;
120120
}
121121
boost::any direction = props.get("direction");
122122
if (direction.empty()) {
123-
ROS_WARN_NAMED("MoveRelative", "direction undefined");
123+
solution.markAsFailure("undefined direction");
124124
return false;
125125
}
126126

@@ -142,15 +142,15 @@ bool MoveRelative::compute(const InterfaceState& state, planning_scene::Planning
142142
if (value.empty()) { // property undefined
143143
// determine IK link from group
144144
if (!(link = jmg->getOnlyOneEndEffectorTip())) {
145-
ROS_WARN_STREAM_NAMED("MoveRelative", "Failed to derive IK target link");
145+
solution.markAsFailure("missing ik_frame");
146146
return false;
147147
}
148148
ik_pose_msg.header.frame_id = link->getName();
149149
ik_pose_msg.pose.orientation.w = 1.0;
150150
} else {
151151
ik_pose_msg = boost::any_cast<geometry_msgs::PoseStamped>(value);
152152
if (!(link = robot_model->getLinkModel(ik_pose_msg.header.frame_id))) {
153-
ROS_WARN_STREAM_NAMED("MoveRelative", "Unknown link: " << ik_pose_msg.header.frame_id);
153+
solution.markAsFailure("unknown link for ik_frame: " + ik_pose_msg.header.frame_id);
154154
return false;
155155
}
156156
}
@@ -228,7 +228,7 @@ bool MoveRelative::compute(const InterfaceState& state, planning_scene::Planning
228228
target_eigen = link_pose;
229229
target_eigen.translation() += linear;
230230
} catch (const boost::bad_any_cast&) {
231-
ROS_ERROR_STREAM_NAMED("MoveRelative", "Invalid type for direction: " << direction.type().name());
231+
solution.markAsFailure(std::string("invalid direction type: ") + direction.type().name());
232232
return false;
233233
}
234234

@@ -306,20 +306,20 @@ void MoveRelative::computeForward(const InterfaceState& from) {
306306
planning_scene::PlanningScenePtr to;
307307
SubTrajectory trajectory;
308308

309-
if (compute(from, to, trajectory, FORWARD))
310-
sendForward(from, InterfaceState(to), std::move(trajectory));
309+
if (!compute(from, to, trajectory, FORWARD) && trajectory.comment().empty())
310+
silentFailure(); // there is nothing to report (comment is empty)
311311
else
312-
silentFailure();
312+
sendForward(from, InterfaceState(to), std::move(trajectory));
313313
}
314314

315315
void MoveRelative::computeBackward(const InterfaceState& to) {
316316
planning_scene::PlanningScenePtr from;
317317
SubTrajectory trajectory;
318318

319-
if (compute(to, from, trajectory, BACKWARD))
320-
sendBackward(InterfaceState(from), to, std::move(trajectory));
321-
else
319+
if (!compute(to, from, trajectory, BACKWARD) && trajectory.comment().empty())
322320
silentFailure();
321+
else
322+
sendBackward(InterfaceState(from), to, std::move(trajectory));
323323
}
324324
} // namespace stages
325325
} // namespace task_constructor

core/src/stages/move_to.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -197,12 +197,12 @@ bool MoveTo::compute(const InterfaceState& state, planning_scene::PlanningSceneP
197197
const std::string& group = props.get<std::string>("group");
198198
const moveit::core::JointModelGroup* jmg = robot_model->getJointModelGroup(group);
199199
if (!jmg) {
200-
ROS_WARN_STREAM_NAMED("MoveTo", "Invalid joint model group: " << group);
200+
solution.markAsFailure("invalid joint model group: " + group);
201201
return false;
202202
}
203203
boost::any goal = props.get("goal");
204204
if (goal.empty()) {
205-
ROS_WARN_NAMED("MoveTo", "goal undefined");
205+
solution.markAsFailure("undefined goal");
206206
return false;
207207
}
208208

@@ -223,22 +223,22 @@ bool MoveTo::compute(const InterfaceState& state, planning_scene::PlanningSceneP
223223
if (value.empty()) { // property undefined
224224
// determine IK link from group
225225
if (!(link = jmg->getOnlyOneEndEffectorTip())) {
226-
ROS_WARN_STREAM_NAMED("MoveTo", "Failed to derive IK target link");
226+
solution.markAsFailure("missing ik_frame");
227227
return false;
228228
}
229229
ik_pose_msg.header.frame_id = link->getName();
230230
ik_pose_msg.pose.orientation.w = 1.0;
231231
} else {
232232
ik_pose_msg = boost::any_cast<geometry_msgs::PoseStamped>(value);
233233
if (!(link = robot_model->getLinkModel(ik_pose_msg.header.frame_id))) {
234-
ROS_WARN_STREAM_NAMED("MoveTo", "Unknown link: " << ik_pose_msg.header.frame_id);
234+
solution.markAsFailure("unknown link for ik_frame: " + ik_pose_msg.header.frame_id);
235235
return false;
236236
}
237237
}
238238

239239
if (!getPoseGoal(goal, ik_pose_msg, scene, target_eigen, solution.markers()) &&
240240
!getPointGoal(goal, link, scene, target_eigen, solution.markers())) {
241-
ROS_ERROR_STREAM_NAMED("MoveTo", "Invalid type for goal: " << goal.type().name());
241+
solution.markAsFailure(std::string("invalid goal type: ") + goal.type().name());
242242
return false;
243243
}
244244

@@ -275,20 +275,20 @@ void MoveTo::computeForward(const InterfaceState& from) {
275275
planning_scene::PlanningScenePtr to;
276276
SubTrajectory trajectory;
277277

278-
if (compute(from, to, trajectory, FORWARD))
279-
sendForward(from, InterfaceState(to), std::move(trajectory));
278+
if (!compute(from, to, trajectory, FORWARD) && trajectory.comment().empty())
279+
silentFailure(); // there is nothing to report (comment is empty)
280280
else
281-
silentFailure();
281+
sendForward(from, InterfaceState(to), std::move(trajectory));
282282
}
283283

284284
void MoveTo::computeBackward(const InterfaceState& to) {
285285
planning_scene::PlanningScenePtr from;
286286
SubTrajectory trajectory;
287287

288-
if (compute(to, from, trajectory, BACKWARD))
289-
sendBackward(InterfaceState(from), to, std::move(trajectory));
290-
else
288+
if (!compute(to, from, trajectory, BACKWARD) && trajectory.comment().empty())
291289
silentFailure();
290+
else
291+
sendBackward(InterfaceState(from), to, std::move(trajectory));
292292
}
293293
} // namespace stages
294294
} // namespace task_constructor

core/src/storage.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,12 @@ void SolutionBase::setCost(double cost) {
149149
cost_ = cost;
150150
}
151151

152+
void SolutionBase::markAsFailure(const std::string& msg) {
153+
setCost(std::numeric_limits<double>::infinity());
154+
if (!msg.empty())
155+
setComment(msg + "\n" + comment());
156+
}
157+
152158
void SolutionBase::fillInfo(moveit_task_constructor_msgs::SolutionInfo& info, Introspection* introspection) const {
153159
info.id = introspection ? introspection->solutionId(*this) : 0;
154160
info.cost = this->cost();

0 commit comments

Comments
 (0)