Bench-MR
A Motion Planning Benchmark for Wheeled Mobile Robots
OMPLControlPlanner.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4
5#include <ompl/base/objectives/MaximizeMinClearanceObjective.h>
6#include <ompl/base/objectives/PathLengthOptimizationObjective.h>
7#include <ompl/base/objectives/StateCostIntegralObjective.h>
8
9#include <ompl/base/SpaceInformation.h>
10#include <ompl/base/spaces/DubinsStateSpace.h>
11#include <ompl/base/spaces/RealVectorStateSpace.h>
12#include <ompl/base/spaces/ReedsSheppStateSpace.h>
13#include <ompl/base/spaces/SE2StateSpace.h>
14
15#include <ompl/geometric/PathGeometric.h>
16#include <ompl/geometric/PathSimplifier.h>
17#include <ompl/geometric/SimpleSetup.h>
18
19#include <ompl/control/planners/est/EST.h>
20#include <ompl/control/planners/kpiece/KPIECE1.h>
21#include <ompl/control/planners/pdst/PDST.h>
22#include <ompl/control/planners/rrt/RRT.h>
23#include <ompl/control/planners/sst/SST.h>
24
28
30
32#include "utils/Stopwatch.hpp"
33
34#include "ompl/util/Console.h"
35
36namespace ob = ompl::base;
37namespace og = ompl::geometric;
38namespace oc = ompl::control;
39
40template <class PLANNER>
42 public:
44 _omplPlanner = ob::PlannerPtr(new PLANNER(ss_c->getSpaceInformation()));
46 }
47
48 ob::PlannerStatus run() override {
50 ompl::msg::setLogLevel(ompl::msg::LOG_DEV1);
51
52 ss_c->setPlanner(_omplPlanner);
53 this->setStatePropagator();
54 ss_c->getSpaceInformation()->setPropagationStepSize(.1);
55 ss_c->getSpaceInformation()->setMinMaxControlDuration(2, 10);
56 ss_c->setup();
57
58 ss_c->getSpaceInformation()->printProperties(std::cout);
59 Stopwatch watch;
60 auto problem = ss_c->getProblemDefinition();
61
62 problem->setIntermediateSolutionCallback(
63 [&](const ob::Planner *planner,
64 const std::vector<const ob::State *> &states, const ob::Cost cost) {
65 oc::PathControl solution(global::settings.ompl.control_space_info);
66 // the OMPL intermediary solution doesn't include the start state
67 solution.append(global::settings.environment->startState());
68 for (const auto *state : states) solution.append(state);
69 // the OMPL intermediary solution doesn't include the goal state
70 solution.append(global::settings.environment->goalState());
71 IntermediaryControlSolution is(watch.elapsed(), cost.value(),
72 solution);
73 intermediaryControlSolutions.emplace_back(is);
74 });
75
76 watch.start();
77
78 const ob::PlannerTerminationCondition &ptc_approx =
80
81 // auto solved =
82 // ss_c->solve(ptc_approx); This is actually an ever ending loop. The
83 // ptc is never true. The control-based planners do not add approximate
84 // solutions
85
86 auto solved = ss_c->solve(global::settings.max_planning_time); // This stops the planner after max_planning_time sec
87
88 OMPL_INFORM("OMPL %s planning status: %s", _omplPlanner->getName().c_str(),
89 solved.asString().c_str());
90
91 if (solved) {
92 // Output the length of the path found
93 _solution = ss_c->getSolutionPath();
94 } else
95 OMPL_WARN("No solution found.");
96 return solved;
97 }
98
104 if (global::settings.forwardpropagation.forward_propagation_type ==
106 std::cout << "Setting KinematicCar" << std::endl;
107 auto odeSolver(std::make_shared<oc::ODEBasicSolver<>>(
108 ss_c->getSpaceInformation(), &KinematicCar::kinematicCarODE));
109
110 ss_c->setStatePropagator(oc::ODESolver::getStatePropagator(
112 }
113
114 if (global::settings.forwardpropagation.forward_propagation_type ==
116 std::cout << "Setting kinematicSingleTrackODE" << std::endl;
117
118 auto odeSolver(std::make_shared<oc::ODEBasicSolver<>>(
119 ss_c->getSpaceInformation(),
121
122 ss_c->setStatePropagator(oc::ODESolver::getStatePropagator(
123 odeSolver,
125 }
126 }
127
128 std::string name() const override { return "FP " + _omplPlanner->getName(); }
129
130 og::PathGeometric solution() const override {
131 // og::PathGeometric path(_solution);
132 std::cout << "Returning solution << " << std::endl;
133 return og::PathGeometric(ss_c->getSolutionPath().asGeometric());
134 }
135
136 bool hasReachedGoalExactly() const override {
137 return ss_c->haveExactSolutionPath();
138 }
139
140 double planningTime() const override {
141 return ss_c->getLastPlanComputationTime();
142 }
143
144 ob::Planner *omplPlanner() override { return _omplPlanner.get(); }
145
146 virtual nlohmann::json getSettings() const override {
147 nlohmann::json settings;
148 const auto &param_map = _omplPlanner->params().getParams();
149 for (const auto &[key, value_ptr] : param_map) {
150 settings[key] = value_ptr->getValue();;
151 }
152 return settings;
153 }
154
155 ob::PlannerTerminationCondition approxSolnPlannerTerminationCondition(
156 const ompl::base::ProblemDefinitionPtr &pdef) {
157 return ob::PlannerTerminationCondition(
158 [pdef] { return pdef->hasApproximateSolution(); });
159 }
160
161 private:
162 ob::PlannerPtr _omplPlanner;
163 oc::PathControl _solution{global::settings.ompl.control_space_info};
164};
165
166// control space
OMPLControlPlanner< oc::KPIECE1 > FPKPIECEPlanner
Definition: OMPLControlPlanner.hpp:167
OMPLControlPlanner< oc::SST > FPSSTPlanner
Definition: OMPLControlPlanner.hpp:169
OMPLControlPlanner< oc::RRT > FPRRTPlanner
Definition: OMPLControlPlanner.hpp:170
OMPLControlPlanner< oc::PDST > FPPDSTPlanner
Definition: OMPLControlPlanner.hpp:171
OMPLControlPlanner< oc::EST > FPESTPlanner
Definition: OMPLControlPlanner.hpp:168
Definition: AbstractPlanner.h:29
oc::SimpleSetup * ss_c
Definition: AbstractPlanner.h:115
std::vector< IntermediaryControlSolution > intermediaryControlSolutions
Definition: AbstractPlanner.h:67
static std::string LastCreatedPlannerName
Stores the name of the planner created last.
Definition: AbstractPlanner.h:38
Definition: OMPLControlPlanner.hpp:41
og::PathGeometric solution() const override
Returns the solution of the planner, which is a sparse PathGeometric.
Definition: OMPLControlPlanner.hpp:130
bool hasReachedGoalExactly() const override
Definition: OMPLControlPlanner.hpp:136
std::string name() const override
Definition: OMPLControlPlanner.hpp:128
OMPLControlPlanner()
Definition: OMPLControlPlanner.hpp:43
void setStatePropagator()
Set the needed state propagator.
Definition: OMPLControlPlanner.hpp:103
virtual nlohmann::json getSettings() const override
Definition: OMPLControlPlanner.hpp:146
double planningTime() const override
Definition: OMPLControlPlanner.hpp:140
ob::PlannerStatus run() override
Definition: OMPLControlPlanner.hpp:48
ob::Planner * omplPlanner() override
Definition: OMPLControlPlanner.hpp:144
ob::PlannerTerminationCondition approxSolnPlannerTerminationCondition(const ompl::base::ProblemDefinitionPtr &pdef)
Definition: OMPLControlPlanner.hpp:155
Stopwatch implementation to measure elapsed time.
Definition: Stopwatch.hpp:8
void start()
Starts the timer.
Definition: Stopwatch.hpp:15
double elapsed() const
Elapsed time in seconds.
Definition: Stopwatch.hpp:41
@ FORWARD_PROPAGATION_TYPE_KINEMATIC_SINGLE_TRACK
Definition: ForwardPropagation.h:10
@ FORWARD_PROPAGATION_TYPE_KINEMATIC_CAR
Definition: ForwardPropagation.h:9
void kinematicCarODE(const oc::ODESolver::StateType &q, const oc::Control *control, oc::ODESolver::StateType &qdot)
Definition: kinematic_car.hpp:15
void kinematicCarPostIntegration(const ob::State *, const oc::Control *, const double, ob::State *result)
Definition: kinematic_car.hpp:32
void kinematicSingleTrackODE(const oc::ODESolver::StateType &q, const oc::Control *control, oc::ODESolver::StateType &qdot)
Definition: kinematic_single_track.hpp:15
void kinematicSingleTrackPostIntegration(const ob::State *state, const oc::Control *, const double, ob::State *result)
Definition: kinematic_single_track.hpp:36
Planner
Definition: PlannerSettings.h:16
Definition: AbstractPlanner.h:58
ompl::control::SpaceInformationPtr control_space_info
Definition: PlannerSettings.h:408
PlannerSettings::GlobalSettings::OmplSettings ompl
static PlannerSettings::GlobalSettings settings
Definition: PlannerSettings.h:699