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);
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);
186 double theta =
angle;
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();
417 return TiST_exists(c1, c2) || TeST_exists(c1, c2);
468 double theta = atan2(c2.
yc - c1.
yc, c2.
xc - c1.
xc);
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;
570 double delta_x = sqrt(pow(2 * c2.
kappa_inv, 2) - pow(delta_y, 2));
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;
661 double delta_x = sqrt(pow(2 * c2.
kappa_inv, 2) - pow(delta_y, 2));
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;
753 double delta_x = sqrt(pow(2 * c1.
kappa_inv, 2) - pow(delta_y, 2));
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;
840 delta_y = sqrt(pow(r2, 2) - pow(delta_x, 2));
845 delta_y = sqrt(pow(r2, 2) - pow(delta_x, 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();
1030 double theta =
angle;
1031 double r = 2 * c1.
radius;
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;
1160 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->cc_turn_length(**q2);
1167 double delta_x1 = 0.0;
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;
1298 return (*cstart)->cc_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q2);
1307 double delta_x2 = 0.0;
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();
1390 return TciScT_exists(c1, c2) || TceScT_exists(c1, c2);
1397 double delta_x = 0.0;
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)) }
1498 rs_circle_param_.set_param(kappa_, numeric_limits<double>::max(), 1 / kappa_, 0.0, 0.0, 1.0, 0.0);
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;