@@ -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
184183SolutionSequencePtr
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