@@ -192,26 +192,29 @@ bool ExecuteTaskSolutionCapability::constructMotionPlan(const moveit_task_constr
192192 auto make_description = [size = solution.sub_trajectory .size ()](const std::size_t index) {
193193 return std::to_string (index + 1 ) + " /" + std::to_string (size);
194194 };
195- // TODO: Case for only one subtrajectory
196- if (!make_executable_trajectory (solution.sub_trajectory [0 ], make_description (0 ),
197- make_apply_planning_scene_diff_cb ({ solution.sub_trajectory [0 ].scene_diff ,
198- solution.sub_trajectory [1 ].scene_diff })))
199- return false ;
200- for (size_t i = 1 ; i < solution.sub_trajectory .size () - 1 ; ++i) {
195+
196+ // always include initial scene diff
197+ std::vector<moveit_msgs::msg::PlanningScene> scene_diffs = { solution.sub_trajectory [0 ].scene_diff };
198+ scene_diffs.reserve (1 ); // number of diffs used by all sub trajectories besides the first one
199+ for (size_t i = 0 ; i < solution.sub_trajectory .size (); ++i) {
201200 const moveit_task_constructor_msgs::msg::SubTrajectory& sub_traj = solution.sub_trajectory [i];
202201
203202 // define individual variable for use in closure below
204203 const std::string description = make_description (i);
205- if (!make_executable_trajectory (sub_traj, description,
206- make_apply_planning_scene_diff_cb ({ solution.sub_trajectory [i + 1 ].scene_diff })))
204+
205+ // apply scene diff of following sub trajectory
206+ if (i < solution.sub_trajectory .size () - 1 ) {
207+ scene_diffs.push_back (solution.sub_trajectory [i + 1 ].scene_diff );
208+ }
209+ if (!make_executable_trajectory (sub_traj, description, make_apply_planning_scene_diff_cb (scene_diffs)))
207210 return false ;
208211 if (!moveit::core::isEmpty (sub_traj.scene_diff .robot_state ) &&
209212 !moveit::core::robotStateMsgToRobotState (sub_traj.scene_diff .robot_state , state, true )) {
210213 RCLCPP_ERROR_STREAM (LOGGER, " invalid intermediate robot state in scene diff of subtrajectory " << description);
211214 return false ;
212215 }
216+ scene_diffs.clear ();
213217 }
214- make_executable_trajectory (solution.sub_trajectory .back (), make_description (solution.sub_trajectory .size () - 1 ), {});
215218 return true ;
216219}
217220
0 commit comments