Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef MOVEIT_OMPL_INTERFACE_MODEL_BASED_PLANNING_CONTEXT_
00038 #define MOVEIT_OMPL_INTERFACE_MODEL_BASED_PLANNING_CONTEXT_
00039
00040 #include <moveit/ompl_interface/parameterization/model_based_state_space.h>
00041 #include <moveit/ompl_interface/detail/constrained_valid_state_sampler.h>
00042 #include <moveit/constraint_samplers/constraint_sampler_manager.h>
00043 #include <moveit/planning_interface/planning_interface.h>
00044
00045 #include <ompl/geometric/SimpleSetup.h>
00046 #include <ompl/tools/benchmark/Benchmark.h>
00047 #include <ompl/tools/multiplan/ParallelPlan.h>
00048 #include <ompl/base/StateStorage.h>
00049
00050 #include <boost/thread/mutex.hpp>
00051
00052 namespace ompl_interface
00053 {
00054 namespace ob = ompl::base;
00055 namespace og = ompl::geometric;
00056 namespace ot = ompl::tools;
00057
00058 MOVEIT_CLASS_FORWARD(ModelBasedPlanningContext);
00059 MOVEIT_CLASS_FORWARD(ConstraintsLibrary);
00060
00061 struct ModelBasedPlanningContextSpecification;
00062 typedef boost::function<ob::PlannerPtr(const ompl::base::SpaceInformationPtr &si, const std::string &name,
00063 const ModelBasedPlanningContextSpecification &spec)> ConfiguredPlannerAllocator;
00064 typedef boost::function<ConfiguredPlannerAllocator(const std::string &planner_type)> ConfiguredPlannerSelector;
00065
00066 struct ModelBasedPlanningContextSpecification
00067 {
00068 std::map<std::string, std::string> config_;
00069 ConfiguredPlannerSelector planner_selector_;
00070 ConstraintsLibraryConstPtr constraints_library_;
00071 constraint_samplers::ConstraintSamplerManagerPtr constraint_sampler_manager_;
00072
00073 ModelBasedStateSpacePtr state_space_;
00074 std::vector<ModelBasedStateSpacePtr> subspaces_;
00075 og::SimpleSetupPtr ompl_simple_setup_;
00076 };
00077
00078 class ModelBasedPlanningContext : public planning_interface::PlanningContext
00079 {
00080 public:
00081
00082 ModelBasedPlanningContext(const std::string &name, const ModelBasedPlanningContextSpecification &spec);
00083
00084 virtual ~ModelBasedPlanningContext()
00085 {
00086 }
00087
00088 virtual bool solve(planning_interface::MotionPlanResponse &res);
00089 virtual bool solve(planning_interface::MotionPlanDetailedResponse &res);
00090
00091 virtual void clear();
00092 virtual bool terminate();
00093
00094 const ModelBasedPlanningContextSpecification& getSpecification() const
00095 {
00096 return spec_;
00097 }
00098
00099 const std::map<std::string, std::string>& getSpecificationConfig() const
00100 {
00101 return spec_.config_;
00102 }
00103
00104 void setSpecificationConfig(const std::map<std::string, std::string>& config)
00105 {
00106 spec_.config_ = config;
00107 }
00108
00109 const robot_model::RobotModelConstPtr& getRobotModel() const
00110 {
00111 return spec_.state_space_->getRobotModel();
00112 }
00113
00114 const robot_model::JointModelGroup* getJointModelGroup() const
00115 {
00116 return spec_.state_space_->getJointModelGroup();
00117 }
00118
00119 const robot_state::RobotState& getCompleteInitialRobotState() const
00120 {
00121 return complete_initial_robot_state_;
00122 }
00123
00124 const ModelBasedStateSpacePtr& getOMPLStateSpace() const
00125 {
00126 return spec_.state_space_;
00127 }
00128
00129 const og::SimpleSetupPtr& getOMPLSimpleSetup() const
00130 {
00131 return ompl_simple_setup_;
00132 }
00133
00134 og::SimpleSetupPtr& getOMPLSimpleSetup()
00135 {
00136 return ompl_simple_setup_;
00137 }
00138
00139 const ot::Benchmark& getOMPLBenchmark() const
00140 {
00141 return ompl_benchmark_;
00142 }
00143
00144 ot::Benchmark& getOMPLBenchmark()
00145 {
00146 return ompl_benchmark_;
00147 }
00148
00149 const kinematic_constraints::KinematicConstraintSetPtr& getPathConstraints() const
00150 {
00151 return path_constraints_;
00152 }
00153
00154
00155 unsigned int getMaximumStateSamplingAttempts() const
00156 {
00157 return max_state_sampling_attempts_;
00158 }
00159
00160
00161 void setMaximumStateSamplingAttempts(unsigned int max_state_sampling_attempts)
00162 {
00163 max_state_sampling_attempts_ = max_state_sampling_attempts;
00164 }
00165
00166
00167 unsigned int getMaximumGoalSamplingAttempts() const
00168 {
00169 return max_goal_sampling_attempts_;
00170 }
00171
00172
00173 void setMaximumGoalSamplingAttempts(unsigned int max_goal_sampling_attempts)
00174 {
00175 max_goal_sampling_attempts_ = max_goal_sampling_attempts;
00176 }
00177
00178
00179 unsigned int getMaximumGoalSamples() const
00180 {
00181 return max_goal_samples_;
00182 }
00183
00184
00185 void setMaximumGoalSamples(unsigned int max_goal_samples)
00186 {
00187 max_goal_samples_ = max_goal_samples;
00188 }
00189
00190
00191 unsigned int getMaximumPlanningThreads() const
00192 {
00193 return max_planning_threads_;
00194 }
00195
00196
00197 void setMaximumPlanningThreads(unsigned int max_planning_threads)
00198 {
00199 max_planning_threads_ = max_planning_threads;
00200 }
00201
00202
00203 double getMaximumSolutionSegmentLength() const
00204 {
00205 return max_solution_segment_length_;
00206 }
00207
00208
00209 void setMaximumSolutionSegmentLength(double mssl)
00210 {
00211 max_solution_segment_length_ = mssl;
00212 }
00213
00214 unsigned int getMinimumWaypointCount() const
00215 {
00216 return minimum_waypoint_count_;
00217 }
00218
00220 void setMinimumWaypointCount(unsigned int mwc)
00221 {
00222 minimum_waypoint_count_ = mwc;
00223 }
00224
00225 const constraint_samplers::ConstraintSamplerManagerPtr& getConstraintSamplerManager()
00226 {
00227 return spec_.constraint_sampler_manager_;
00228 }
00229
00230 void setConstraintSamplerManager(const constraint_samplers::ConstraintSamplerManagerPtr &csm)
00231 {
00232 spec_.constraint_sampler_manager_ = csm;
00233 }
00234
00235 void setVerboseStateValidityChecks(bool flag);
00236
00237 void setProjectionEvaluator(const std::string &peval);
00238
00239 void setPlanningVolume(const moveit_msgs::WorkspaceParameters &wparams);
00240
00241 void setCompleteInitialState(const robot_state::RobotState &complete_initial_robot_state);
00242
00243 bool setGoalConstraints(const std::vector<moveit_msgs::Constraints> &goal_constraints,
00244 const moveit_msgs::Constraints &path_constraints,
00245 moveit_msgs::MoveItErrorCodes *error);
00246 bool setPathConstraints(const moveit_msgs::Constraints &path_constraints,
00247 moveit_msgs::MoveItErrorCodes *error);
00248
00249 void setConstraintsApproximations(const ConstraintsLibraryConstPtr &constraints_library)
00250 {
00251 spec_.constraints_library_ = constraints_library;
00252 }
00253
00254 bool useStateValidityCache() const
00255 {
00256 return use_state_validity_cache_;
00257 }
00258
00259 void useStateValidityCache(bool flag)
00260 {
00261 use_state_validity_cache_ = flag;
00262 }
00263
00264 bool simplifySolutions() const
00265 {
00266 return simplify_solutions_;
00267 }
00268
00269 void simplifySolutions(bool flag)
00270 {
00271 simplify_solutions_ = flag;
00272 }
00273
00274
00275
00276
00277
00278 bool solve(double timeout, unsigned int count);
00279
00280
00281
00282
00283
00284
00285 bool benchmark(double timeout, unsigned int count, const std::string &filename = "");
00286
00287
00288 double getLastPlanTime() const
00289 {
00290 return last_plan_time_;
00291 }
00292
00293
00294 double getLastSimplifyTime() const
00295 {
00296 return last_simplify_time_;
00297 }
00298
00299
00300
00301 void simplifySolution(double timeout);
00302
00303
00304 void interpolateSolution();
00305
00306
00307 bool getSolutionPath(robot_trajectory::RobotTrajectory &traj) const;
00308
00309 void convertPath(const og::PathGeometric &pg, robot_trajectory::RobotTrajectory &traj) const;
00310
00311 virtual void configure();
00312
00313 protected:
00314
00315 void preSolve();
00316 void postSolve();
00317
00318 void startSampling();
00319 void stopSampling();
00320
00321 virtual ob::ProjectionEvaluatorPtr getProjectionEvaluator(const std::string &peval) const;
00322 virtual ob::StateSamplerPtr allocPathConstrainedSampler(const ompl::base::StateSpace *ss) const;
00323 virtual void useConfig();
00324 virtual ob::GoalPtr constructGoal();
00325
00326 void registerTerminationCondition(const ob::PlannerTerminationCondition &ptc);
00327 void unregisterTerminationCondition();
00328
00329 ModelBasedPlanningContextSpecification spec_;
00330
00331 robot_state::RobotState complete_initial_robot_state_;
00332
00334 og::SimpleSetupPtr ompl_simple_setup_;
00335
00337 ot::Benchmark ompl_benchmark_;
00338
00340 ot::ParallelPlan ompl_parallel_plan_;
00341
00342 std::vector<int> space_signature_;
00343
00344 kinematic_constraints::KinematicConstraintSetPtr path_constraints_;
00345 moveit_msgs::Constraints path_constraints_msg_;
00346 std::vector<kinematic_constraints::KinematicConstraintSetPtr> goal_constraints_;
00347
00348 const ob::PlannerTerminationCondition *ptc_;
00349 boost::mutex ptc_lock_;
00350
00352 double last_plan_time_;
00353
00355 double last_simplify_time_;
00356
00358 unsigned int max_goal_samples_;
00359
00361 unsigned int max_state_sampling_attempts_;
00362
00364 unsigned int max_goal_sampling_attempts_;
00365
00367 unsigned int max_planning_threads_;
00368
00370 double max_solution_segment_length_;
00371
00373 unsigned int minimum_waypoint_count_;
00374
00375 bool use_state_validity_cache_;
00376
00377 bool simplify_solutions_;
00378 };
00379
00380 }
00381
00382 #endif