Bench-MR
A Motion Planning Benchmark for Wheeled Mobile Robots
kinematic_single_track.hpp
Go to the documentation of this file.
1#ifndef _KINEMATIC_SINGLE_TRACK_
2#define _KINEMATIC_SINGLE_TRACK_
3
4#include <ompl/base/spaces/SE2StateSpace.h>
5#include <ompl/control/ODESolver.h>
6#include <ompl/control/SpaceInformation.h>
7#include <ompl/control/spaces/RealVectorControlSpace.h>
8
9namespace oc = ompl::control;
10namespace ob = ompl::base;
11
13// as in
14// https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/blob/master/vehicleModels_commonRoad.pdf
15inline void kinematicSingleTrackODE(const oc::ODESolver::StateType& q,
16 const oc::Control* control,
17 oc::ODESolver::StateType& qdot) {
19 double* u = control->as<oc::RealVectorControlSpace::ControlType>()->values;
20 double heading = q[2];
21 qdot.resize(q.size(), 0);
22 // q = [x, y, heading, v_long, steering_angle]
23 // u = [long_acc, d_steering_angle ]
24 qdot[0] = q[3] * cos(heading);
25 qdot[1] = q[3] * sin(heading);
26 qdot[2] =
27 q[3] * (1 / global::settings.forwardpropagation.car_length) * tan(q[4]);
28
29 qdot[3] = u[0];
30 qdot[4] = u[1];
32}
33
34// as in
35// https://gitlab.lrz.de/tum-cps/commonroad-vehicle-models/blob/master/vehicleModels_commonRoad.pdf
37 const oc::Control* /*control*/,
38 const double /*duration*/,
39 ob::State* result) {
40 // Normalize orientation between 0 and 2*pi
41 ob::SO2StateSpace SO2;
42 auto* compState = result->as<ob::CompoundStateSpace::StateType>();
43 auto* se2state = compState->as<ob::SE2StateSpace::StateType>(0);
44 SO2.enforceBounds(se2state->as<ob::SO2StateSpace::StateType>(1));
45}
46
47inline void propagate(const oc::SpaceInformation* si, const ob::State* state,
48 const oc::Control* control, const double duration,
49 ob::State* result) {
51 static double timeStep = global::settings.forwardpropagation.dt;
52 int nsteps = ceil(duration / timeStep);
53
54 double dt = duration / nsteps;
55 const double* u =
56 control->as<oc::RealVectorControlSpace::ControlType>()->values;
57
58 ob::CompoundStateSpace::StateType& s =
59 *result->as<ob::CompoundStateSpace::StateType>();
60 ob::SE2StateSpace::StateType& se2 = *s.as<ob::SE2StateSpace::StateType>(0);
61 ob::RealVectorStateSpace::StateType& realPart =
62 *s.as<ob::RealVectorStateSpace::StateType>(1);
63
64 si->getStateSpace()->copyState(result, state);
65
66 for (int i = 0; i < nsteps; i++) {
67 se2.setX(se2.getX() + dt * realPart.values[0] * cos(se2.getYaw()));
68 se2.setY(se2.getY() + dt * realPart.values[0] * sin(se2.getYaw()));
69 se2.setYaw(se2.getYaw() +
70 dt * realPart.values[0] * tan(realPart.values[1]) /
72 realPart.values[0] = realPart.values[0] + dt * u[0];
73 realPart.values[1] = realPart.values[1] + dt * u[1];
74
75 if (!si->satisfiesBounds(result)) {
77 return;
78 }
79 }
80
81 ob::SO2StateSpace SO2;
82 SO2.enforceBounds(se2.as<ob::SO2StateSpace::StateType>(1));
84}
85
86} // namespace kinematicSingleTrack
87#endif /* _KINEMATIC_SINGLE_TRACK_ */
ob::SE2StateSpace::StateType State
Definition: Primitives.h:12
double stop()
Stops the timer.
Definition: Stopwatch.hpp:32
void resume()
Continues the stop watch from when it was stopped.
Definition: Stopwatch.hpp:51
Definition: kinematic_single_track.hpp:12
void propagate(const oc::SpaceInformation *si, const ob::State *state, const oc::Control *control, const double duration, ob::State *result)
Definition: kinematic_single_track.hpp:47
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
Property< double > car_length
Length of the wheel axis.
Definition: PlannerSettings.h:556
Property< double > dt
Integration time step.
Definition: PlannerSettings.h:561
Stopwatch steering_timer
Definition: PlannerSettings.h:414
PlannerSettings::GlobalSettings::OmplSettings ompl
PlannerSettings::GlobalSettings::ForwardPropagationSettings forwardpropagation
static PlannerSettings::GlobalSettings settings
Definition: PlannerSettings.h:699