5050#include < tf2_eigen/tf2_eigen.h>
5151#endif
5252
53+ namespace {
54+ const std::pair<std::string, std::string> DEFAULT_REQUESTED_PIPELINE =
55+ std::pair<std::string, std::string>(" ompl" , " RRTConnect" );
56+ }
5357namespace moveit {
5458namespace task_constructor {
5559namespace solvers {
@@ -114,10 +118,25 @@ planning_pipeline::PlanningPipelinePtr PipelinePlanner::create(const rclcpp::Nod
114118 return planner;
115119}*/
116120
117- PipelinePlanner::PipelinePlanner (const rclcpp::Node::SharedPtr& node, const std::string& pipeline_name) : node_(node) {
118- pipeline_names_.at (0 ) = pipeline_name;
119- properties ().declare <std::string>(" planner" , " " , " planner id" );
121+ PipelinePlanner::PipelinePlanner (const rclcpp::Node::SharedPtr& node, const std::string& pipeline_name,
122+ const std::string& planner_id)
123+ : PipelinePlanner(node, [&]() {
124+ std::unordered_map<std::string, std::string> pipeline_id_planner_id_map;
125+ pipeline_id_planner_id_map[pipeline_name] = planner_id;
126+ return pipeline_id_planner_id_map;
127+ }()) {}
120128
129+ PipelinePlanner::PipelinePlanner (
130+ const rclcpp::Node::SharedPtr& node, const std::unordered_map<std::string, std::string>& pipeline_id_planner_id_map,
131+ const std::unordered_map<std::string, planning_pipeline::PlanningPipelinePtr> planning_pipelines)
132+ : node_(node), pipeline_id_planner_id_map_(pipeline_id_planner_id_map) {
133+ for (auto pipeline_id_planner_id_pair : pipeline_id_planner_id_map_) {
134+ RCLCPP_WARN (node_->get_logger (), " '%s' : ''%s" , pipeline_id_planner_id_pair.first .c_str (),
135+ pipeline_id_planner_id_pair.second .c_str ());
136+ }
137+ if (!planning_pipelines.empty ()) {
138+ planning_pipelines_ = planning_pipelines;
139+ }
121140 properties ().declare <uint>(" num_planning_attempts" , 1u , " number of planning attempts" );
122141 properties ().declare <moveit_msgs::msg::WorkspaceParameters>(
123142 " workspace_parameters" , moveit_msgs::msg::WorkspaceParameters (), " allowed workspace of mobile base?" );
@@ -139,9 +158,26 @@ PipelinePlanner::PipelinePlanner(const rclcpp::Node::SharedPtr& node, const std:
139158// planning_pipelines_.at(0) = planning_pipeline;
140159// }
141160
161+ bool PipelinePlanner::setPlannerId (const std::string& pipeline_name, const std::string& planner_id) {
162+ if (pipeline_id_planner_id_map_.count (pipeline_name) > 0 ) {
163+ pipeline_id_planner_id_map_[pipeline_name] = planner_id;
164+ }
165+ RCLCPP_WARN (node_->get_logger (), " PipelinePlanner does not have a pipeline called '%s'" , pipeline_name.c_str ());
166+ return false ;
167+ }
168+
142169void PipelinePlanner::init (const core::RobotModelConstPtr& robot_model) {
143- planning_pipelines_ =
144- moveit::planning_pipeline_interfaces::createPlanningPipelineMap (pipeline_names_, robot_model, node_);
170+ if (planning_pipelines_.empty ()) {
171+ planning_pipelines_ = moveit::planning_pipeline_interfaces::createPlanningPipelineMap (
172+ [&]() {
173+ std::vector<std::string> pipeline_names;
174+ for (const auto & pipeline_name_planner_id_pair : pipeline_id_planner_id_map_) {
175+ pipeline_names.push_back (pipeline_name_planner_id_pair.first );
176+ }
177+ return pipeline_names;
178+ }(),
179+ robot_model, node_);
180+ }
145181
146182 for (auto const & name_pipeline_pair : planning_pipelines_) {
147183 name_pipeline_pair.second ->displayComputedMotionPlans (properties ().get <bool >(" display_motion_plans" ));
@@ -181,13 +217,22 @@ bool PipelinePlanner::plan(const planning_scene::PlanningSceneConstPtr& planning
181217 robot_trajectory::RobotTrajectoryPtr& result,
182218 const moveit_msgs::msg::Constraints& path_constraints) {
183219 std::vector<moveit_msgs::msg::MotionPlanRequest> requests;
184- requests.reserve (pipeline_names_ .size ());
220+ requests.reserve (pipeline_id_planner_id_map_ .size ());
185221
186- for (auto const & pipeline_name : pipeline_names_) {
222+ for (auto const & pipeline_id_planner_id_pair : pipeline_id_planner_id_map_) {
223+ RCLCPP_WARN (node_->get_logger (), " '%s' : ''%s" , pipeline_id_planner_id_pair.first .c_str (),
224+ pipeline_id_planner_id_pair.second .c_str ());
225+ if (planning_pipelines_.find (pipeline_id_planner_id_pair.first ) == planning_pipelines_.end ()) {
226+ RCLCPP_WARN (
227+ node_->get_logger (),
228+ " Pipeline '%s' is not available of this PipelineSolver instance. Skipping a request for this pipeline." ,
229+ pipeline_id_planner_id_pair.first .c_str ());
230+ continue ;
231+ }
187232 moveit_msgs::msg::MotionPlanRequest request;
188- request.pipeline_id = pipeline_name ;
233+ request.pipeline_id = pipeline_id_planner_id_pair. first ;
189234 request.group_name = joint_model_group->getName ();
190- request.planner_id = properties (). get <std::string>( " planner " ) ;
235+ request.planner_id = pipeline_id_planner_id_pair. second ;
191236 request.allowed_planning_time = timeout;
192237 request.start_state .is_diff = true ; // we don't specify an extra start state
193238 request.num_planning_attempts = properties ().get <uint>(" num_planning_attempts" );
@@ -204,8 +249,11 @@ bool PipelinePlanner::plan(const planning_scene::PlanningSceneConstPtr& planning
204249 moveit::planning_pipeline_interfaces::planWithParallelPipelines (requests, planning_scene, planning_pipelines_);
205250
206251 // Just choose first result
207- result = responses.at (0 ).trajectory ;
208- return bool (result);
252+ if (!responses.empty ()) {
253+ result = responses.at (0 ).trajectory ;
254+ return bool (result);
255+ }
256+ return false ;
209257}
210258} // namespace solvers
211259} // namespace task_constructor
0 commit comments