se2ez
helper.cpp
Go to the documentation of this file.
1 /* Author: Zachary Kingston */
2 
3 #include <ompl/geometric/planners/rrt/RRT.h>
4 #include <ompl/geometric/planners/rrt/LazyRRT.h>
5 #include <ompl/geometric/planners/rrt/RRTConnect.h>
6 #include <ompl/geometric/planners/rrt/RRTstar.h>
7 #include <ompl/geometric/planners/est/EST.h>
8 #include <ompl/geometric/planners/est/BiEST.h>
9 #include <ompl/geometric/planners/est/ProjEST.h>
10 #include <ompl/geometric/planners/sbl/SBL.h>
11 #include <ompl/geometric/planners/bitstar/BITstar.h>
12 #include <ompl/geometric/planners/prm/PRM.h>
13 #include <ompl/geometric/planners/prm/PRMstar.h>
14 #include <ompl/geometric/planners/prm/LazyPRM.h>
15 #include <ompl/geometric/planners/prm/LazyPRMstar.h>
16 #include <ompl/geometric/planners/prm/SPARS.h>
17 #include <ompl/geometric/planners/prm/SPARStwo.h>
18 #include <ompl/geometric/planners/fmt/FMT.h>
19 #include <ompl/geometric/planners/fmt/BFMT.h>
20 #include <ompl/geometric/planners/pdst/PDST.h>
21 #include <ompl/geometric/planners/kpiece/KPIECE1.h>
22 #include <ompl/geometric/planners/kpiece/BKPIECE1.h>
23 #include <ompl/geometric/planners/kpiece/LBKPIECE1.h>
24 
25 #include <ompl/base/spaces/constraint/ProjectedStateSpace.h>
26 #include <ompl/base/spaces/constraint/AtlasStateSpace.h>
27 #include <ompl/base/spaces/constraint/TangentBundleStateSpace.h>
28 
29 #include <se2ez/core/log.h>
30 #include <se2ez/core/state.h>
31 #include <se2ez/core/robot.h>
33 
34 #include <se2ez/plan/space.h>
35 #include <se2ez/plan/validity.h>
36 #include <se2ez/plan/helper.h>
37 
38 using namespace se2ez;
39 
40 ///
41 /// EZPlans
42 ///
43 
44 plan::EZPlans::EZPlans(const RobotPtr &robot) : robot_(robot)
45 {
46 }
47 
49 {
50 }
51 
53 {
54  space = rspace = std::make_shared<plan::StateSpace>(robot_);
55  setup = std::make_shared<ompl::geometric::SimpleSetup>(space);
56  info = setup->getSpaceInformation();
57 
59 }
61 {
62  setup->setStateValidityChecker( //
63  std::make_shared<plan::ValidityChecker>(info, std::make_shared<Box2DCollisionManager>(robot_)));
64 }
65 
67 {
68  planners_.emplace("rrt:RRT", makePlanner<ompl::geometric::RRT>());
69  planners_.emplace("rrt:RRTConnect", makePlanner<ompl::geometric::RRTConnect>());
70  planners_.emplace("rrt:RRT*", makePlanner<ompl::geometric::RRTstar>());
71  planners_.emplace("rrt:LazyRRT", makePlanner<ompl::geometric::LazyRRT>());
72 
73  planners_.emplace("est:EST", makePlanner<ompl::geometric::EST>());
74  planners_.emplace("est:BiEST", makePlanner<ompl::geometric::BiEST>());
75  planners_.emplace("est:ProjEST", makePlanner<ompl::geometric::ProjEST>());
76 
77  planners_.emplace("sbl:SBL", makePlanner<ompl::geometric::SBL>());
78 
79  planners_.emplace("bit:BIT*", makePlanner<ompl::geometric::BITstar>());
80 
81  planners_.emplace("prm:PRM", makePlanner<ompl::geometric::PRM>());
82  planners_.emplace("prm:PRM*", makePlanner<ompl::geometric::PRMstar>());
83  planners_.emplace("prm:LazyPRM", makePlanner<ompl::geometric::LazyPRM>());
84  planners_.emplace("prm:LazyPRM*", makePlanner<ompl::geometric::LazyPRMstar>());
85  planners_.emplace("spars:SPARS", makePlanner<ompl::geometric::SPARS>());
86  planners_.emplace("spars:SPARS2", makePlanner<ompl::geometric::SPARStwo>());
87 
88  planners_.emplace("fmt:FMT", makePlanner<ompl::geometric::FMT>());
89  planners_.emplace("fmt:BFMT", makePlanner<ompl::geometric::BFMT>());
90 
91  planners_.emplace("pdst:PDST", makePlanner<ompl::geometric::PDST>());
92 
93  planners_.emplace("kpiece:KPIECE", makePlanner<ompl::geometric::KPIECE1>());
94  planners_.emplace("kpiece:BKPIECE", makePlanner<ompl::geometric::BKPIECE1>());
95  planners_.emplace("kpiece:LBKPIECE", makePlanner<ompl::geometric::LBKPIECE1>());
96 }
97 
98 ///
99 /// EZPlans State Functions
100 ///
101 
103 {
104  StatePtr state = std::make_shared<State>(robot_);
105  robot_->getNamedState(name, state);
106 
107  return setStart(state);
108 }
109 
111 {
112  StatePtr state = std::make_shared<State>(robot_);
113  robot_->getNamedState(name, state);
114 
115  return setGoal(state);
116 }
117 
118 bool plan::EZPlans::setStartGoal(const std::string &start, const std::string &goal)
119 {
120  return setStart(start) && setGoal(goal);
121 }
122 
123 bool plan::EZPlans::setStart(const Eigen::VectorXd &vec)
124 {
125  StatePtr state = std::make_shared<State>(robot_);
126  state->data = vec;
127 
128  return setStart(state);
129 }
130 
131 bool plan::EZPlans::setGoal(const Eigen::VectorXd &vec)
132 {
133  StatePtr state = std::make_shared<State>(robot_);
134  state->data = vec;
135 
136  return setGoal(state);
137 }
138 
139 bool plan::EZPlans::setStartGoal(const Eigen::VectorXd &start, const Eigen::VectorXd &goal)
140 {
141  return setStart(start) && setGoal(goal);
142 }
143 
145 {
146  ompl::base::ScopedState<> start(space);
147  getState(start.get())->copy(state);
148  setup->setStartState(start);
149 
150  return postSetState(start.get());
151 }
152 
154 {
155  ompl::base::ScopedState<> goal(space);
156  getState(goal.get())->copy(state);
157  setup->setGoalState(goal);
158 
159  return postSetState(goal.get());
160 }
161 
162 bool plan::EZPlans::setStartGoal(const StatePtr &start, const StatePtr &goal)
163 {
164  return setStart(start) && setGoal(goal);
165 }
166 
167 bool plan::EZPlans::postSetState(const ompl::base::State * /* state */)
168 {
169  return true;
170 }
171 
172 ///
173 /// EZPlans Path Functions
174 ///
175 
177 {
178  std::vector<std::string> planners;
179  for (const auto &planner : planners_)
180  planners.emplace_back(planner.first);
181 
182  return planners;
183 }
184 
186 {
187  if (planners_.empty())
188  createPlanners();
189 
190  setup->setPlanner(planners_[name]);
191 }
192 
193 void plan::EZPlans::postprocess(bool simplify, bool interpolate)
194 {
195  if (simplify)
196  setup->simplifySolution();
197 
198  if (interpolate)
199  {
200  auto &path = setup->getSolutionPath();
201  path.interpolate();
202  }
203 }
204 
206 {
207  auto &path = setup->getSolutionPath();
208 
209  std::vector<StatePtr> states;
210  for (unsigned int i = 0; i < path.getStateCount(); ++i)
211  states.emplace_back(getState(path.getState(i)));
212 
213  return states;
214 }
215 
216 StatePtr plan::EZPlans::getState(ompl::base::State *state) const
217 {
218  return state->as<plan::StateSpace::StateType>()->state;
219 }
220 
221 const StatePtr plan::EZPlans::getStateConst(const ompl::base::State *state) const
222 {
223  return state->as<plan::StateSpace::StateType>()->state;
224 }
225 
226 ///
227 /// EZPlansConstraint
228 ///
229 
230 plan::EZPlansConstraint::EZPlansConstraint(const RobotPtr &robot, const ompl::base::ConstraintPtr &constraint,
231  ConstraintType method)
232  : EZPlans(robot), constraint(constraint), method(method)
233 {
234 }
235 
237 {
238 }
239 
241 {
242  rspace = std::make_shared<plan::StateSpace>(robot_);
243 
244  switch (method)
245  {
246  case PROJECTION:
247  space = std::make_shared<ompl::base::ProjectedStateSpace>(rspace, constraint);
248  info = std::make_shared<ompl::base::ConstrainedSpaceInformation>(space);
249  break;
250  case ATLAS:
251  space = std::make_shared<ompl::base::AtlasStateSpace>(rspace, constraint);
252  info = std::make_shared<ompl::base::ConstrainedSpaceInformation>(space);
253  break;
254  case TANGENT:
255  space = std::make_shared<ompl::base::TangentBundleStateSpace>(rspace, constraint);
256  info = std::make_shared<ompl::base::TangentBundleSpaceInformation>(space);
257  break;
258  default:
259  SE2EZ_ERROR("Invalid Space Type!");
260  throw std::runtime_error("Invalid Space Type!");
261  }
262 
263  setup = std::make_shared<ompl::geometric::SimpleSetup>(info);
264 
266 }
267 
269 {
270  setup->setStateValidityChecker( //
271  std::make_shared<plan::WrappedValidityChecker>(info,
272  std::make_shared<Box2DCollisionManager>(robot_)));
273 }
274 
275 bool plan::EZPlansConstraint::postSetState(const ompl::base::State *state)
276 {
277  if (!checkConstraint(state))
278  return false;
279 
280  anchor(state);
281  return true;
282 }
283 
284 StatePtr plan::EZPlansConstraint::getState(ompl::base::State *state) const
285 {
286  return state->as<ompl::base::WrapperStateSpace::StateType>()
287  ->getState()
289  ->state;
290 }
291 
292 const StatePtr plan::EZPlansConstraint::getStateConst(const ompl::base::State *state) const
293 {
294  return state->as<ompl::base::WrapperStateSpace::StateType>()
295  ->getState()
297  ->state;
298 }
299 
300 void plan::EZPlansConstraint::anchor(const ompl::base::State *state)
301 {
302  if (method == ATLAS || method == TANGENT)
303  space->as<ompl::base::AtlasStateSpace>()->anchorChart(state);
304 }
305 
306 bool plan::EZPlansConstraint::checkConstraint(const ompl::base::State *state) const
307 {
308  if (!constraint->isSatisfied(state))
309  {
310  Eigen::VectorXd f(constraint->getCoDimension());
311  constraint->function(state, f);
312 
313  SE2EZ_WARN("Constraint is not satisfied (%2%) at state %1%",
314  tf::printVector(getStateConst(state)->data), tf::printVector(f));
315 
316  return false;
317  }
318 
319  return true;
320 }
ompl::geometric::SimpleSetupPtr setup
Definition: helper.h:93
ompl::base::SpaceInformationPtr info
Definition: helper.h:92
T empty(T... args)
A shared pointer wrapper for se2ez::State.
std::vector< StatePtr > extractPath() const
Definition: helper.cpp:205
void postprocess(bool simplify, bool interpolate)
Definition: helper.cpp:193
const ConstraintType method
Definition: helper.h:124
bool checkConstraint(const ompl::base::State *state) const
Definition: helper.cpp:306
bool postSetState(const ompl::base::State *state) override
Definition: helper.cpp:275
StateSpacePtr rspace
Definition: helper.h:90
virtual bool postSetState(const ompl::base::State *state)
Definition: helper.cpp:167
StatePtr getState(ompl::base::State *state) const override
Definition: helper.cpp:284
const StatePtr getStateConst(const ompl::base::State *state) const override
Definition: helper.cpp:292
virtual void initialize()
Definition: helper.cpp:52
bool setStart(const std::string &name)
Definition: helper.cpp:102
std::shared_ptr< T > setPlanner(Args &&... args)
Definition: helper.h:45
bool setGoal(const std::string &name)
Definition: helper.cpp:110
virtual const StatePtr getStateConst(const ompl::base::State *state) const
Definition: helper.cpp:221
#define SE2EZ_WARN(fmt,...)
Definition: log.h:41
void createPlanners()
Definition: helper.cpp:66
ompl::base::ConstraintPtr constraint
Definition: helper.h:123
const RobotPtr robot_
Definition: helper.h:96
std::vector< std::string > getPlanners()
Definition: helper.cpp:176
A shared pointer wrapper for se2ez::Robot.
std::string printVector(const Eigen::VectorXd &v, unsigned int precision=4)
Returns a string of a vector&#39;s contents.
Definition: math.cpp:90
T emplace(T... args)
void updateValidityChecker() override
Definition: helper.cpp:268
ompl::base::StateSpacePtr space
Definition: helper.h:91
std::map< std::string, ompl::base::PlannerPtr > planners_
Definition: helper.h:97
virtual void updateValidityChecker()
Definition: helper.cpp:60
Main namespace.
Definition: collision.h:11
void initialize() override
Definition: helper.cpp:240
#define SE2EZ_ERROR(fmt,...)
Definition: log.h:39
virtual ~EZPlans()
Definition: helper.cpp:48
EZPlans(const RobotPtr &robot)
Definition: helper.cpp:44
virtual StatePtr getState(ompl::base::State *state) const
Definition: helper.cpp:216
EZPlansConstraint(const RobotPtr &robot, const ompl::base::ConstraintPtr &constraint, ConstraintType method)
Definition: helper.cpp:230
ConstraintType
Definition: helper.h:100
void anchor(const ompl::base::State *state)
Definition: helper.cpp:300
bool setStartGoal(const std::string &start, const std::string &goal)
Definition: helper.cpp:118
T emplace_back(T... args)