DYT/Tool/matlab/include/shared_autonomous/autonomouscodegen_reeds_shepp_primitives.hpp
2024-11-22 23:19:31 +08:00

1219 lines
50 KiB
C++

/* Copyright 2017-2018 The MathWorks, Inc. */
/**
* @file
* Functors used for Reeds-Shepp motion primitive calculations.
* To fully support code generation, note that this file needs to be fully
* compliant with the C++98 standard.
*/
#ifndef AUTONOMOUSCODEGEN_REEDS_SHEPP_PRIMITIVES_H_
#define AUTONOMOUSCODEGEN_REEDS_SHEPP_PRIMITIVES_H_
#include <algorithm>
#include <vector>
#ifdef BUILDING_LIBMWAUTONOMOUSCODEGEN
#include "autonomouscodegen/autonomouscodegen_constants.hpp" // for pi, twoPi, tooSmall
#include "autonomouscodegen/autonomouscodegen_reeds_shepp_constants.hpp" // for TotalNumPaths
#include "autonomouscodegen/autonomouscodegen_trig.hpp" // for wrapToPi, toPolar, abs
#include "autonomouscodegen/autonomouscodegen_util.hpp" // for data types
#else
// To deal with the fact that PackNGo has no include file hierarchy during test
#include "autonomouscodegen_constants.hpp"
#include "autonomouscodegen_reeds_shepp_constants.hpp"
#include "autonomouscodegen_trig.hpp"
#include "autonomouscodegen_util.hpp"
#endif
namespace autonomous {
namespace reedsshepp {
inline void tauOmega(const real64_T u,
const real64_T v,
const real64_T xi,
const real64_T eta,
const real64_T phi,
real64_T& tau,
real64_T& omega) {
real64_T delta = autonomous::wrapToPi(u - v);
real64_T A = sin(u) - sin(delta);
real64_T B = cos(u) - cos(delta) - 1.0;
real64_T t1 = atan2(eta * A - xi * B, xi * A + eta * B);
real64_T t2 = 2.0 * (cos(delta) - cos(v) - cos(u)) + 3;
tau = (t2 < 0) ? autonomous::wrapToPi(t1 + autonomous::pi) : autonomous::wrapToPi(t1);
omega = autonomous::wrapToPi(tau - u + v - phi);
}
// formula 8.1 in Reeds-Shepp paper
inline boolean_T computeLpSpLpPath(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T& t,
real64_T& u,
real64_T& v) {
autonomous::toPolar(x - sin(phi), y - 1.0 + cos(phi), u, t);
if (t >= -autonomous::tooSmall) {
v = autonomous::wrapToPi(phi - t);
return (v >= -autonomous::tooSmall);
}
return false;
}
// formula 8.2
inline boolean_T computeLpSpRpPath(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T& t,
real64_T& u,
real64_T& v) {
real64_T t1, u1;
autonomous::toPolar(x + sin(phi), y - 1.0 - cos(phi), u1, t1);
u1 = u1 * u1;
if (u1 >= 4.0) {
real64_T theta;
u = sqrt(u1 - 4.);
theta = atan2(2., u);
t = autonomous::wrapToPi(t1 + theta);
v = autonomous::wrapToPi(t - phi);
return t >= -autonomous::tooSmall && v >= -autonomous::tooSmall;
}
return false;
}
// formula 8.3 / 8.4 *** TYPO IN PAPER ***
inline boolean_T computeLpRmLPath(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T& t,
real64_T& u,
real64_T& v) {
real64_T xi = x - sin(phi);
real64_T eta = y - 1.0 + cos(phi);
real64_T u1, theta;
autonomous::toPolar(xi, eta, u1, theta);
if (u1 <= 4.0) {
u = -2.0 * asin(0.25 * u1);
t = autonomous::wrapToPi(theta + 0.5 * u + autonomous::pi);
v = autonomous::wrapToPi(phi - t + u);
return t >= -autonomous::tooSmall && u <= autonomous::tooSmall;
}
return false;
}
// formula 8.7
inline boolean_T computeLpRupLumRmPath(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T& t,
real64_T& u,
real64_T& v) {
real64_T xi = x + sin(phi);
real64_T eta = y - 1.0 - cos(phi);
real64_T rho = 0.25 * (2.0 + sqrt(xi * xi + eta * eta));
if (rho <= 1.) {
u = acos(rho);
tauOmega(u, -u, xi, eta, phi, t, v);
return t >= -autonomous::tooSmall && v <= autonomous::tooSmall;
}
return false;
}
// formula 8.8
inline boolean_T computeLpRumLumRpPath(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T& t,
real64_T& u,
real64_T& v) {
real64_T xi = x + sin(phi);
real64_T eta = y - 1.0 - cos(phi);
real64_T rho = (20.0 - xi * xi - eta * eta) / 16.0;
if (rho >= 0 && rho <= 1) {
u = -acos(rho);
if (u >= -.5 * autonomous::pi) {
tauOmega(u, u, xi, eta, phi, t, v);
return t >= -autonomous::tooSmall && v >= -autonomous::tooSmall;
}
}
return false;
}
// formula 8.9
inline boolean_T computeLpRmSmLmPath(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T& t,
real64_T& u,
real64_T& v) {
real64_T xi = x - sin(phi);
real64_T eta = y - 1.0 + cos(phi);
real64_T rho, theta;
autonomous::toPolar(xi, eta, rho, theta);
if (rho >= 2.0) {
real64_T r = sqrt(rho * rho - 4.0);
u = 2.0 - r;
t = autonomous::wrapToPi(theta + atan2(r, -2.0));
v = autonomous::wrapToPi(phi - 0.5 * autonomous::pi - t);
return t >= -autonomous::tooSmall && u <= autonomous::tooSmall && v <= autonomous::tooSmall;
}
return false;
}
// formula 8.10
inline boolean_T computeLpRmSmRmPath(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T& t,
real64_T& u,
real64_T& v) {
real64_T xi = x + sin(phi);
real64_T eta = y - 1.0 - cos(phi);
real64_T rho, theta;
autonomous::toPolar(-eta, xi, rho, theta);
if (rho >= 2.0) {
t = theta;
u = 2.0 - rho;
v = autonomous::wrapToPi(t + 0.5 * autonomous::pi - phi);
return t >= -autonomous::tooSmall && u <= autonomous::tooSmall && v <= autonomous::tooSmall;
}
return false;
}
// formula 8.11 *** TYPO IN PAPER ***
inline boolean_T computeLpRmSLmRpPath(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T& t,
real64_T& u,
real64_T& v) {
real64_T xi = x + sin(phi);
real64_T eta = y - 1.0 - cos(phi);
real64_T rho, theta;
autonomous::toPolar(xi, eta, rho, theta);
if (rho >= 2.0) {
u = 4.0 - sqrt(rho * rho - 4.0);
if (u <= autonomous::tooSmall) {
t = autonomous::wrapToPi(atan2((4 - u) * xi - 2 * eta, -2 * xi + (u - 4) * eta));
v = autonomous::wrapToPi(t - phi);
return t >= -autonomous::tooSmall && v >= -autonomous::tooSmall;
}
}
return false;
}
/*
* RSPathType - Enumeration for holding path type.
*/
enum RSPathType {
LRLNN = 0,
RLRNN,
LRLRN,
RLRLN,
LRSLN,
RLSRN,
LSRLN,
RSLRN,
LRSRN,
RLSLN,
RSRLN,
LSLRN,
LSRNN,
RSLNN,
LSLNN,
RSRNN,
LRSLR,
RLSRL
};
/*
* ReedsSheppPath - Encapsulate normalized Reeds-Shepp path.
*/
class ReedsSheppPath {
public:
ReedsSheppPath(const real64_T firstSegment = inf,
const real64_T secondSegment = inf,
const real64_T thirdSegment = inf,
const real64_T fourthSegment = inf,
const real64_T fifthSegment = inf,
const RSPathType pathType = autonomous::reedsshepp::LRLNN,
const real64_T forwardCost = 1.0,
const real64_T reverseCost = 1.0)
: pathType_(pathType)
, reverseCost_(reverseCost)
, forwardCost_(forwardCost) {
segmentLengths_[0] = firstSegment;
segmentLengths_[1] = secondSegment;
segmentLengths_[2] = thirdSegment;
segmentLengths_[3] = fourthSegment;
segmentLengths_[4] = fifthSegment;
}
real64_T length() const {
return autonomous::abs(segmentLengths_[0]) + autonomous::abs(segmentLengths_[1]) +
autonomous::abs(segmentLengths_[2]) + autonomous::abs(segmentLengths_[3]) +
autonomous::abs(segmentLengths_[4]);
}
real64_T cost() const {
real64_T len = 0.0;
for (uint32_T i = 0; i < 5; ++i) {
if (std::signbit(segmentLengths_[i])) {
len += autonomous::abs(reverseCost_ * segmentLengths_[i]);
} else {
len += autonomous::abs(forwardCost_ * segmentLengths_[i]);
}
}
return len;
}
RSPathType getPathType() const {
return pathType_;
}
const real64_T* getSegmentLengths() const {
return &segmentLengths_[0];
}
private:
RSPathType pathType_;
real64_T segmentLengths_[5];
real64_T reverseCost_;
real64_T forwardCost_;
};
// Compute for shortest path types
/*
* computeCSCPath - compute ReedsSheppPath for CSCPath.
*/
inline void computeCSCPath(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T reverseCost,
ReedsSheppPath& path) {
real64_T t, u, v, L;
real64_T Lmin = path.length();
if (computeLpSpLpPath(x, y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::LSLNN, 1, reverseCost);
Lmin = L;
}
// time flip
if (computeLpSpLpPath(-x, y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::LSLNN, 1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpSpLpPath(x, -y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::RSRNN, 1, reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpSpLpPath(-x, -y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::RSRNN, 1, reverseCost);
Lmin = L;
}
if (computeLpSpRpPath(x, y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::LSRNN, 1, reverseCost);
Lmin = L;
}
// time flip
if (computeLpSpRpPath(-x, y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::LSRNN, 1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpSpRpPath(x, -y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::RSLNN, 1, reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpSpRpPath(-x, -y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::RSLNN, 1, reverseCost);
}
}
/*
* computeCCCPath - compute ReedsSheppPath for CCCPath.
*/
inline void computeCCCPath(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T reverseCost,
ReedsSheppPath& path) {
real64_T t, u, v, L;
real64_T Lmin = path.length();
if (computeLpRmLPath(x, y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::LRLNN, 1, reverseCost);
Lmin = L;
}
// time flip
if (computeLpRmLPath(-x, y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::LRLNN, 1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRmLPath(x, -y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::RLRNN, 1, reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRmLPath(-x, -y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::RLRNN, 1, reverseCost);
Lmin = L;
}
// backwards
real64_T xb = x * cos(phi) + y * sin(phi);
real64_T yb = x * sin(phi) - y * cos(phi);
if (computeLpRmLPath(xb, yb, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(v, u, t, 0.0, 0.0, autonomous::reedsshepp::LRLNN, 1, reverseCost);
Lmin = L;
}
// time flip
if (computeLpRmLPath(-xb, yb, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-v, -u, -t, 0.0, 0.0, autonomous::reedsshepp::LRLNN, 1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRmLPath(xb, -yb, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(v, u, t, 0.0, 0.0, autonomous::reedsshepp::RLRNN, 1, reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRmLPath(-xb, -yb, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-v, -u, -t, 0.0, 0.0, autonomous::reedsshepp::RLRNN, 1, reverseCost);
}
}
/*
* computeCCCCPath - compute ReedsSheppPath for CCCCPath.
*/
inline void computeCCCCPath(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T reverseCost,
ReedsSheppPath& path) {
real64_T t, u, v, L;
real64_T Lmin = path.length();
if (computeLpRupLumRmPath(x, y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + 2.0 * autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, -u, v, 0.0, autonomous::reedsshepp::LRLRN, 1, reverseCost);
Lmin = L;
}
// time flip
if (computeLpRupLumRmPath(-x, y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + 2.0 * autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, u, -v, 0.0, autonomous::reedsshepp::LRLRN, 1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRupLumRmPath(x, -y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + 2.0 * autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, -u, v, 0.0, autonomous::reedsshepp::RLRLN, 1, reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRupLumRmPath(-x, -y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + 2.0 * autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, u, -v, 0.0, autonomous::reedsshepp::RLRLN, 1, reverseCost);
Lmin = L;
}
if (computeLpRumLumRpPath(x, y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + 2.0 * autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, u, v, 0.0, autonomous::reedsshepp::LRLRN, 1, reverseCost);
Lmin = L;
}
// time flip
if (computeLpRumLumRpPath(-x, y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + 2.0 * autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, -u, -v, 0.0, autonomous::reedsshepp::LRLRN, 1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRumLumRpPath(x, -y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + 2.0 * autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, u, u, v, 0.0, autonomous::reedsshepp::RLRLN, 1, reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRumLumRpPath(-x, -y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + 2.0 * autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, -u, -u, -v, 0.0, autonomous::reedsshepp::RLRLN, 1, reverseCost);
}
}
/*
* computeCCSCPath - compute ReedsSheppPath for CCSCPath.
*/
inline void computeCCSCPath(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T reverseCost,
ReedsSheppPath& path) {
real64_T t, u, v, L;
real64_T Lmin = path.length() - 0.5 * autonomous::pi;
if (computeLpRmSmLmPath(x, y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, -0.5 * autonomous::pi, u, v, 0.0, autonomous::reedsshepp::LRSLN, 1,
reverseCost);
Lmin = L;
}
// time flip
if (computeLpRmSmLmPath(-x, y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, -v, 0.0, autonomous::reedsshepp::LRSLN,
1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRmSmLmPath(x, -y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, -0.5 * autonomous::pi, u, v, 0.0, autonomous::reedsshepp::RLSRN, 1,
reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRmSmLmPath(-x, -y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, -v, 0.0, autonomous::reedsshepp::RLSRN,
1, reverseCost);
Lmin = L;
}
if (computeLpRmSmRmPath(x, y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, -0.5 * autonomous::pi, u, v, 0.0, autonomous::reedsshepp::LRSRN, 1,
reverseCost);
Lmin = L;
}
// time flip
if (computeLpRmSmRmPath(-x, y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, -v, 0.0, autonomous::reedsshepp::LRSRN,
1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRmSmRmPath(x, -y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, -0.5 * autonomous::pi, u, v, 0.0, autonomous::reedsshepp::RLSLN, 1,
reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRmSmRmPath(-x, -y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, -v, 0.0, autonomous::reedsshepp::RLSLN,
1, reverseCost);
Lmin = L;
}
// backwards
real64_T xb = x * cos(phi) + y * sin(phi);
real64_T yb = x * sin(phi) - y * cos(phi);
if (computeLpRmSmLmPath(xb, yb, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(v, u, -0.5 * autonomous::pi, t, 0.0, autonomous::reedsshepp::LSRLN, 1,
reverseCost);
Lmin = L;
}
// time flip
if (computeLpRmSmLmPath(-xb, yb, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-v, -u, 0.5 * autonomous::pi, -t, 0.0, autonomous::reedsshepp::LSRLN,
1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRmSmLmPath(xb, -yb, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(v, u, -0.5 * autonomous::pi, t, 0.0, autonomous::reedsshepp::RSLRN, 1,
reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRmSmLmPath(-xb, -yb, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-v, -u, 0.5 * autonomous::pi, -t, 0.0, autonomous::reedsshepp::RSLRN,
1, reverseCost);
Lmin = L;
}
if (computeLpRmSmRmPath(xb, yb, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(v, u, -0.5 * autonomous::pi, t, 0.0, autonomous::reedsshepp::RSRLN, 1,
reverseCost);
Lmin = L;
}
// time flip
if (computeLpRmSmRmPath(-xb, yb, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-v, -u, 0.5 * autonomous::pi, -t, 0.0, autonomous::reedsshepp::RSRLN,
1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRmSmRmPath(xb, -yb, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(v, u, -0.5 * autonomous::pi, t, 0.0, autonomous::reedsshepp::LSLRN, 1,
reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRmSmRmPath(-xb, -yb, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-v, -u, 0.5 * autonomous::pi, -t, 0.0, autonomous::reedsshepp::LSLRN,
1, reverseCost);
}
}
/*
* computeCCSCCPath - compute ReedsSheppPath for CCSCCPath.
*/
inline void computeCCSCCPath(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T reverseCost,
ReedsSheppPath& path) {
real64_T t, u, v, L;
real64_T Lmin = path.length() - autonomous::pi;
if (computeLpRmSLmRpPath(x, y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, -0.5 * autonomous::pi, u, -0.5 * autonomous::pi, v,
autonomous::reedsshepp::LRSLR, 1, reverseCost);
Lmin = L;
}
// time flip
if (computeLpRmSLmRpPath(-x, y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, 0.5 * autonomous::pi, -v,
autonomous::reedsshepp::LRSLR, 1, reverseCost);
Lmin = L;
}
// reflect
if (computeLpRmSLmRpPath(x, -y, -phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(t, -0.5 * autonomous::pi, u, -0.5 * autonomous::pi, v,
autonomous::reedsshepp::RLSRL, 1, reverseCost);
Lmin = L;
}
// time flip + reflect
if (computeLpRmSLmRpPath(-x, -y, phi, t, u, v) &&
Lmin > (L = autonomous::abs(t) + autonomous::abs(u) + autonomous::abs(v))) {
path = ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, 0.5 * autonomous::pi, -v,
autonomous::reedsshepp::RLSRL, 1, reverseCost);
}
}
/*
* Compute all path types.
*/
/*
* computeCSCPath - compute ReedsSheppPath for CSCPath.
*/
inline void computeCSCPathAll(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T forwardCost,
const real64_T reverseCost,
const boolean_T allPathTypes[TotalNumPaths],
std::vector<ReedsSheppPath>* path) {
real64_T t, u, v;
if (allPathTypes[0]) {
computeLpSpLpPath(x, y, phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::LSLNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, 0.0, 0.0, autonomous::reedsshepp::LSLNN,
forwardCost, reverseCost));
}
// time flip
if (allPathTypes[1]) {
computeLpSpLpPath(-x, y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::LSLNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, 0.0, 0.0,
autonomous::reedsshepp::LSLNN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[2]) {
computeLpSpLpPath(x, -y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::RSRNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, 0.0, 0.0, autonomous::reedsshepp::RSRNN,
forwardCost, reverseCost));
}
// time flip + reflect
if (allPathTypes[3]) {
computeLpSpLpPath(-x, -y, phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::RSRNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, 0.0, 0.0,
autonomous::reedsshepp::RSRNN, forwardCost,
reverseCost));
}
if (allPathTypes[4]) {
computeLpSpRpPath(x, y, phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::LSRNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, 0.0, 0.0, autonomous::reedsshepp::LSRNN,
forwardCost, reverseCost));
}
// time flip
if (allPathTypes[5]) {
computeLpSpRpPath(-x, y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::LSRNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, 0.0, 0.0,
autonomous::reedsshepp::LSRNN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[6]) {
computeLpSpRpPath(x, -y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::RSLNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, 0.0, 0.0, autonomous::reedsshepp::RSLNN,
forwardCost, reverseCost));
}
// time flip + reflect
if (allPathTypes[7]) {
computeLpSpRpPath(-x, -y, phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::RSLNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, 0.0, 0.0,
autonomous::reedsshepp::RSLNN, forwardCost,
reverseCost));
}
}
/*
* computeCCCPath - compute ReedsSheppPath for CCCPath.
*/
inline void computeCCCPathAll(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T forwardCost,
const real64_T reverseCost,
const boolean_T allPathTypes[TotalNumPaths],
std::vector<ReedsSheppPath>* path) {
real64_T t, u, v;
if (allPathTypes[8]) {
computeLpRmLPath(x, y, phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::LRLNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, 0.0, 0.0, autonomous::reedsshepp::LRLNN,
forwardCost, reverseCost));
}
// time flip
if (allPathTypes[9]) {
computeLpRmLPath(-x, y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::LRLNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, 0.0, 0.0,
autonomous::reedsshepp::LRLNN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[10]) {
computeLpRmLPath(x, -y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, v, 0.0, 0.0, autonomous::reedsshepp::RLRNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, 0.0, 0.0, autonomous::reedsshepp::RLRNN,
forwardCost, reverseCost));
}
// time flip + reflect
if (allPathTypes[11]) {
computeLpRmLPath(-x, -y, phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, -v, 0.0, 0.0, autonomous::reedsshepp::RLRNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, 0.0, 0.0,
autonomous::reedsshepp::RLRNN, forwardCost,
reverseCost));
}
// backwards
real64_T xb = x * cos(phi) + y * sin(phi);
real64_T yb = x * sin(phi) - y * cos(phi);
if (allPathTypes[12]) {
computeLpRmLPath(xb, yb, phi, t, u, v)
? path->push_back(ReedsSheppPath(v, u, t, 0.0, 0.0, autonomous::reedsshepp::LRLNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, 0.0, 0.0, autonomous::reedsshepp::LRLNN,
forwardCost, reverseCost));
}
// time flip
if (allPathTypes[13]) {
computeLpRmLPath(-xb, yb, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-v, -u, -t, 0.0, 0.0, autonomous::reedsshepp::LRLNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, 0.0, 0.0,
autonomous::reedsshepp::LRLNN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[14]) {
computeLpRmLPath(xb, -yb, -phi, t, u, v)
? path->push_back(ReedsSheppPath(v, u, t, 0.0, 0.0, autonomous::reedsshepp::RLRNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, 0.0, 0.0, autonomous::reedsshepp::RLRNN,
forwardCost, reverseCost));
}
// time flip + reflect
if (allPathTypes[15]) {
computeLpRmLPath(-xb, -yb, phi, t, u, v)
? path->push_back(ReedsSheppPath(-v, -u, -t, 0.0, 0.0, autonomous::reedsshepp::RLRNN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, 0.0, 0.0,
autonomous::reedsshepp::RLRNN, forwardCost,
reverseCost));
}
}
/*
* computeCCCCPath - compute ReedsSheppPath for CCCCPath.
*/
inline void computeCCCCPathAll(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T forwardCost,
const real64_T reverseCost,
const boolean_T allPathTypes[TotalNumPaths],
std::vector<ReedsSheppPath>* path) {
real64_T t, u, v;
if (allPathTypes[16]) {
computeLpRupLumRmPath(x, y, phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, -u, v, 0.0, autonomous::reedsshepp::LRLRN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, -inf, inf, 0.0,
autonomous::reedsshepp::LRLRN, forwardCost,
reverseCost));
}
// time flip
if (allPathTypes[17]) {
computeLpRupLumRmPath(-x, y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, u, -v, 0.0, autonomous::reedsshepp::LRLRN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, inf, -inf, 0.0,
autonomous::reedsshepp::LRLRN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[18]) {
computeLpRupLumRmPath(x, -y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, -u, v, 0.0, autonomous::reedsshepp::RLRLN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, -inf, inf, 0.0,
autonomous::reedsshepp::RLRLN, forwardCost,
reverseCost));
}
// time flip + reflect
if (allPathTypes[19]) {
computeLpRupLumRmPath(-x, -y, phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, u, -v, 0.0, autonomous::reedsshepp::RLRLN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, inf, -inf, 0.0,
autonomous::reedsshepp::RLRLN, forwardCost,
reverseCost));
}
if (allPathTypes[20]) {
computeLpRumLumRpPath(x, y, phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, u, v, 0.0, autonomous::reedsshepp::LRLRN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, inf, 0.0, autonomous::reedsshepp::LRLRN,
forwardCost, reverseCost));
}
// time flip
if (allPathTypes[21]) {
computeLpRumLumRpPath(-x, y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, -u, -v, 0.0, autonomous::reedsshepp::LRLRN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, -inf, 0.0,
autonomous::reedsshepp::LRLRN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[22]) {
computeLpRumLumRpPath(x, -y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(t, u, u, v, 0.0, autonomous::reedsshepp::RLRLN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, inf, inf, 0.0, autonomous::reedsshepp::RLRLN,
forwardCost, reverseCost));
}
// time flip + reflect
if (allPathTypes[23]) {
computeLpRumLumRpPath(-x, -y, phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, -u, -u, -v, 0.0, autonomous::reedsshepp::RLRLN,
forwardCost, reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, -inf, -inf, 0.0,
autonomous::reedsshepp::RLRLN, forwardCost,
reverseCost));
}
}
/*
* computeCCSCPath - compute ReedsSheppPath for CCSCPath.
*/
inline void computeCCSCPathAll(const real64_T x,
const real64_T y,
const real64_T phi,
const real64_T forwardCost,
const real64_T reverseCost,
const boolean_T allPathTypes[TotalNumPaths],
std::vector<ReedsSheppPath>* path) {
real64_T t, u, v;
if (allPathTypes[24]) {
computeLpRmSmLmPath(x, y, phi, t, u, v)
? path->push_back(ReedsSheppPath(t, -0.5 * autonomous::pi, u, v, 0.0,
autonomous::reedsshepp::LRSLN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, -0.5 * autonomous::pi, inf, inf, 0.0,
autonomous::reedsshepp::LRSLN, forwardCost,
reverseCost));
}
// time flip
if (allPathTypes[25]) {
computeLpRmSmLmPath(-x, y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, -v, 0.0,
autonomous::reedsshepp::LRSLN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, 0.5 * autonomous::pi, -inf, -inf, 0.0,
autonomous::reedsshepp::LRSLN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[26]) {
computeLpRmSmLmPath(x, -y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(t, -0.5 * autonomous::pi, u, v, 0.0,
autonomous::reedsshepp::RLSRN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, -0.5 * autonomous::pi, inf, inf, 0.0,
autonomous::reedsshepp::RLSRN, forwardCost,
reverseCost));
}
// time flip + reflect
if (allPathTypes[27]) {
computeLpRmSmLmPath(-x, -y, phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, -v, 0.0,
autonomous::reedsshepp::RLSRN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, 0.5 * autonomous::pi, -inf, -inf, 0.0,
autonomous::reedsshepp::RLSRN, forwardCost,
reverseCost));
}
if (allPathTypes[28]) {
computeLpRmSmRmPath(x, y, phi, t, u, v)
? path->push_back(ReedsSheppPath(t, -0.5 * autonomous::pi, u, v, 0.0,
autonomous::reedsshepp::LRSRN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, -0.5 * autonomous::pi, inf, inf, 0.0,
autonomous::reedsshepp::LRSRN, forwardCost,
reverseCost));
}
// time flip
if (allPathTypes[29]) {
computeLpRmSmRmPath(-x, y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, -v, 0.0,
autonomous::reedsshepp::LRSRN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, 0.5 * autonomous::pi, -inf, -inf, 0.0,
autonomous::reedsshepp::LRSRN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[30]) {
computeLpRmSmRmPath(x, -y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(t, -0.5 * autonomous::pi, u, v, 0.0,
autonomous::reedsshepp::RLSLN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, -0.5 * autonomous::pi, inf, inf, 0.0,
autonomous::reedsshepp::RLSLN, forwardCost,
reverseCost));
}
// time flip + reflect
if (allPathTypes[31]) {
computeLpRmSmRmPath(-x, -y, phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, -v, 0.0,
autonomous::reedsshepp::RLSLN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, 0.5 * autonomous::pi, -inf, -inf, 0.0,
autonomous::reedsshepp::RLSLN, forwardCost,
reverseCost));
}
// backwards
real64_T xb = x * cos(phi) + y * sin(phi);
real64_T yb = x * sin(phi) - y * cos(phi);
if (allPathTypes[32]) {
computeLpRmSmLmPath(xb, yb, phi, t, u, v)
? path->push_back(ReedsSheppPath(v, u, -0.5 * autonomous::pi, t, 0.0,
autonomous::reedsshepp::LSRLN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, -0.5 * autonomous::pi, inf, 0.0,
autonomous::reedsshepp::LSRLN, forwardCost,
reverseCost));
}
// time flip
if (allPathTypes[33]) {
computeLpRmSmLmPath(-xb, yb, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-v, -u, 0.5 * autonomous::pi, -t, 0.0,
autonomous::reedsshepp::LSRLN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, 0.5 * autonomous::pi, -inf, 0.0,
autonomous::reedsshepp::LSRLN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[34]) {
computeLpRmSmLmPath(xb, -yb, -phi, t, u, v)
? path->push_back(ReedsSheppPath(v, u, -0.5 * autonomous::pi, t, 0.0,
autonomous::reedsshepp::RSLRN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, -0.5 * autonomous::pi, inf, 0.0,
autonomous::reedsshepp::RSLRN, forwardCost,
reverseCost));
}
// time flip + reflect
if (allPathTypes[35]) {
computeLpRmSmLmPath(-xb, -yb, phi, t, u, v)
? path->push_back(ReedsSheppPath(-v, -u, 0.5 * autonomous::pi, -t, 0.0,
autonomous::reedsshepp::RSLRN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, 0.5 * autonomous::pi, -inf, 0.0,
autonomous::reedsshepp::RSLRN, forwardCost,
reverseCost));
}
if (allPathTypes[36]) {
computeLpRmSmRmPath(xb, yb, phi, t, u, v)
? path->push_back(ReedsSheppPath(v, u, -0.5 * autonomous::pi, t, 0.0,
autonomous::reedsshepp::RSRLN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, -0.5 * autonomous::pi, inf, 0.0,
autonomous::reedsshepp::RSRLN, forwardCost,
reverseCost));
}
// time flip
if (allPathTypes[37]) {
computeLpRmSmRmPath(-xb, yb, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-v, -u, 0.5 * autonomous::pi, -t, 0.0,
autonomous::reedsshepp::RSRLN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, 0.5 * autonomous::pi, -inf, 0.0,
autonomous::reedsshepp::RSRLN, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[38]) {
computeLpRmSmRmPath(xb, -yb, -phi, t, u, v)
? path->push_back(ReedsSheppPath(v, u, -0.5 * autonomous::pi, t, 0.0,
autonomous::reedsshepp::LSLRN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, inf, -0.5 * autonomous::pi, inf, 0.0,
autonomous::reedsshepp::LSLRN, forwardCost,
reverseCost));
}
// time flip + reflect
if (allPathTypes[39]) {
computeLpRmSmRmPath(-xb, -yb, phi, t, u, v)
? path->push_back(ReedsSheppPath(-v, -u, 0.5 * autonomous::pi, -t, 0.0,
autonomous::reedsshepp::LSLRN, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, -inf, 0.5 * autonomous::pi, -inf, 0.0,
autonomous::reedsshepp::LSLRN, forwardCost,
reverseCost));
}
}
/*
* computeCCSCCPath - compute ReedsSheppPath for CCSCCPath.
*/
inline void computeCCSCCPathAll(const real64_T x,
const real64_T y,
const real64_T phi,
real64_T const forwardCost,
const real64_T reverseCost,
const boolean_T allPathTypes[TotalNumPaths],
std::vector<ReedsSheppPath>* path) {
real64_T t, u, v;
if (allPathTypes[40]) {
computeLpRmSLmRpPath(x, y, phi, t, u, v)
? path->push_back(ReedsSheppPath(t, -0.5 * autonomous::pi, u, -0.5 * autonomous::pi, v,
autonomous::reedsshepp::LRSLR, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, -0.5 * autonomous::pi, inf, -0.5 * autonomous::pi,
inf, autonomous::reedsshepp::LRSLR, forwardCost,
reverseCost));
}
// time flip
if (allPathTypes[41]) {
computeLpRmSLmRpPath(-x, y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, 0.5 * autonomous::pi, -v,
autonomous::reedsshepp::LRSLR, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, 0.5 * autonomous::pi, -inf, 0.5 * autonomous::pi,
-inf, autonomous::reedsshepp::LRSLR, forwardCost,
reverseCost));
}
// reflect
if (allPathTypes[42]) {
computeLpRmSLmRpPath(x, -y, -phi, t, u, v)
? path->push_back(ReedsSheppPath(t, -0.5 * autonomous::pi, u, -0.5 * autonomous::pi, v,
autonomous::reedsshepp::RLSRL, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(inf, -0.5 * autonomous::pi, inf, -0.5 * autonomous::pi,
inf, autonomous::reedsshepp::RLSRL, forwardCost,
reverseCost));
}
// time flip + reflect
if (allPathTypes[43]) {
computeLpRmSLmRpPath(-x, -y, phi, t, u, v)
? path->push_back(ReedsSheppPath(-t, 0.5 * autonomous::pi, -u, 0.5 * autonomous::pi, -v,
autonomous::reedsshepp::RLSRL, forwardCost,
reverseCost))
: path->push_back(ReedsSheppPath(-inf, 0.5 * autonomous::pi, -inf, 0.5 * autonomous::pi,
-inf, autonomous::reedsshepp::RLSRL, forwardCost,
reverseCost));
}
}
} // namespace reedsshepp
} // namespace autonomous
#endif /* AUTONOMOUSCODEGEN_REEDS_SHEPP_PRIMITIVES_H_ */