68 double x = (c1.
xc + c2.
xc) / 2;
69 double y = (c1.
yc + c2.
yc) / 2;
100 TT_tangent_circles(c1, c2, q2);
105 return (*cstart)->hc_turn_length(**q1) + (*cend)->hc_turn_length(**q3);
121 return distance >= 2 * parent_->
radius_;
139 return TiST_exists(c1, c2) || TeST_exists(c1, c2);
153 theta = angle +
alpha;
161 theta = angle -
alpha;
169 theta = angle -
alpha;
177 theta = angle +
alpha;
225 TiST_tangent_circles(c1, c2, q2, q3);
230 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) + (*cend)->hc_turn_length(**q4);
236 TeST_tangent_circles(c1, c2, q2, q3);
241 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) + (*cend)->hc_turn_length(**q4);
247 if (TiST_exists(c1, c2))
249 return TiST_path(c1, c2, cstart, cend, q1, q2, q3, q4);
251 if (TeST_exists(c1, c2))
253 return TeST_path(c1, c2, cstart, cend, q1, q2, q3, q4);
255 return numeric_limits<double>::max();
269 return distance <= 4 * parent_->
radius_;
275 double theta = angle;
276 double r = 2 * parent_->
radius_;
277 double delta_x = 0.5 * distance;
278 double delta_y =
sqrt(
pow(r, 2) -
pow(delta_x, 2));
286 TT_tangent_circles(c1, tgt1, q1);
287 TT_tangent_circles(tgt1, c2, q2);
288 TT_tangent_circles(c1, tgt2, q3);
289 TT_tangent_circles(tgt2, c2, q4);
296 TTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
297 HC_CC_Circle *start1, *start2, *end1, *end2, *middle1, *middle2;
311 if (length1 < length2)
339 return numeric_limits<double>::max();
355 return distance <= 6 * parent_->
radius_;
361 double theta = angle;
362 double r1, delta_x, delta_y, x, y;
366 delta_x = (distance + r1) / 2;
371 delta_x = (distance - r1) / 2;
385 TT_tangent_circles(c1, tgt1, q1);
386 TT_tangent_circles(tgt1, tgt2, q2);
387 TT_tangent_circles(tgt2, c2, q3);
389 TT_tangent_circles(c1, tgt3, q4);
390 TT_tangent_circles(tgt3, tgt4, q5);
391 TT_tangent_circles(tgt4, c2, q6);
399 TTTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd, &qe, &qf);
400 HC_CC_Circle *start1, *start2, *end1, *end2, *middle1, *middle2, *middle3, *middle4;
418 if (length1 < length2)
430 delete start2,
delete end2,
delete middle3;
452 return numeric_limits<double>::max();
458 CCpmpm_Dubins_State_Space::CCpmpm_Dubins_State_Space(
double kappa,
double sigma,
double discretization,
bool forwards)
460 , forwards_(forwards)
461 , ccpmpm_dubins_{ unique_ptr<CCpmpm_Dubins>(
new CCpmpm_Dubins(
this)) }
516 &qi1[cc_dubins::TT], &qi2[cc_dubins::TT], &qi3[cc_dubins::TT]);
524 &qi2[cc_dubins::TST], &qi3[cc_dubins::TST], &qi4[cc_dubins::TST]);
531 &qi2[cc_dubins::TTT], &qi3[cc_dubins::TTT], &ci1[cc_dubins::TTT]);
538 c1, c2, &cstart[
cc_dubins::TTTT], &cend[cc_dubins::TTTT], &qi1[cc_dubins::TTTT], &qi2[cc_dubins::TTTT],
539 &qi3[cc_dubins::TTTT], &ci1[cc_dubins::TTTT], &ci2[cc_dubins::TTTT]);
546 qi3[best_path], qi4[best_path], cstart[best_path], cend[best_path], ci1[best_path],
547 ci2[best_path], length[best_path]);
595 double lg[] = { numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
596 numeric_limits<double>::max() };
598 for (
int i = 0; i < 2; i++)
601 if (i == 0 && state1.
kappa < 0)
603 else if (i == 1 && state1.
kappa > 0)
605 for (
int j = 0; j < 2; j++)
608 if (j == 0 && state2.
kappa < 0)
610 else if (j == 1 && state2.
kappa > 0)
615 lg[2 * i + j] = path[2 * i + j]->
length;
638 for (
int i = 0; i < 2; i++)
640 delete start_circle[i];
641 delete end_circle[i];
643 for (
int i = 0; i < 4; i++)
650 return path[best_path];
663 vector<Control> cc_dubins_controls;
664 cc_dubins_controls.reserve(10);
700 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
double sin_mu
Sine and cosine of mu.
bool TTT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
void TiST_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2) const
double kappa_
Curvature, sharpness of clothoid.
void pointer_array_init(void *array[], int size)
Initialize an array with nullptr.
HC_CC_Circle_Param rs_circle_param_
Parameter of a rs-circle.
double cc_turn_length(const Configuration &q) const
Length of a cc-turn.
bool configuration_on_hc_cc_circle(const HC_CC_Circle &c, const Configuration &q)
Configuration on the circle?
void TT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q) const
CCpmpm_Dubins_State_Space * parent_
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.
An implementation of continuous curvature (CC) steer for a Dubins car with either positive (p) or neg...
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 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
bool TeST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double configuration_distance(const Configuration &q1, const Configuration &q2)
Cartesian distance between two configurations.
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, Configuration **q4) const
void cc_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a cc-turn.
TFSIMD_FORCE_INLINE tfScalar angle(const Quaternion &q1, const Quaternion &q2)
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, Configuration **q3) const
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.
bool TT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) 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.
double x
Position in x of the robot.
void TTTT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2, Configuration **q3, Configuration **q4, Configuration **q5, Configuration **q6) const
bool configuration_equal(const Configuration &q1, const Configuration &q2)
Are two configurations equal?
double kappa
Max. curvature, inverse of max. curvature, max. sharpness.
bool TST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double length
Path length.
Configuration * qi1
Intermediate configurations.
INLINE Rall1d< T, V, S > asin(const Rall1d< T, V, S > &x)
double get_distance(const State &state1, const State &state2) const
Returns shortest path length from state1 to state2.
void TeST_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2) const
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 forward
Driving direction: forwards/backwards.
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
cc_dubins::path_type type
Path type.
void TTT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2, Configuration **q3, Configuration **q4) const
Description of a kinematic car's state.
double mu
Angle between the initial orientation and the tangent to the circle at the initial position...
~CCpmpm_Dubins_State_Space()
Destructor.
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
void rs_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a rs-turn.
CCpmpm_Dubins(CCpmpm_Dubins_State_Space *parent)
INLINE Rall1d< T, V, S > atan2(const Rall1d< T, V, S > &y, const Rall1d< T, V, S > &x)
bool forwards_
Driving direction.
void empty_controls(std::vector< Control > &controls)
Appends controls with 0 input.
double kappa
Curvature at position (x,y)
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
Configuration start
Start configuration.
bool TiST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
std::unique_ptr< CCpmpm_Dubins > ccpmpm_dubins_
Pimpl Idiom: unique pointer on class with families.
double radius_
Outer radius of a hc-/cc-circle.
bool TTTT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double xc
Center of the circle.
double mu_
Angle between a configuration on the hc-/cc-circle and the tangent to the circle at that position...
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, Configuration **q4) const
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, Configuration **q4) const
std::vector< Control > get_controls(const State &state1, const State &state2) const
Returns controls of the shortest path from state1 to state2.
void set_param(double _kappa, double _sigma, double _radius, double _mu, double _sin_mu, double _cos_mu, double _delta_min)
Set parameters.
CC_Dubins_Path * ccpmpm_dubins(const State &state1, const State &state2) const
Returns a sequence of turns and straight lines connecting a start and an end configuration.
double y
Position in y of the robot.
double theta
Orientation of the robot.
CC_Dubins_Path * ccpmpm_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.
double sin_mu_
Sine and cosine of mu.
double TTTT_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 **ci1, HC_CC_Circle **ci2) const