50 namespace task_constructor {
59 p.declare<
double>(
"max_distance", 1e-2,
60 "maximally accepted joint configuration distance between trajectory endpoint and goal state");
61 p.declare<moveit_msgs::Constraints>(
"path_constraints", moveit_msgs::Constraints(),
62 "constraints to maintain during trajectory");
64 std::make_shared<TimeOptimalTrajectoryGeneration>());
79 errors.
push_back(*
this,
"empty set of groups");
81 std::vector<const moveit::core::JointModelGroup*> groups;
82 for (
const GroupPlannerVector::value_type& pair :
planner_) {
83 if (!robot_model->hasJointModelGroup(pair.first))
84 errors.
push_back(*
this,
"invalid group: " + pair.first);
85 else if (!pair.second)
86 errors.
push_back(*
this,
"invalid planner for group: " + pair.first);
88 pair.second->init(robot_model);
90 auto jmg = robot_model->getJointModelGroup(pair.first);
91 groups.push_back(jmg);
95 if (!errors && groups.size() >= 2 && !
merged_jmg_) {
98 }
catch (
const std::runtime_error& e) {
115 std::set<std::string> planned_joint_names;
116 for (
const GroupPlannerVector::value_type& pair :
planner_) {
119 planned_joint_names.insert(names.begin(), names.end());
123 if (planned_joint_names.count(jm->getName()))
126 const unsigned int num = jm->getVariableCount();
127 Eigen::Map<const Eigen::VectorXd> positions_from(from.
getJointPositions(jm), num);
129 if (!(positions_from - positions_to).isZero(1e-4)) {
131 positions_from.transpose(), positions_to.transpose()));
142 double max_distance = props.get<
double>(
"max_distance");
143 const auto& path_constraints = props.get<moveit_msgs::Constraints>(
"path_constraints");
146 std::vector<robot_trajectory::RobotTrajectoryConstPtr> sub_trajectories;
148 std::vector<planning_scene::PlanningSceneConstPtr> intermediate_scenes;
149 planning_scene::PlanningSceneConstPtr
start = from.
scene();
150 intermediate_scenes.push_back(
start);
153 std::string comment =
"No planners specified";
154 std::vector<double> positions;
155 for (
const GroupPlannerVector::value_type& pair :
planner_) {
157 planning_scene::PlanningScenePtr end =
start->diff();
159 final_goal_state.copyJointGroupPositions(jmg, positions);
163 intermediate_scenes.push_back(end);
165 robot_trajectory::RobotTrajectoryPtr trajectory;
166 auto result = pair.second->plan(
start, end, jmg,
timeout, trajectory, path_constraints);
168 sub_trajectories.push_back(trajectory);
171 comment = result.message;
175 if (trajectory->getLastWayPoint().distance(goal_state, jmg) > max_distance) {
177 comment =
"Trajectory end-point deviates too much from goal state";
185 SolutionBasePtr solution;
187 solution =
merge(sub_trajectories, intermediate_scenes, from.
scene()->getCurrentState());
189 solution =
makeSequential(sub_trajectories, intermediate_scenes, from, to);
191 solution->markAsFailure(comment);
197 const std::vector<planning_scene::PlanningSceneConstPtr>& intermediate_scenes,
199 assert(!sub_trajectories.empty());
200 assert(sub_trajectories.size() + 1 == intermediate_scenes.size());
206 auto scene_it = intermediate_scenes.begin();
208 for (
const auto& sub : sub_trajectories) {
211 inserted->setCreator(
this);
213 inserted->markAsFailure();
215 sub_solutions.push_back(&*inserted);
218 planning_scene::PlanningSceneConstPtr end_ps =
219 (sub_solutions.size() < sub_trajectories.size()) ? *++scene_it : to.
scene();
229 return std::make_shared<SolutionSequence>(std::move(sub_solutions));
232 SubTrajectoryPtr
Connect::merge(
const std::vector<robot_trajectory::RobotTrajectoryConstPtr>& sub_trajectories,
233 const std::vector<planning_scene::PlanningSceneConstPtr>& intermediate_scenes,
236 if (sub_trajectories.size() == 1)
237 return std::make_shared<SubTrajectory>(sub_trajectories[0]);
241 auto timing =
properties().
get<TimeParameterizationPtr>(
"merge_time_parameterization");
244 return SubTrajectoryPtr();
247 if (!intermediate_scenes.front()->isPathValid(*trajectory,
248 properties().get<moveit_msgs::Constraints>(
"path_constraints")))
249 return SubTrajectoryPtr();
251 return std::make_shared<SubTrajectory>(trajectory);