Skip to content

Commit ecc7213

Browse files
committed
fixup! Add planner name to trajectory info (moveit#490)
1 parent 8d74d35 commit ecc7213

File tree

7 files changed

+58
-80
lines changed

7 files changed

+58
-80
lines changed

core/include/moveit/task_constructor/solvers/cartesian_path.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ class CartesianPath : public PlannerInterface
7272
double timeout, robot_trajectory::RobotTrajectoryPtr& result,
7373
const moveit_msgs::msg::Constraints& path_constraints = moveit_msgs::msg::Constraints()) override;
7474

75-
std::string getPlannerId() const override { return std::string("CartesianPath"); }
75+
std::string getPlannerId() const override { return "CartesianPath"; }
7676
};
7777
} // namespace solvers
7878
} // namespace task_constructor

core/include/moveit/task_constructor/solvers/joint_interpolation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class JointInterpolationPlanner : public PlannerInterface
6767
double timeout, robot_trajectory::RobotTrajectoryPtr& result,
6868
const moveit_msgs::msg::Constraints& path_constraints = moveit_msgs::msg::Constraints()) override;
6969

70-
std::string getPlannerId() const override { return std::string("JointInterpolationPlanner"); }
70+
std::string getPlannerId() const override { return "JointInterpolationPlanner"; }
7171
};
7272
} // namespace solvers
7373
} // namespace task_constructor

core/include/moveit/task_constructor/solvers/pipeline_planner.h

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,7 @@ class PipelinePlanner : public PlannerInterface
137137
robot_trajectory::RobotTrajectoryPtr& result,
138138
const moveit_msgs::msg::Constraints& path_constraints = moveit_msgs::msg::Constraints()) override;
139139

140-
/**
141-
* \brief Get planner name
142-
* \return Name of the last successful planner
143-
*/
144-
std::string getPlannerId() const override;
140+
std::string getPlannerId() const override { return last_successful_planner_; }
145141

146142
protected:
147143
/** \brief Actual plan() implementation, targeting the given goal_constraints.

core/include/moveit/task_constructor/stages/connect.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ class Connect : public Connecting
7575

7676
struct PlannerIdTrajectoryPair
7777
{
78-
std::string planner_name;
79-
robot_trajectory::RobotTrajectoryConstPtr robot_trajectory_ptr;
78+
std::string planner_id;
79+
robot_trajectory::RobotTrajectoryConstPtr trajectory;
8080
};
8181

8282
using GroupPlannerVector = std::vector<std::pair<std::string, solvers::PlannerInterfacePtr>>;
@@ -91,10 +91,10 @@ class Connect : public Connecting
9191
void compute(const InterfaceState& from, const InterfaceState& to) override;
9292

9393
protected:
94-
SolutionSequencePtr makeSequential(const std::vector<PlannerIdTrajectoryPair>& trajectory_planner_vector,
94+
SolutionSequencePtr makeSequential(const std::vector<PlannerIdTrajectoryPair>& sub_trajectories,
9595
const std::vector<planning_scene::PlanningSceneConstPtr>& intermediate_scenes,
9696
const InterfaceState& from, const InterfaceState& to);
97-
SubTrajectoryPtr merge(const std::vector<PlannerIdTrajectoryPair>& trajectory_planner_vector,
97+
SubTrajectoryPtr merge(const std::vector<PlannerIdTrajectoryPair>& sub_trajectories,
9898
const std::vector<planning_scene::PlanningSceneConstPtr>& intermediate_scenes,
9999
const moveit::core::RobotState& state);
100100

core/include/moveit/task_constructor/storage.h

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -275,8 +275,8 @@ class SolutionBase
275275
public:
276276
virtual ~SolutionBase() = default;
277277

278-
[[nodiscard]] inline const InterfaceState* start() const { return start_; }
279-
[[nodiscard]] inline const InterfaceState* end() const { return end_; }
278+
inline const InterfaceState* start() const { return start_; }
279+
inline const InterfaceState* end() const { return end_; }
280280

281281
/** Set the solution's start_state_
282282
*
@@ -298,21 +298,21 @@ class SolutionBase
298298
const_cast<InterfaceState&>(state).addIncoming(this);
299299
}
300300

301-
[[nodiscard]] inline const Stage* creator() const { return creator_; }
301+
inline const Stage* creator() const { return creator_; }
302302
void setCreator(Stage* creator);
303303

304-
[[nodiscard]] inline double cost() const { return cost_; }
304+
inline double cost() const { return cost_; }
305305
void setCost(double cost);
306306
void markAsFailure(const std::string& msg = std::string());
307-
[[nodiscard]] inline bool isFailure() const { return !std::isfinite(cost_); }
307+
inline bool isFailure() const { return !std::isfinite(cost_); }
308308

309-
[[nodiscard]] const std::string& plannerId() const { return planner_id_; }
310-
void setPlannerId(const std::string& planner_id) { planner_id_ = planner_id; }
311-
312-
[[nodiscard]] const std::string& comment() const { return comment_; }
309+
const std::string& comment() const { return comment_; }
313310
void setComment(const std::string& comment) { comment_ = comment; }
314311

315-
[[nodiscard]] auto& markers() { return markers_; }
312+
const std::string& plannerId() const { return planner_id_; }
313+
void setPlannerId(const std::string& planner_id) { planner_id_ = planner_id; }
314+
315+
auto& markers() { return markers_; }
316316
const auto& markers() const { return markers_; }
317317

318318
/// convert solution to message
@@ -329,19 +329,18 @@ class SolutionBase
329329
bool operator<(const SolutionBase& other) const { return this->cost_ < other.cost_; }
330330

331331
protected:
332-
SolutionBase(Stage* creator = nullptr, double cost = 0.0, std::string comment = std::string(""),
333-
std::string planner_id = std::string(""))
334-
: creator_(creator), cost_(cost), planner_id_(std::move(planner_id)), comment_(std::move(comment)) {}
332+
SolutionBase(Stage* creator = nullptr, double cost = 0.0, std::string comment = "", std::string planner_id = "")
333+
: creator_(creator), cost_(cost), comment_(std::move(comment)), planner_id_(std::move(planner_id)) {}
335334

336335
private:
337336
// back-pointer to creating stage, allows to access sub-solutions
338337
Stage* creator_;
339338
// associated cost
340339
double cost_;
341-
// name of the planner used to create this solution
342-
std::string planner_id_;
343340
// comment for this solution, e.g. explanation of failure
344341
std::string comment_;
342+
// name of the planner used to create this solution
343+
std::string planner_id_;
345344
// markers for this solution, e.g. target frame or collision indicators
346345
std::deque<visualization_msgs::msg::Marker> markers_;
347346

@@ -357,7 +356,7 @@ class SubTrajectory : public SolutionBase
357356
public:
358357
SubTrajectory(
359358
const robot_trajectory::RobotTrajectoryConstPtr& trajectory = robot_trajectory::RobotTrajectoryConstPtr(),
360-
double cost = 0.0, std::string comment = std::string(""), std::string planner_id = std::string(""))
359+
double cost = 0.0, std::string comment = "", std::string planner_id = "")
361360
: SolutionBase(nullptr, cost, std::move(comment), std::move(planner_id)), trajectory_(trajectory) {}
362361

363362
robot_trajectory::RobotTrajectoryConstPtr trajectory() const { return trajectory_; }

core/src/solvers/pipeline_planner.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ PipelinePlanner::PipelinePlanner(
6060
const moveit::planning_pipeline_interfaces::StoppingCriterionFunction& stopping_criterion_callback,
6161
const moveit::planning_pipeline_interfaces::SolutionSelectionFunction& solution_selection_function)
6262
: node_(node)
63-
, last_successful_planner_("")
6463
, stopping_criterion_callback_(stopping_criterion_callback)
6564
, solution_selection_function_(solution_selection_function) {
6665
// Declare properties of the MotionPlanRequest
@@ -148,8 +147,6 @@ bool PipelinePlanner::plan(const planning_scene::PlanningSceneConstPtr& from, co
148147
const moveit::core::JointModelGroup* joint_model_group, double timeout,
149148
robot_trajectory::RobotTrajectoryPtr& result,
150149
const moveit_msgs::msg::Constraints& path_constraints) {
151-
last_successful_planner_.clear();
152-
153150
// Construct a Cartesian target pose from the given target transform and offset
154151
geometry_msgs::msg::PoseStamped target;
155152
target.header.frame_id = from->getPlanningFrame();
@@ -168,6 +165,7 @@ bool PipelinePlanner::plan(const planning_scene::PlanningSceneConstPtr& planning
168165
robot_trajectory::RobotTrajectoryPtr& result,
169166
const moveit_msgs::msg::Constraints& path_constraints) {
170167
const auto& map = properties().get<PipelineMap>("pipeline_id_planner_id_map");
168+
last_successful_planner_ = "Unknown";
171169

172170
// Create a request for every planning pipeline that should run in parallel
173171
std::vector<moveit_msgs::msg::MotionPlanRequest> requests;
@@ -214,9 +212,6 @@ bool PipelinePlanner::plan(const planning_scene::PlanningSceneConstPtr& planning
214212
}
215213
return false;
216214
}
217-
std::string PipelinePlanner::getPlannerId() const {
218-
return last_successful_planner_.empty() ? std::string("Unknown") : last_successful_planner_;
219-
}
220215
} // namespace solvers
221216
} // namespace task_constructor
222217
} // namespace moveit

core/src/stages/connect.cpp

Lines changed: 35 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ void Connect::compute(const InterfaceState& from, const InterfaceState& to) {
141141
const auto& path_constraints = props.get<moveit_msgs::msg::Constraints>("path_constraints");
142142

143143
const moveit::core::RobotState& final_goal_state = to.scene()->getCurrentState();
144-
std::vector<PlannerIdTrajectoryPair> trajectory_planner_vector;
144+
std::vector<PlannerIdTrajectoryPair> sub_trajectories;
145145

146146
std::vector<planning_scene::PlanningSceneConstPtr> intermediate_scenes;
147147
planning_scene::PlanningSceneConstPtr start = from.scene();
@@ -161,7 +161,7 @@ void Connect::compute(const InterfaceState& from, const InterfaceState& to) {
161161

162162
robot_trajectory::RobotTrajectoryPtr trajectory;
163163
success = pair.second->plan(start, end, jmg, timeout, trajectory, path_constraints);
164-
trajectory_planner_vector.push_back(PlannerIdTrajectoryPair({ pair.second->getPlannerId(), trajectory }));
164+
sub_trajectories.push_back({ pair.second->getPlannerId(), trajectory });
165165

166166
if (!success)
167167
break;
@@ -172,41 +172,40 @@ void Connect::compute(const InterfaceState& from, const InterfaceState& to) {
172172

173173
SolutionBasePtr solution;
174174
if (success && mode != SEQUENTIAL) // try to merge
175-
solution = merge(trajectory_planner_vector, intermediate_scenes, from.scene()->getCurrentState());
175+
solution = merge(sub_trajectories, intermediate_scenes, from.scene()->getCurrentState());
176176
if (!solution) // success == false or merging failed: store sequentially
177-
solution = makeSequential(trajectory_planner_vector, intermediate_scenes, from, to);
177+
solution = makeSequential(sub_trajectories, intermediate_scenes, from, to);
178178
if (!success) // error during sequential planning
179179
solution->markAsFailure();
180-
181180
connect(from, to, solution);
182181
}
183182

184183
SolutionSequencePtr
185-
Connect::makeSequential(const std::vector<PlannerIdTrajectoryPair>& trajectory_planner_vector,
184+
Connect::makeSequential(const std::vector<PlannerIdTrajectoryPair>& sub_trajectories,
186185
const std::vector<planning_scene::PlanningSceneConstPtr>& intermediate_scenes,
187186
const InterfaceState& from, const InterfaceState& to) {
188-
assert(!trajectory_planner_vector.empty());
189-
assert(trajectory_planner_vector.size() + 1 == intermediate_scenes.size());
187+
assert(!sub_trajectories.empty());
188+
assert(sub_trajectories.size() + 1 == intermediate_scenes.size());
190189

191190
/* We need to decouple the sequence of subsolutions, created here, from the external from and to states.
192191
Hence, we create new interface states for all subsolutions. */
193192
const InterfaceState* start = &*states_.insert(states_.end(), InterfaceState(from.scene()));
194193

195194
auto scene_it = intermediate_scenes.begin();
196195
SolutionSequence::container_type sub_solutions;
197-
for (const auto& pair : trajectory_planner_vector) {
196+
for (const auto& sub : sub_trajectories) {
198197
// persistently store sub solution
199-
auto inserted = subsolutions_.insert(
200-
subsolutions_.end(), SubTrajectory(pair.robot_trajectory_ptr, 0.0, std::string(""), pair.planner_name));
198+
auto inserted = subsolutions_.insert(subsolutions_.end(),
199+
SubTrajectory(sub.trajectory, 0.0, std::string(""), sub.planner_id));
201200
inserted->setCreator(this);
202-
if (!pair.robot_trajectory_ptr) // a null RobotTrajectoryPtr indicates a failure
201+
if (!sub.trajectory) // a null RobotTrajectoryPtr indicates a failure
203202
inserted->markAsFailure();
204203
// push back solution pointer
205204
sub_solutions.push_back(&*inserted);
206205

207206
// create a new end state, either from intermediate or final planning scene
208207
planning_scene::PlanningSceneConstPtr end_ps =
209-
(sub_solutions.size() < trajectory_planner_vector.size()) ? *++scene_it : to.scene();
208+
(sub_solutions.size() < sub_trajectories.size()) ? *++scene_it : to.scene();
210209
const InterfaceState* end = &*states_.insert(states_.end(), InterfaceState(end_ps));
211210

212211
// provide newly created start/end states
@@ -219,50 +218,39 @@ Connect::makeSequential(const std::vector<PlannerIdTrajectoryPair>& trajectory_p
219218
return std::make_shared<SolutionSequence>(std::move(sub_solutions));
220219
}
221220

222-
SubTrajectoryPtr Connect::merge(const std::vector<PlannerIdTrajectoryPair>& trajectory_planner_vector,
221+
SubTrajectoryPtr Connect::merge(const std::vector<PlannerIdTrajectoryPair>& sub_trajectories,
223222
const std::vector<planning_scene::PlanningSceneConstPtr>& intermediate_scenes,
224223
const moveit::core::RobotState& state) {
225224
// no need to merge if there is only a single sub trajectory
226-
if (trajectory_planner_vector.size() == 1)
227-
return std::make_shared<SubTrajectory>(trajectory_planner_vector.at(0).robot_trajectory_ptr, 0.0, std::string(""),
228-
trajectory_planner_vector.at(0).planner_name);
225+
if (sub_trajectories.size() == 1)
226+
return std::make_shared<SubTrajectory>(sub_trajectories.at(0).trajectory, 0.0, std::string(""),
227+
sub_trajectories.at(0).planner_id);
228+
229+
// split sub_trajectories into trajectories and joined planner_ids
230+
std::string planner_ids;
231+
std::vector<robot_trajectory::RobotTrajectoryConstPtr> subs;
232+
subs.reserve(sub_trajectories.size());
233+
for (auto it = sub_trajectories.begin(); it != sub_trajectories.end(); ++it) {
234+
subs.push_back(it->trajectory);
235+
if (it != sub_trajectories.begin())
236+
planner_ids += ", ";
237+
planner_ids += it->planner_id;
238+
}
229239

230240
auto jmg = merged_jmg_.get();
231241
assert(jmg);
232242
auto timing = properties().get<TimeParameterizationPtr>("merge_time_parameterization");
233-
robot_trajectory::RobotTrajectoryPtr merged_trajectory = task_constructor::merge(
234-
[&]() {
235-
// Move trajectories into single vector
236-
std::vector<robot_trajectory::RobotTrajectoryConstPtr> robot_traj_vector;
237-
robot_traj_vector.reserve(trajectory_planner_vector.size());
238-
239-
// Copy second elements of robot planner vector into separate vector
240-
std::transform(begin(trajectory_planner_vector), end(trajectory_planner_vector),
241-
std::back_inserter(robot_traj_vector),
242-
[](auto const& pair) { return pair.robot_trajectory_ptr; });
243-
return robot_traj_vector;
244-
}(),
245-
state, jmg, *timing);
246-
247-
// check merged trajectory is empty or has collisions
248-
if (!merged_trajectory ||
249-
!intermediate_scenes.front()->isPathValid(*merged_trajectory,
250-
properties().get<moveit_msgs::msg::Constraints>("path_constraints"))) {
243+
robot_trajectory::RobotTrajectoryPtr trajectory = task_constructor::merge(subs, state, jmg, *timing);
244+
if (!trajectory)
251245
return SubTrajectoryPtr();
252-
}
253246

254-
// Copy first elements of robot planner vector into separate vector
255-
std::vector<std::string> planner_names;
256-
planner_names.reserve(trajectory_planner_vector.size());
257-
std::transform(begin(trajectory_planner_vector), end(trajectory_planner_vector), std::back_inserter(planner_names),
258-
[](auto const& pair) { return pair.planner_name; });
247+
// check merged trajectory for collisions
248+
if (!intermediate_scenes.front()->isPathValid(*trajectory,
249+
properties().get<moveit_msgs::msg::Constraints>("path_constraints")))
250+
return SubTrajectoryPtr();
259251

260-
// Create a sequence of planner names
261-
std::string planner_name_sequence;
262-
for (auto const& name : planner_names) {
263-
planner_name_sequence += std::string(", " + name);
264-
}
265-
return std::make_shared<SubTrajectory>(merged_trajectory, 0.0, std::string(""), planner_name_sequence);
252+
return std::make_shared<SubTrajectory>(trajectory);
253+
return std::make_shared<SubTrajectory>(trajectory, 0.0, std::string(""), planner_ids);
266254
}
267255
} // namespace stages
268256
} // namespace task_constructor

0 commit comments

Comments
 (0)