@@ -192,26 +192,29 @@ bool ExecuteTaskSolutionCapability::constructMotionPlan(const moveit_task_constr
192
192
auto make_description = [size = solution.sub_trajectory .size ()](const std::size_t index ) {
193
193
return std::to_string (index + 1 ) + " /" + std::to_string (size);
194
194
};
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) {
201
200
const moveit_task_constructor_msgs::msg::SubTrajectory& sub_traj = solution.sub_trajectory [i];
202
201
203
202
// define individual variable for use in closure below
204
203
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)))
207
210
return false ;
208
211
if (!moveit::core::isEmpty (sub_traj.scene_diff .robot_state ) &&
209
212
!moveit::core::robotStateMsgToRobotState (sub_traj.scene_diff .robot_state , state, true )) {
210
213
RCLCPP_ERROR_STREAM (LOGGER, " invalid intermediate robot state in scene diff of subtrajectory " << description);
211
214
return false ;
212
215
}
216
+ scene_diffs.clear ();
213
217
}
214
- make_executable_trajectory (solution.sub_trajectory .back (), make_description (solution.sub_trajectory .size () - 1 ), {});
215
218
return true ;
216
219
}
217
220
0 commit comments