68 double x = (c1.
xc + c2.
xc) / 2;
69 double y = (c1.
yc + c2.
yc) / 2;
100 TT_tangent_circles(c1, c2, q1);
104 return (*cstart)->cc_turn_length(**q1) + (*cend)->hc_turn_length(**q2);
120 return (distance >= 2 * c1.
radius);
138 return TiST_exists(c1, c2) || TeST_exists(c1, c2);
152 theta = angle +
alpha;
160 theta = angle -
alpha;
168 theta = angle -
alpha;
176 theta = angle +
alpha;
224 TiST_tangent_circles(c1, c2, q1, q2);
228 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q3);
234 TeST_tangent_circles(c1, c2, q1, q2);
238 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q3);
244 if (TiST_exists(c1, c2))
246 return TiST_path(c1, c2, cstart, cend, q1, q2, q3);
248 if (TeST_exists(c1, c2))
250 return TeST_path(c1, c2, cstart, cend, q1, q2, q3);
252 return numeric_limits<double>::max();
266 return distance <= 4 * c1.
radius;
272 double theta = angle;
274 double delta_x = 0.5 * distance;
275 double delta_y =
sqrt(
pow(r, 2) -
pow(delta_x, 2));
283 TT_tangent_circles(c1, tgt1, q1);
284 TT_tangent_circles(tgt1, c2, q2);
285 TT_tangent_circles(c1, tgt2, q3);
286 TT_tangent_circles(tgt2, c2, q4);
293 TTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
306 if (length1 < length2)
330 return numeric_limits<double>::max();
336 CC0pm_Dubins_State_Space::CC0pm_Dubins_State_Space(
double kappa,
double sigma,
double discretization,
bool forwards)
338 , forwards_(forwards)
339 , cc0pm_dubins_{ unique_ptr<CC0pm_Dubins>(
new CC0pm_Dubins(
this)) }
388 &qi1[cc_dubins::TT], &qi2[cc_dubins::TT]);
395 &qi1[cc_dubins::TST], &qi2[cc_dubins::TST], &qi3[cc_dubins::TST]);
402 &qi2[cc_dubins::TTT], &qi3[cc_dubins::TTT], &ci1[cc_dubins::TTT]);
410 nullptr, cstart[best_path], cend[best_path], ci1[best_path],
nullptr, length[best_path]);
455 double lg[] = { numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
456 numeric_limits<double>::max() };
458 for (
int i = 0; i < 2; i++)
460 for (
int j = 0; j < 2; j++)
463 if (j == 0 && state2.
kappa < 0)
465 else if (j == 1 && state2.
kappa > 0)
470 lg[2 * i + j] = path[2 * i + j]->
length;
493 for (
int i = 0; i < 2; i++)
495 delete start_circle[i];
496 delete end_circle[i];
498 for (
int i = 0; i < 4; i++)
505 return path[best_path];
518 vector<Control> cc_dubins_controls;
519 cc_dubins_controls.reserve(8);
548 return cc_dubins_controls;
double get_epsilon()
Return value of epsilon.
bool left
Turning direction: left/right.
double center_distance(const HC_CC_Circle &c1, const HC_CC_Circle &c2)
Cartesian distance between the centers of two circles.
const int nb_cc_dubins_paths
bool TTT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double sin_mu
Sine and cosine of mu.
double TTT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2, Configuration **q3, HC_CC_Circle **ci) const
double kappa_
Curvature, sharpness of clothoid.
void pointer_array_init(void *array[], int size)
Initialize an array with nullptr.
An implementation of continuous curvature (CC) steer for a Dubins car with zero curvature at the star...
double TiST_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2, Configuration **q3) const
double cc_turn_length(const Configuration &q) const
Length of a cc-turn.
int array_index_min(double array[], int size)
Find index with minimal value in double array.
double radius
Radius of the outer circle.
void hc_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a hc-turn.
void TTT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2, Configuration **q3, Configuration **q4) const
double hc_turn_length(const Configuration &q) const
Length of a hc-turn.
bool regular
Type of the circle: regular/irregular.
HC_CC_Circle_Param hc_cc_circle_param_
Parameters of a hc-/cc-circle.
double configuration_distance(const Configuration &q1, const Configuration &q2)
Cartesian distance between two configurations.
void cc_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a cc-turn.
void TiST_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2) const
void TT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q) const
bool TeST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
std::unique_ptr< CC0pm_Dubins > cc0pm_dubins_
Pimpl Idiom: unique pointer on class with families.
TFSIMD_FORCE_INLINE tfScalar angle(const Quaternion &q1, const Quaternion &q2)
HC_CC_Circle * cstart
Start, end and intermediate circles.
void straight_controls(const Configuration &q1, const Configuration &q2, std::vector< Control > &controls)
Appends controls with a straight line.
std::vector< Control > get_controls(const State &state1, const State &state2) const
Returns controls of the shortest path from state1 to state2.
double TT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2) const
double distance(double x0, double y0, double x1, double y1)
double theta
Orientation in rad between [0, 2*pi[.
void double_array_init(double array[], int size, double value)
Initialize an array with a given value.
CC_Dubins_Path * cc0pm_dubins(const State &state1, const State &state2) const
Returns a sequence of turns and straight lines connecting a start and an end configuration.
double x
Position in x of the robot.
void TeST_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2) const
HC_CC_Circle_Param rs_circle_param_
Parameter of a rs-circle.
bool configuration_equal(const Configuration &q1, const Configuration &q2)
Are two configurations equal?
double kappa
Max. curvature, inverse of max. curvature, max. sharpness.
double length
Path length.
Configuration * qi1
Intermediate configurations.
double get_distance(const State &state1, const State &state2) const
Returns shortest path length from state1 to state2.
INLINE Rall1d< T, V, S > asin(const Rall1d< T, V, S > &x)
void global_frame_change(double x, double y, double theta, double local_x, double local_y, double *global_x, double *global_y)
Transformation of (local_x, local_y) from local coordinate system to global one.
bool TST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
CC0pm_Dubins_State_Space * parent_
bool forward
Driving direction: forwards/backwards.
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
cc_dubins::path_type type
Path type.
double TST_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2, Configuration **q3) const
CC_Dubins_Path * cc0pm_circles_dubins_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
Returns a sequence of turns and straight lines connecting the two circles c1 and c2.
Description of a kinematic car's state.
double radius_
Outer radius of a hc-/cc-circle.
double mu
Angle between the initial orientation and the tangent to the circle at the initial position...
bool TT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double mu_
Angle between a configuration on the hc-/cc-circle and the tangent to the circle at that position...
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
CC0pm_Dubins(CC0pm_Dubins_State_Space *parent)
INLINE Rall1d< T, V, S > atan2(const Rall1d< T, V, S > &y, const Rall1d< T, V, S > &x)
void empty_controls(std::vector< Control > &controls)
Appends controls with 0 input.
bool forwards_
Driving direction.
double kappa
Curvature at position (x,y)
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
Configuration start
Start configuration.
double xc
Center of the circle.
void set_param(double _kappa, double _sigma, double _radius, double _mu, double _sin_mu, double _cos_mu, double _delta_min)
Set parameters.
double y
Position in y of the robot.
double theta
Orientation of the robot.
double TeST_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2, Configuration **q3) const
~CC0pm_Dubins_State_Space()
Destructor.
bool TiST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const