Skip to content

Commit dd7ebbf

Browse files
henningkaysersjahr
andauthored
Handle case where execute is called with single SubTrajectory (#6)
Co-authored-by: Sebastian Jahr <[email protected]>
1 parent 905b78b commit dd7ebbf

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

capabilities/src/execute_task_solution_capability.cpp

+12-9
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)