LEMUR Packages: ompl_lemur or_lemur pr_bgl prpy_lemur
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends Groups Pages
or_ompl_conversions.h
Go to the documentation of this file.
1 
7 namespace or_lemur
8 {
9 
10 double ompl_resolution(
11  const OpenRAVE::RobotBasePtr & robot,
12  const std::vector<int> & dofs);
13 
14 bool ompl_set_roots(ompl::base::ProblemDefinitionPtr ompl_pdef,
15  OpenRAVE::PlannerBase::PlannerParametersConstPtr params);
16 
25 bool create_space(
26  const OpenRAVE::RobotBasePtr & robot,
27  const std::vector<int> & dofs,
28  bool do_checker,
29  bool do_baked,
30  ompl::base::SpaceInformationPtr & out_space_info);
31 
32 // this only works for real vector state spaces
33 // with baking support
35 {
36 public:
37  const OpenRAVE::EnvironmentBasePtr env;
38  const OpenRAVE::RobotBasePtr robot;
39  const size_t dim;
40  mutable size_t num_checks;
41  mutable boost::chrono::high_resolution_clock::duration dur_checks;
42  // optional baked stuff
43  const bool do_baked;
44 
45  boost::function<void ()> bake_begin;
46  boost::function<OpenRAVE::KinBodyPtr ()> bake_end;
47  boost::function<bool (OpenRAVE::KinBodyConstPtr, OpenRAVE::CollisionReportPtr)> baked_checker;
48 
49  OpenRAVE::CollisionCheckerBasePtr baked_cc;
50  OpenRAVE::KinBodyPtr baked_kinbody;
51 
52  OrChecker(
54  const OpenRAVE::EnvironmentBasePtr env,
55  const OpenRAVE::RobotBasePtr robot,
56  const size_t dim,
57  const bool do_baked):
59  env(env), robot(robot), dim(dim),
60  num_checks(0),
61  dur_checks(),
62  do_baked(do_baked)
63  {
64  if (si->getStateSpace()->getType() != ompl::base::STATE_SPACE_REAL_VECTOR)
65  {
66  throw std::runtime_error("state space is not real vector!");
67  }
68  }
69  void start()
70  {
71  if (!do_baked)
72  return;
73  // handle baked case
74  OpenRAVE::CollisionCheckerBasePtr cc = env->GetCollisionChecker();
75  if (!cc)
76  throw std::runtime_error("no collision checker set!");
77  // communicate with baked checker
78  bool success;
79  std::stringstream sinput("BakeGetType BakeBegin BakeEnd"), soutput;
80  try
81  {
82  success = cc->SendCommand(soutput, sinput); // BakeGetType
83  }
84  catch (const OpenRAVE::openrave_exception & exc)
85  {
86  throw std::runtime_error("collision checker doesn't support baked checks!");
87  }
88  // start baking
89  if (!success) std::runtime_error("BakeGetType failed!");
90  std::string kinbody_type = soutput.str();
91  success = cc->SendCommand(soutput, sinput); // BakeBegin
92  if (!success) std::runtime_error("BakeBegin failed!");
93  OpenRAVE::KinBodyPtr kb = OpenRAVE::RaveCreateKinBody(env,kinbody_type);
94  if (!baked_kinbody) std::runtime_error("RaveCreateKinBody failed!");
95  env->CheckCollision(robot);
96  robot->CheckSelfCollision();
97  success = cc->SendCommand(soutput, sinput); // BakeEnd
98  if (!success) std::runtime_error("BakeEnd failed!");
99  // success
100  baked_cc = cc;
101  baked_kinbody = kb;
102  }
103  void stop()
104  {
105  baked_cc.reset();
106  baked_kinbody.reset();
107  }
108  bool isValid(const ompl::base::State * state) const
109  {
110  boost::chrono::high_resolution_clock::time_point time_begin
111  = boost::chrono::high_resolution_clock::now();
112  num_checks++;
113  double * q = state->as<ompl::base::RealVectorStateSpace::StateType>()->values;
114  std::vector<OpenRAVE::dReal> adofvals(q, q+dim);
115  robot->SetActiveDOFValues(adofvals, OpenRAVE::KinBody::CLA_Nothing);
116  bool collided;
117  if (do_baked)
118  collided = baked_cc->CheckStandaloneSelfCollision(baked_kinbody);
119  else
120  collided = env->CheckCollision(robot) || robot->CheckSelfCollision();
121  dur_checks += boost::chrono::high_resolution_clock::now() - time_begin;
122  return !collided;
123  }
124 };
125 
126 #ifdef OR_LEMUR_HAS_BOOSTSMARTPTRS
127 typedef boost::shared_ptr<OrChecker> OrCheckerPtr;
128 #else
129 typedef std::shared_ptr<OrChecker> OrCheckerPtr;
130 #endif
131 
133 {
134 public:
135  boost::function<bool (std::vector<OpenRAVE::dReal> &)> indicator;
136  const size_t dim;
137  mutable size_t num_checks;
138  mutable boost::chrono::high_resolution_clock::duration dur_checks;
141  boost::function<bool (std::vector<OpenRAVE::dReal> &)> indicator):
143  indicator(indicator), dim(si->getStateDimension()),
144  num_checks(0), dur_checks()
145  {
146  }
147  bool isValid(const ompl::base::State * state) const
148  {
149  boost::chrono::high_resolution_clock::time_point time_begin
150  = boost::chrono::high_resolution_clock::now();
151  num_checks++;
152  double * q = state->as<ompl::base::RealVectorStateSpace::StateType>()->values;
153  std::vector<OpenRAVE::dReal> adofvals(q, q+dim);
154  bool is_valid = indicator(adofvals);
155  dur_checks += boost::chrono::high_resolution_clock::now() - time_begin;
156  return is_valid;
157  }
158 };
159 
160 typedef boost::shared_ptr<OrIndicatorChecker> OrIndicatorCheckerPtr;
161 
162 } // namespace or_lemur
Definition: or_ompl_conversions.h:132
Definition: or_ompl_conversions.h:34
const T * as() const