Bench-MR
A Motion Planning Benchmark for Wheeled Mobile Robots
AbstractPlanner.h
Go to the documentation of this file.
1#pragma once
2
3#include <ompl/base/StateValidityChecker.h>
4#include <ompl/base/spaces/DubinsStateSpace.h>
5#include <ompl/base/spaces/ReedsSheppStateSpace.h>
6#include <ompl/base/spaces/SE2StateSpace.h>
7#include <ompl/control/Control.h>
8#include <ompl/control/PathControl.h>
9#include <ompl/control/SimpleSetup.h>
10#include <ompl/geometric/PathGeometric.h>
11#include <ompl/geometric/SimpleSetup.h>
12#include <ompl/geometric/planners/rrt/SORRTstar.h>
13#include <utility>
14#ifdef G1_AVAILABLE
15#include "steer_functions/G1Clothoid/ClothoidSteering.hpp"
16#include "steer_functions/G1Clothoid/G1ClothoidStateSpace.h"
17#endif
18
20
21#include <ompl/control/ODESolver.h>
22
23#include <nlohmann/json.hpp>
24
25namespace ob = ompl::base;
26namespace og = ompl::geometric;
27namespace oc = ompl::control;
28
30 public:
31 virtual std::string name() const = 0;
32 virtual ~AbstractPlanner();
33
38 static std::string LastCreatedPlannerName;
39
40 virtual ob::PlannerStatus run() = 0;
41
42 virtual std::vector<Point> solutionPath() const {
43 auto path = solution();
44 return Point::fromPath(path);
45 }
46
48 double time{std::numeric_limits<double>::quiet_NaN()};
49 double cost{std::numeric_limits<double>::quiet_NaN()};
50 og::PathGeometric solution;
52 const og::PathGeometric &solution)
54 };
55
56 std::vector<IntermediarySolution> intermediarySolutions;
57
59 double time{std::numeric_limits<double>::quiet_NaN()};
60 double cost{std::numeric_limits<double>::quiet_NaN()};
61 oc::PathControl solution;
63 const oc::PathControl &solution)
65 };
66
67 std::vector<IntermediaryControlSolution> intermediaryControlSolutions;
68
72 virtual og::PathGeometric solution() const = 0;
73
74 virtual bool hasReachedGoalExactly() const = 0;
75 virtual double planningTime() const = 0;
76
77 public:
78 bool isValid(const ob::State *state) const {
79 std::cout << "Checking if the state is valid .. " << std::endl;
80 return getCurrStateValidityCheckerPtr()->isValid(state);
81 }
82 bool isValid(og::PathGeometric &path) const {
83 for (const auto *state : path.getStates())
84 if (!getCurrStateValidityCheckerPtr()->isValid(state)) return false;
85 return true;
86 }
87 bool isValid(og::PathGeometric &path, std::vector<Point> &collisions) const {
88 collisions.clear();
89 for (const auto *state : path.getStates())
91 collisions.emplace_back(state);
92 return collisions.empty();
93 }
94
95 bool isValid(ompl::control::PathControl &path,
96 std::vector<Point> &collisions) const {
97 collisions.clear();
98 for (const auto *state : path.getStates())
100 collisions.emplace_back(state);
101 return collisions.empty();
102 }
103 og::SimpleSetup *simpleSetup() const { return ss; }
104
105 ob::StateValidityCheckerPtr getCurrStateValidityCheckerPtr() const {
106 if (control_based_) {
107 return ss_c->getStateValidityChecker();
108 } else {
109 return ss->getStateValidityChecker();
110 }
111 }
112
113 protected:
114 og::SimpleSetup *ss{nullptr};
115 oc::SimpleSetup *ss_c{nullptr};
116 bool control_based_{false};
117 explicit AbstractPlanner(const std::string &name);
118
119 public:
120 virtual ob::Planner *omplPlanner() { return nullptr; }
121 virtual nlohmann::json getSettings() const { return {};}
122};
ob::SE2StateSpace::StateType State
Definition: Primitives.h:12
Definition: AbstractPlanner.h:29
oc::SimpleSetup * ss_c
Definition: AbstractPlanner.h:115
std::vector< IntermediarySolution > intermediarySolutions
Definition: AbstractPlanner.h:56
std::vector< IntermediaryControlSolution > intermediaryControlSolutions
Definition: AbstractPlanner.h:67
bool isValid(const ob::State *state) const
Definition: AbstractPlanner.h:78
virtual bool hasReachedGoalExactly() const =0
og::SimpleSetup * ss
Definition: AbstractPlanner.h:114
virtual og::PathGeometric solution() const =0
Returns the solution of the planner, which is a sparse PathGeometric.
virtual nlohmann::json getSettings() const
Definition: AbstractPlanner.h:121
static std::string LastCreatedPlannerName
Stores the name of the planner created last.
Definition: AbstractPlanner.h:38
virtual double planningTime() const =0
virtual ~AbstractPlanner()
Definition: AbstractPlanner.cpp:153
virtual std::string name() const =0
og::SimpleSetup * simpleSetup() const
Definition: AbstractPlanner.h:103
bool isValid(og::PathGeometric &path) const
Definition: AbstractPlanner.h:82
bool isValid(ompl::control::PathControl &path, std::vector< Point > &collisions) const
Definition: AbstractPlanner.h:95
bool control_based_
Definition: AbstractPlanner.h:116
virtual ob::PlannerStatus run()=0
virtual std::vector< Point > solutionPath() const
Definition: AbstractPlanner.h:42
ob::StateValidityCheckerPtr getCurrStateValidityCheckerPtr() const
Definition: AbstractPlanner.h:105
virtual ob::Planner * omplPlanner()
Definition: AbstractPlanner.h:120
AbstractPlanner(const std::string &name)
Definition: AbstractPlanner.cpp:7
bool isValid(og::PathGeometric &path, std::vector< Point > &collisions) const
Definition: AbstractPlanner.h:87
Planner
Definition: PlannerSettings.h:16
Definition: AbstractPlanner.h:58
double cost
Definition: AbstractPlanner.h:60
double time
Definition: AbstractPlanner.h:59
IntermediaryControlSolution(double time, double cost, const oc::PathControl &solution)
Definition: AbstractPlanner.h:62
oc::PathControl solution
Definition: AbstractPlanner.h:61
Definition: AbstractPlanner.h:47
IntermediarySolution(double time, double cost, const og::PathGeometric &solution)
Definition: AbstractPlanner.h:51
og::PathGeometric solution
Definition: AbstractPlanner.h:50
double cost
Definition: AbstractPlanner.h:49
double time
Definition: AbstractPlanner.h:48
static std::vector< Point > fromPath(const ompl::geometric::PathGeometric &p, bool interpolate=false)
Definition: Primitives.cpp:25