33 #define CC_REGULAR false 70 double x = (c1.
xc + c2.
xc) / 2;
71 double y = (c1.
yc + c2.
yc) / 2;
102 TT_tangent_circles(c1, c2, q);
105 return (*cstart)->cc_turn_length(**q) + (*cend)->cc_turn_length(**q);
125 double delta_x = 0.5 * distance;
126 double delta_y = 0.0;
161 TcT_tangent_circles(c1, c2, q);
164 return (*cstart)->hc_turn_length(**q) + (*cend)->hc_turn_length(**q);
180 return distance <= 4 * fabs(c1.
kappa_inv);
186 double theta = angle;
188 double delta_x = 0.5 * distance;
189 double delta_y =
sqrt(
pow(r, 2) -
pow(delta_x, 2));
197 TcT_tangent_circles(c1, tgt1, q1);
198 TcT_tangent_circles(tgt1, c2, q2);
199 TcT_tangent_circles(c1, tgt2, q3);
200 TcT_tangent_circles(tgt2, c2, q4);
207 TcTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
216 double length1 = (*cstart)->hc_turn_length(*qa) + middle1->
rs_turn_length(*qb) + (*cend)->hc_turn_length(*qb);
217 double length2 = (*cstart)->hc_turn_length(*qc) + middle2->
rs_turn_length(*qd) + (*cend)->hc_turn_length(*qd);
218 if (length1 < length2)
238 return numeric_limits<double>::max();
258 double theta = angle;
260 double r2 = 2 * c1.
radius;
261 double delta_x = (
pow(r1, 2) +
pow(distance, 2) -
pow(r2, 2)) / (2 * distance);
262 double delta_y =
sqrt(
pow(r1, 2) -
pow(delta_x, 2));
270 TcT_tangent_circles(c1, tgt1, q1);
271 TT_tangent_circles(tgt1, c2, q2);
272 TcT_tangent_circles(c1, tgt2, q3);
273 TT_tangent_circles(tgt2, c2, q4);
280 TcTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
289 double length1 = (*cstart)->hc_turn_length(*qa) + middle1->
hc_turn_length(*qa) + (*cend)->cc_turn_length(*qb);
290 double length2 = (*cstart)->hc_turn_length(*qc) + middle2->
hc_turn_length(*qc) + (*cend)->cc_turn_length(*qd);
291 if (length1 < length2)
311 return numeric_limits<double>::max();
331 double theta = angle;
332 double r1 = 2 * c1.
radius;
334 double delta_x = (
pow(r1, 2) +
pow(distance, 2) -
pow(r2, 2)) / (2 * distance);
335 double delta_y =
sqrt(
pow(r1, 2) -
pow(delta_x, 2));
343 TT_tangent_circles(c1, tgt1, q1);
344 TcT_tangent_circles(tgt1, c2, q2);
345 TT_tangent_circles(c1, tgt2, q3);
346 TcT_tangent_circles(tgt2, c2, q4);
353 TTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
362 double length1 = (*cstart)->cc_turn_length(*qa) + middle1->
hc_turn_length(*qb) + (*cend)->hc_turn_length(*qb);
363 double length2 = (*cstart)->cc_turn_length(*qc) + middle2->
hc_turn_length(*qd) + (*cend)->hc_turn_length(*qd);
364 if (length1 < length2)
384 return numeric_limits<double>::max();
398 return (distance >= 2 * c1.
radius);
417 return TiST_exists(c1, c2) || TeST_exists(c1, c2);
431 theta = angle +
alpha;
439 theta = angle -
alpha;
447 theta = angle -
alpha;
455 theta = angle +
alpha;
503 TiST_tangent_circles(c1, c2, q1, q2);
506 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->cc_turn_length(**q2);
512 TeST_tangent_circles(c1, c2, q1, q2);
515 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->cc_turn_length(**q2);
521 if (TiST_exists(c1, c2))
523 return TiST_path(c1, c2, cstart, cend, q1, q2);
525 if (TeST_exists(c1, c2))
527 return TeST_path(c1, c2, cstart, cend, q1, q2);
529 return numeric_limits<double>::max();
562 return TiSTcT_exists(c1, c2) || TeSTcT_exists(c1, c2);
568 double theta = angle;
576 TiST_tangent_circles(c1, tgt1, q1, q2);
577 TcT_tangent_circles(tgt1, c2, q3);
583 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*ci)->hc_turn_length(**q3) +
584 (*cend)->hc_turn_length(**q3);
590 double theta = angle;
598 TeST_tangent_circles(c1, tgt1, q1, q2);
599 TcT_tangent_circles(tgt1, c2, q3);
605 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*ci)->hc_turn_length(**q3) +
606 (*cend)->hc_turn_length(**q3);
612 if (TiSTcT_exists(c1, c2))
614 return TiSTcT_path(c1, c2, cstart, cend, q1, q2, q3, ci);
616 if (TeSTcT_exists(c1, c2))
618 return TeSTcT_path(c1, c2, cstart, cend, q1, q2, q3, ci);
620 return numeric_limits<double>::max();
653 return TcTiST_exists(c1, c2) || TcTeST_exists(c1, c2);
659 double theta = angle;
667 TcT_tangent_circles(c1, tgt1, q1);
668 TiST_tangent_circles(tgt1, c2, q2, q3);
674 return (*cstart)->hc_turn_length(**q1) + (*ci)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) +
675 (*cend)->cc_turn_length(**q3);
681 double theta = angle;
689 TcT_tangent_circles(c1, tgt1, q1);
690 TeST_tangent_circles(tgt1, c2, q2, q3);
696 return (*cstart)->hc_turn_length(**q1) + (*ci)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) +
697 (*cend)->cc_turn_length(**q3);
703 if (TcTiST_exists(c1, c2))
705 return TcTiST_path(c1, c2, cstart, cend, q1, q2, q3, ci);
707 if (TcTeST_exists(c1, c2))
709 return TcTeST_path(c1, c2, cstart, cend, q1, q2, q3, ci);
711 return numeric_limits<double>::max();
744 return TcTiSTcT_exists(c1, c2) || TcTeSTcT_exists(c1, c2);
751 double theta = angle;
761 TcT_tangent_circles(c1, tgt1, q1);
762 TiST_tangent_circles(tgt1, tgt2, q2, q3);
763 TcT_tangent_circles(tgt2, c2, q4);
770 return (*cstart)->hc_turn_length(**q1) + (*ci1)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) +
771 (*ci2)->hc_turn_length(**q4) + (*cend)->hc_turn_length(**q4);
778 double theta = angle;
788 TcT_tangent_circles(c1, tgt1, q1);
789 TeST_tangent_circles(tgt1, tgt2, q2, q3);
790 TcT_tangent_circles(tgt2, c2, q4);
797 return (*cstart)->hc_turn_length(**q1) + (*ci1)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) +
798 (*ci2)->hc_turn_length(**q4) + (*cend)->hc_turn_length(**q4);
805 if (TcTiSTcT_exists(c1, c2))
807 return TcTiSTcT_path(c1, c2, cstart, cend, q1, q2, q3, q4, ci1, ci2);
809 if (TcTeSTcT_exists(c1, c2))
811 return TcTeSTcT_path(c1, c2, cstart, cend, q1, q2, q3, q4, ci1, ci2);
813 return numeric_limits<double>::max();
833 double theta = angle;
834 double r1, r2, delta_x, delta_y, x, y;
839 delta_x = (distance + r1) / 2;
844 delta_x = (distance - r1) / 2;
857 TT_tangent_circles(c1, tgt1, q1);
858 TcT_tangent_circles(tgt1, tgt2, q2);
859 TT_tangent_circles(tgt2, c2, q3);
861 TT_tangent_circles(c1, tgt3, q4);
862 TcT_tangent_circles(tgt3, tgt4, q5);
863 TT_tangent_circles(tgt4, c2, q6);
871 TTcTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd, &qe, &qf);
883 (*cend)->cc_turn_length(*qc);
885 (*cend)->cc_turn_length(*qf);
886 if (length1 < length2)
914 return numeric_limits<double>::max();
934 double theta = angle;
937 double delta_x = (
pow(r1, 2) +
pow(distance / 2, 2) -
pow(r2, 2)) / distance;
938 double delta_y =
sqrt(
pow(r1, 2) -
pow(delta_x, 2));
951 TcT_tangent_circles(c1, tgt1, q1);
952 TT_tangent_circles(tgt1, tgt2, q2);
953 TcT_tangent_circles(tgt2, c2, q3);
955 TcT_tangent_circles(c1, tgt3, q4);
956 TT_tangent_circles(tgt3, tgt4, q5);
957 TcT_tangent_circles(tgt4, c2, q6);
965 TcTTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd, &qe, &qf);
977 (*cend)->hc_turn_length(*qc);
979 (*cend)->hc_turn_length(*qf);
980 if (length1 < length2)
1008 return numeric_limits<double>::max();
1024 return distance <= 4 * c1.
radius;
1030 double theta = angle;
1031 double r = 2 * c1.
radius;
1032 double delta_x = 0.5 * distance;
1033 double delta_y =
sqrt(
pow(r, 2) -
pow(delta_x, 2));
1041 TT_tangent_circles(c1, tgt1, q1);
1042 TT_tangent_circles(tgt1, c2, q2);
1043 TT_tangent_circles(c1, tgt2, q3);
1044 TT_tangent_circles(tgt2, c2, q4);
1051 TTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
1060 double length1 = (*cstart)->cc_turn_length(*qa) + middle1->
cc_turn_length(*qb) + (*cend)->cc_turn_length(*qb);
1061 double length2 = (*cstart)->cc_turn_length(*qc) + middle2->
cc_turn_length(*qd) + (*cend)->cc_turn_length(*qd);
1062 if (length1 < length2)
1082 return numeric_limits<double>::max();
1114 return TciST_exists(c1, c2) || TceST_exists(c1, c2);
1121 double delta_x1 = 0.0;
1128 theta = angle -
alpha;
1136 theta = angle +
alpha;
1144 theta = angle +
alpha;
1152 theta = angle -
alpha;
1160 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->cc_turn_length(**q2);
1167 double delta_x1 = 0.0;
1174 theta = angle +
alpha;
1182 theta = angle -
alpha;
1190 theta = angle -
alpha;
1198 theta = angle +
alpha;
1206 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->cc_turn_length(**q2);
1212 if (TciST_exists(c1, c2))
1214 return TciST_path(c1, c2, cstart, cend, q1, q2);
1216 if (TceST_exists(c1, c2))
1218 return TceST_path(c1, c2, cstart, cend, q1, q2);
1220 return numeric_limits<double>::max();
1252 return TiScT_exists(c1, c2) || TeScT_exists(c1, c2);
1261 double delta_x2 = 0.0;
1266 theta = angle +
alpha;
1274 theta = angle -
alpha;
1282 theta = angle -
alpha;
1290 theta = angle +
alpha;
1298 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q2);
1307 double delta_x2 = 0.0;
1312 theta = angle +
alpha;
1320 theta = angle -
alpha;
1328 theta = angle -
alpha;
1336 theta = angle +
alpha;
1344 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q2);
1350 if (TiScT_exists(c1, c2))
1352 return TiScT_path(c1, c2, cstart, cend, q1, q2);
1354 if (TeScT_exists(c1, c2))
1356 return TeScT_path(c1, c2, cstart, cend, q1, q2);
1358 return numeric_limits<double>::max();
1372 return distance > 2 * fabs(c1.
kappa_inv);
1390 return TciScT_exists(c1, c2) || TceScT_exists(c1, c2);
1397 double delta_x = 0.0;
1402 theta = angle -
alpha;
1410 theta = angle +
alpha;
1418 theta = angle +
alpha;
1426 theta = angle -
alpha;
1434 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q2);
1440 double theta = angle;
1441 double delta_x = 0.0;
1474 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q2);
1480 if (TciScT_exists(c1, c2))
1482 return TciScT_path(c1, c2, cstart, cend, q1, q2);
1484 if (TceScT_exists(c1, c2))
1486 return TceScT_path(c1, c2, cstart, cend, q1, q2);
1488 return numeric_limits<double>::max();
1494 HC00_Reeds_Shepp_State_Space::HC00_Reeds_Shepp_State_Space(
double kappa,
double sigma,
double discretization)
1496 , hc00_reeds_shepp_{ unique_ptr<HC00_Reeds_Shepp>(
new HC00_Reeds_Shepp(
this)) }
1572 &qi2[hc_cc_rs::TcTcT], &ci1[hc_cc_rs::TcTcT]);
1579 &qi2[hc_cc_rs::TcTT], &ci1[hc_cc_rs::TcTT]);
1586 &qi2[hc_cc_rs::TTcT], &ci1[hc_cc_rs::TTcT]);
1592 &qi1[hc_cc_rs::TST], &qi2[hc_cc_rs::TST]);
1600 &qi2[hc_cc_rs::TSTcT], &qi3[hc_cc_rs::TSTcT], &ci1[hc_cc_rs::TSTcT]);
1607 &qi2[hc_cc_rs::TcTST], &qi3[hc_cc_rs::TcTST], &ci1[hc_cc_rs::TcTST]);
1613 c1, c2, &cstart[
hc_cc_rs::TcTSTcT], &cend[hc_cc_rs::TcTSTcT], &qi1[hc_cc_rs::TcTSTcT], &qi2[hc_cc_rs::TcTSTcT],
1614 &qi3[hc_cc_rs::TcTSTcT], &qi4[hc_cc_rs::TcTSTcT], &ci1[hc_cc_rs::TcTSTcT], &ci2[hc_cc_rs::TcTSTcT]);
1620 c1, c2, &cstart[
hc_cc_rs::TTcTT], &cend[hc_cc_rs::TTcTT], &qi1[hc_cc_rs::TTcTT], &qi2[hc_cc_rs::TTcTT],
1621 &qi3[hc_cc_rs::TTcTT], &ci1[hc_cc_rs::TTcTT], &ci2[hc_cc_rs::TTcTT]);
1627 c1, c2, &cstart[
hc_cc_rs::TcTTcT], &cend[hc_cc_rs::TcTTcT], &qi1[hc_cc_rs::TcTTcT], &qi2[hc_cc_rs::TcTTcT],
1628 &qi3[hc_cc_rs::TcTTcT], &ci1[hc_cc_rs::TcTTcT], &ci2[hc_cc_rs::TcTTcT]);
1635 &qi1[hc_cc_rs::TTT], &qi2[hc_cc_rs::TTT], &ci1[hc_cc_rs::TTT]);
1641 &qi1[hc_cc_rs::TcST], &qi2[hc_cc_rs::TcST]);
1647 &qi1[hc_cc_rs::TScT], &qi2[hc_cc_rs::TScT]);
1653 &qi1[hc_cc_rs::TcScT], &qi2[hc_cc_rs::TcScT]);
1660 qi3[best_path], qi4[best_path], cstart[best_path], cend[best_path], ci1[best_path],
1661 ci2[best_path], length[best_path]);
1699 HC_CC_RS_Path *
path[] = {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1700 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr };
1702 double lg[] = { numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1703 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1704 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1705 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1706 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1707 numeric_limits<double>::max() };
1709 for (
int i = 0; i < 4; i++)
1711 for (
int j = 0; j < 4; j++)
1714 if (path[4 * i + j])
1716 lg[4 * i + j] = path[4 * i + j]->
length;
1739 for (
int i = 0; i < 4; i++)
1741 delete start_circle[i];
1742 delete end_circle[i];
1744 for (
int i = 0; i < 16; i++)
1751 return path[best_path];
1764 vector<Control> hc_rs_controls;
1765 hc_rs_controls.reserve(10);
1863 return hc_rs_controls;
void TT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q) const
bool TScT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
HC_CC_RS_Path * hc00_reeds_shepp(const State &state1, const State &state2) const
Returns a sequence of turns and straight lines connecting a start and an end configuration.
const int nb_hc_cc_rs_paths
double get_epsilon()
Return value of epsilon.
bool TTT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double TeScT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2) const
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.
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) const
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, HC_CC_Circle **ci) const
double sin_mu
Sine and cosine of mu.
void TTcT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2, Configuration **q3, Configuration **q4) const
double TceST_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2) const
bool TeSTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double TcTeST_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 TST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double TcTTcT_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
double kappa_
Curvature, sharpness of clothoid.
double TceScT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2) const
void pointer_array_init(void *array[], int size)
Initialize an array with nullptr.
An implementation of hybrid curvature (HC) steer with zero curvature at the start and goal configurat...
bool TciScT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
HC_CC_RS_Path * hc00_circles_rs_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 cc_turn_length(const Configuration &q) const
Length of a cc-turn.
double TcTeSTcT_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, HC_CC_Circle **ci1, HC_CC_Circle **ci2) const
HC00_Reeds_Shepp_State_Space * parent_
bool configuration_on_hc_cc_circle(const HC_CC_Circle &c, const Configuration &q)
Configuration on the circle?
bool TSTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
bool TcST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
int array_index_min(double array[], int size)
Find index with minimal value in double array.
double TcTiST_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 radius
Radius of the outer circle.
bool TcTST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
void TcTTcT_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
double get_distance(const State &state1, const State &state2) const
Returns shortest path length from state1 to state2.
void hc_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a hc-turn.
double hc_turn_length(const Configuration &q) const
Length of 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
bool regular
Type of the circle: regular/irregular.
HC_CC_Circle_Param hc_cc_circle_param_
Parameters of a hc-/cc-circle.
bool TeScT_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 TciScT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2) const
bool TiScT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
~HC00_Reeds_Shepp_State_Space()
Destructor.
void TcT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q) 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.
Configuration start
Start and end configuration.
bool TcTeST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double TcTcT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2, HC_CC_Circle **ci) const
void TcTT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2, Configuration **q3, Configuration **q4) const
double TeSTcT_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 TcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
TFSIMD_FORCE_INLINE tfScalar angle(const Quaternion &q1, const Quaternion &q2)
bool TcTSTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
std::vector< Control > get_controls(const State &state1, const State &state2) const
Returns controls of the shortest path from state1 to state2.
bool TcTiST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
bool TcTiSTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
HC_CC_Circle * cstart
Start, end and intermediate circles.
void TcTcT_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2, Configuration **q3, Configuration **q4) const
bool TiSTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
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) const
void TTcTT_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
void straight_controls(const Configuration &q1, const Configuration &q2, std::vector< Control > &controls)
Appends controls with a straight line.
std::unique_ptr< HC00_Reeds_Shepp > hc00_reeds_shepp_
Pimpl Idiom: unique pointer on class with families.
double distance(double x0, double y0, double x1, double y1)
void double_array_init(double array[], int size, double value)
Initialize an array with a given value.
double TcTST_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 TTcTT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
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
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.
double TcTT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2, HC_CC_Circle **ci) const
bool TciST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
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.
double TcTSTcT_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, HC_CC_Circle **ci1, HC_CC_Circle **ci2) 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) const
bool TcTTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
bool forward
Driving direction: forwards/backwards.
void TiST_tangent_circles(const HC_CC_Circle &c1, const HC_CC_Circle &c2, Configuration **q1, Configuration **q2) const
double TT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q) const
INLINE Rall1d< T, V, S > sqrt(const Rall1d< T, V, S > &arg)
bool TiST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double TiSTcT_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
hc_cc_rs::path_type type
Path type.
bool TcTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) 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...
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
bool TcTT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
bool TceScT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
bool TTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
bool configuration_aligned(const Configuration &q1, const Configuration &q2)
Are two configurations aligned?
double TScT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2) const
void rs_turn_controls(const HC_CC_Circle &c, const Configuration &q, bool order, std::vector< Control > &controls)
Appends controls with a rs-turn.
double TcScT_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 TiScT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2) const
INLINE Rall1d< T, V, S > atan2(const Rall1d< T, V, S > &y, const Rall1d< T, V, S > &x)
double TTcTT_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
void empty_controls(std::vector< Control > &controls)
Appends controls with 0 input.
bool TcScT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double TcST_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2) const
bool TT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
TFSIMD_FORCE_INLINE tfScalar length(const Quaternion &q)
Configuration start
Start configuration.
bool TeST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
double TciST_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 xc
Center of the circle.
double TcT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q) const
double TcTiSTcT_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, HC_CC_Circle **ci1, HC_CC_Circle **ci2) const
void set_param(double _kappa, double _sigma, double _radius, double _mu, double _sin_mu, double _cos_mu, double _delta_min)
Set parameters.
double TTcT_path(const HC_CC_Circle &c1, const HC_CC_Circle &c2, HC_CC_Circle **cstart, HC_CC_Circle **cend, Configuration **q1, Configuration **q2, HC_CC_Circle **ci) const
double y
Position in y of the robot.
double theta
Orientation of the robot.
HC_CC_Circle_Param rs_circle_param_
Parameter of a rs-circle.
Configuration * qi1
Intermediate configurations.
double rs_turn_length(const Configuration &q) const
Length of a rs-turn.
double TSTcT_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
HC00_Reeds_Shepp(HC00_Reeds_Shepp_State_Space *parent)
bool TceST_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const
bool TcTeSTcT_exists(const HC_CC_Circle &c1, const HC_CC_Circle &c2) const