3232 *  POSSIBILITY OF SUCH DAMAGE. 
3333 *********************************************************************/  
3434
35- /*  Authors: Robert Haschke
36-    Desc:    plan using  MoveIt's PlanningPipeline  
35+ /*  Authors: Robert Haschke, Sebastian Jahr 
36+    Description: Solver that uses a set of  MoveIt PlanningPipelines to solve a given planning problem.  
3737*/ 
3838
3939#pragma  once
4040
4141#include  < moveit/task_constructor/solvers/planner_interface.h> 
42+ #include  < moveit/planning_pipeline_interfaces/planning_pipeline_interfaces.hpp> 
43+ #include  < moveit/planning_pipeline_interfaces/solution_selection_functions.hpp> 
44+ #include  < moveit/planning_pipeline_interfaces/stopping_criterion_functions.hpp> 
4245#include  < rclcpp/node.hpp> 
4346#include  < moveit/macros/class_forward.h> 
4447
@@ -56,48 +59,132 @@ MOVEIT_CLASS_FORWARD(PipelinePlanner);
5659class  PipelinePlanner  : public  PlannerInterface 
5760{
5861public: 
59- 	struct  Specification 
60- 	{
61- 		moveit::core::RobotModelConstPtr model;
62- 		std::string ns{ " ompl"   };
63- 		std::string pipeline{ " ompl"   };
64- 		std::string adapter_param{ " request_adapters"   };
65- 	};
66- 
67- 	static  planning_pipeline::PlanningPipelinePtr create (const  rclcpp::Node::SharedPtr& node,
68- 	                                                     const  moveit::core::RobotModelConstPtr& model) {
69- 		Specification spec;
70- 		spec.model  = model;
71- 		return  create (node, spec);
62+ 	/* * Simple Constructor to use only a single pipeline
63+ 	 * \param [in] node ROS 2 node 
64+ 	 * \param [in] pipeline_name Name of the planning pipeline to be used. This is also the assumed namespace where the 
65+ 	 * parameters of this pipeline can be found \param [in] planner_id Planner id to be used for planning 
66+ 	 */  
67+ 	PipelinePlanner (const  rclcpp::Node::SharedPtr& node, const  std::string& pipeline_name = " ompl"  ,
68+ 	                const  std::string& planner_id = " "  );
69+ 
70+ 	[[deprecated(" Deprecated: Use new constructor implementations."  )]]  //  clang-format off
71+ 	PipelinePlanner (const  planning_pipeline::PlanningPipelinePtr& /* planning_pipeline*/  ){};
72+ 
73+ 	/* * \brief Constructor
74+ 	 * \param [in] node ROS 2 node 
75+ 	 * \param [in] pipeline_id_planner_id_map A map containing pairs of planning pipeline name and planner plugin name 
76+ 	 * for the planning requests 
77+ 	 * \param [in] planning_pipelines Optional: A map with the pipeline names and initialized corresponding planning 
78+ 	 * pipelines 
79+ 	 * \param [in] stopping_criterion_callback Callback function to stop parallel planning pipeline according to a user defined criteria 
80+ 	 * \param [in] solution_selection_function Callback function to choose the best solution when multiple pipelines are used 
81+ 	 */  
82+ 	PipelinePlanner (const  rclcpp::Node::SharedPtr& node,
83+ 	                const  std::unordered_map<std::string, std::string>& pipeline_id_planner_id_map,
84+ 	                const  std::unordered_map<std::string, planning_pipeline::PlanningPipelinePtr>& planning_pipelines =
85+ 	                    std::unordered_map<std::string, planning_pipeline::PlanningPipelinePtr>(),
86+ 					const  moveit::planning_pipeline_interfaces::StoppingCriterionFunction& stopping_criterion_callback = nullptr ,
87+ 					const  moveit::planning_pipeline_interfaces::SolutionSelectionFunction& solution_selection_function =
88+ 						&moveit::planning_pipeline_interfaces::getShortestSolution);
89+ 
90+ 	[[deprecated(" Replaced with setPlannerId(pipeline_name, planner_id)"  )]]  //  clang-format off
91+ 	void  setPlannerId (const  std::string& /* planner*/  ) { /*  Do nothing */ 
7292	}
7393
74- 	static  planning_pipeline::PlanningPipelinePtr create (const  rclcpp::Node::SharedPtr& node, const  Specification& spec);
75- 
76- 	/* *
77- 	 * 
78- 	 * @param node used to load the parameters for the planning pipeline 
94+ 	/* * \brief Set the planner id for a specific planning pipeline for the planning requests
95+ 	 * \param [in] pipeline_name Name of the planning pipeline for which the planner id is set 
96+ 	 * \param [in] planner_id Name of the planner ID that should be used by the planning pipeline 
97+ 	 * \return true if the pipeline exists and the corresponding ID is set successfully 
98+ 	 */  
99+ 	bool  setPlannerId (const  std::string& pipeline_name, const  std::string& planner_id);
100+ 
101+ 	/* * \brief Set stopping criterion function for parallel planning
102+ 	 * \param [in] stopping_criterion_callback New stopping criterion function that will be used 
103+ 	*/  
104+ 	void  setStoppingCriterionFunction (const  moveit::planning_pipeline_interfaces::StoppingCriterionFunction& stopping_criterion_callback);
105+ 
106+ 	/* * \brief Set solution selection function for parallel planning
107+ 	 * \param [in] solution_selection_function New solution selection that will be used 
108+ 	*/  
109+ 	void  setSolutionSelectionFunction (const  moveit::planning_pipeline_interfaces::SolutionSelectionFunction& solution_selection_function);
110+ 
111+ 	/* * \brief This function is called when an MTC task that uses this solver is initialized. If no pipelines are
112+ 	 * configured when this function is invoked, the planning pipelines named in the 'pipeline_id_planner_id_map' are 
113+ 	 * initialized with the given robot model. 
114+ 	 * \param [in] robot_model A robot model that is used to initialize the 
115+ 	 * planning pipelines of this solver 
79116	 */  
80- 	PipelinePlanner (const  rclcpp::Node::SharedPtr& node, const  std::string& pipeline = " ompl"  );
81- 
82- 	PipelinePlanner (const  planning_pipeline::PlanningPipelinePtr& planning_pipeline);
83- 
84- 	void  setPlannerId (const  std::string& planner) { setProperty (" planner"  , planner); }
85- 
86117	void  init (const  moveit::core::RobotModelConstPtr& robot_model) override ;
87118
119+ 	/* *
120+ 	 * \brief Plan a trajectory from a planning scene 'from' to scene 'to' 
121+ 	 * \param [in] from Start planning scene 
122+ 	 * \param [in] to Goal planning scene (used to create goal constraints) 
123+ 	 * \param [in] joint_model_group Group of joints for which this trajectory is created 
124+ 	 * \param [in] timeout ? 
125+ 	 * \param [in] result Reference to the location where the created trajectory is stored if planning is successful 
126+ 	 * \param [in] path_constraints Path contraints for the planning problem 
127+ 	 * \return true If the solver found a successful solution for the given planning problem 
128+ 	 */  
88129	bool  plan (const  planning_scene::PlanningSceneConstPtr& from, const  planning_scene::PlanningSceneConstPtr& to,
89- 	          const  core::JointModelGroup* jmg, double  timeout, robot_trajectory::RobotTrajectoryPtr& result,
130+ 	          const  core::JointModelGroup* joint_model_group, double  timeout,
131+ 	          robot_trajectory::RobotTrajectoryPtr& result,
90132	          const  moveit_msgs::msg::Constraints& path_constraints = moveit_msgs::msg::Constraints()) override ;
91133
134+ 	/* * \brief Plan a trajectory from a planning scene 'from' to a target pose with an offset
135+ 	 * \param [in] from Start planning scene 
136+ 	 * \param [in] link Link for which a target pose is given 
137+ 	 * \param [in] offset Offset to be applied to a given target pose 
138+ 	 * \param [in] target Target pose 
139+ 	 * \param [in] joint_model_group Group of joints for which this trajectory is created 
140+ 	 * \param [in] timeout ? 
141+ 	 * \param [in] result Reference to the location where the created trajectory is stored if planning is successful 
142+ 	 * \param [in] path_constraints Path contraints for the planning problem 
143+ 	 * \return true If the solver found a successful solution for the given planning problem 
144+ 	 */  
92145	bool  plan (const  planning_scene::PlanningSceneConstPtr& from, const  moveit::core::LinkModel& link,
93- 	          const  Eigen::Isometry3d& offset, const  Eigen::Isometry3d& target, const  moveit::core::JointModelGroup* jmg,
94- 	          double  timeout, robot_trajectory::RobotTrajectoryPtr& result,
146+ 	          const  Eigen::Isometry3d& offset, const  Eigen::Isometry3d& target,
147+ 	          const  moveit::core::JointModelGroup* joint_model_group, double  timeout,
148+ 	          robot_trajectory::RobotTrajectoryPtr& result,
95149	          const  moveit_msgs::msg::Constraints& path_constraints = moveit_msgs::msg::Constraints()) override ;
96150
97151protected: 
98- 	std::string pipeline_name_;
99- 	planning_pipeline::PlanningPipelinePtr planner_;
152+ 	/* * \brief Function that actually uses the planning pipelines to solve the given planning problem. It is called by
153+ 	 * the public plan function after the goal constraints are generated. This function uses a predefined number of 
154+ 	 * planning pipelines in parallel to solve the planning problem and choose the automatically the best (user-defined) 
155+ 	 * solution. 
156+ 	 * \param [in] planning_scene Scene for which the planning should be solved 
157+ 	 * \param [in] joint_model_group 
158+ 	 * Group of joints for which this trajectory is created 
159+ 	 * \param [in] goal_constraints Set of constraints that need to 
160+ 	 * be satisfied by the solution 
161+ 	 * \param [in] timeout ? 
162+ 	 * \param [in] result Reference to the location where the created 
163+ 	 * trajectory is stored if planning is successful 
164+ 	 * \param [in] path_constraints Path contraints for the planning 
165+ 	 * problem 
166+ 	 * \return true If the solver found a successful solution for the given planning problem 
167+ 	 */  
168+ 	bool  plan (const  planning_scene::PlanningSceneConstPtr& planning_scene,
169+ 	          const  moveit::core::JointModelGroup* joint_model_group,
170+ 	          const  moveit_msgs::msg::Constraints& goal_constraints, double  timeout,
171+ 	          robot_trajectory::RobotTrajectoryPtr& result,
172+ 	          const  moveit_msgs::msg::Constraints& path_constraints = moveit_msgs::msg::Constraints());
173+ 
100174	rclcpp::Node::SharedPtr node_;
175+ 
176+ 	/* * \brief Map of pipeline names (ids) and their corresponding planner ids. The planning problem is solved for every
177+ 	 * pipeline-planner pair in this map. If no pipelines are passed via constructor argument, the pipeline names are 
178+ 	 * used to initialize a set of planning pipelines.  */  
179+ 	std::unordered_map<std::string, std::string> pipeline_id_planner_id_map_;
180+ 
181+ 	/* * \brief Map of pipelines names and planning pipelines. This map is used to quickly search for a requested motion
182+ 	 * planning pipeline when during plan(..) */  
183+ 	std::unordered_map<std::string, planning_pipeline::PlanningPipelinePtr> planning_pipelines_;
184+ 
185+ 	moveit::planning_pipeline_interfaces::StoppingCriterionFunction stopping_criterion_callback_;
186+ 	moveit::planning_pipeline_interfaces::SolutionSelectionFunction solution_selection_function_;
187+ 
101188};
102189}  //  namespace solvers
103190}  //  namespace task_constructor
0 commit comments