1#ifndef _KINEMATIC_SINGLE_TRACK_
2#define _KINEMATIC_SINGLE_TRACK_
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>
9namespace oc = ompl::control;
10namespace ob = ompl::base;
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);
24 qdot[0] = q[3] * cos(heading);
25 qdot[1] = q[3] * sin(heading);
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));
48 const oc::Control* control,
const double duration,
52 int nsteps = ceil(duration / timeStep);
54 double dt = duration / nsteps;
56 control->as<oc::RealVectorControlSpace::ControlType>()->values;
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);
64 si->getStateSpace()->copyState(result, state);
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];
75 if (!si->satisfiesBounds(result)) {
81 ob::SO2StateSpace SO2;
82 SO2.enforceBounds(se2.as<ob::SO2StateSpace::StateType>(1));
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