33 #define HC_REGULAR false
34 #define CC_REGULAR false
71 double x = (c1.
xc + c2.
xc) / 2;
72 double y = (c1.
yc + c2.
yc) / 2;
103 TT_tangent_circles(c1, c2, q2);
107 return (*cstart)->hc_turn_length(**q1) + (*cend)->cc_turn_length(**q2);
128 double delta_y = 0.0;
163 TcT_tangent_circles(c1, c2, q);
166 return (*cstart)->rs_turn_length(**q) + (*cend)->hc_turn_length(**q);
188 double theta =
angle;
191 double delta_y = sqrt(pow(r, 2) - pow(delta_x, 2));
199 TcT_tangent_circles(c1, tgt1, q1);
200 TcT_tangent_circles(tgt1, c2, q2);
201 TcT_tangent_circles(c1, tgt2, q3);
202 TcT_tangent_circles(tgt2, c2, q4);
209 TcTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
218 double length1 = (*cstart)->rs_turn_length(*qa) + middle1->
rs_turn_length(*qb) + (*cend)->hc_turn_length(*qb);
219 double length2 = (*cstart)->rs_turn_length(*qc) + middle2->
rs_turn_length(*qd) + (*cend)->hc_turn_length(*qd);
220 if (length1 < length2)
240 return numeric_limits<double>::max();
260 double theta =
angle;
262 double r2 = 2 * c2.
radius;
263 double delta_x = (pow(r1, 2) + pow(
distance, 2) - pow(r2, 2)) / (2 *
distance);
264 double delta_y = sqrt(pow(r1, 2) - pow(delta_x, 2));
272 TcT_tangent_circles(c1, tgt1, q1);
273 TT_tangent_circles(tgt1, c2, q2);
274 TcT_tangent_circles(c1, tgt2, q3);
275 TT_tangent_circles(tgt2, c2, q4);
282 TcTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
291 double length1 = (*cstart)->rs_turn_length(*qa) + middle1->
hc_turn_length(*qa) + (*cend)->cc_turn_length(*qb);
292 double length2 = (*cstart)->rs_turn_length(*qc) + middle2->
hc_turn_length(*qc) + (*cend)->cc_turn_length(*qd);
293 if (length1 < length2)
313 return numeric_limits<double>::max();
333 double theta =
angle;
334 double r1 = 2 * c2.
radius;
336 double delta_x = (pow(r1, 2) + pow(
distance, 2) - pow(r2, 2)) / (2 *
distance);
337 double delta_y = sqrt(pow(r1, 2) - pow(delta_x, 2));
345 TT_tangent_circles(c1, tgt1, q1);
346 TcT_tangent_circles(tgt1, c2, q2);
347 TT_tangent_circles(c1, tgt2, q3);
348 TcT_tangent_circles(tgt2, c2, q4);
355 TTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
368 if (length1 < length2)
392 return numeric_limits<double>::max();
424 return TiST_exists(c1, c2) || TeST_exists(c1, c2);
475 double theta = atan2(c2.
yc - c1.
yc, c2.
xc - c1.
xc);
510 TiST_tangent_circles(c1, c2, q2, q3);
514 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) + (*cend)->cc_turn_length(**q3);
520 TeST_tangent_circles(c1, c2, q2, q3);
524 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) + (*cend)->cc_turn_length(**q3);
530 if (TiST_exists(c1, c2))
532 return TiST_path(c1, c2, cstart, cend, q1, q2, q3);
534 if (TeST_exists(c1, c2))
536 return TeST_path(c1, c2, cstart, cend, q1, q2, q3);
538 return numeric_limits<double>::max();
571 return TiSTcT_exists(c1, c2) || TeSTcT_exists(c1, c2);
578 double theta =
angle;
580 double delta_x = sqrt(pow(2 * c2.
kappa_inv, 2) - pow(delta_y, 2));
586 TiST_tangent_circles(c1, tgt1, q2, q3);
587 TcT_tangent_circles(tgt1, c2, q4);
594 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) + (*ci)->hc_turn_length(**q4) +
595 (*cend)->hc_turn_length(**q4);
602 double theta =
angle;
610 TeST_tangent_circles(c1, tgt1, q2, q3);
611 TcT_tangent_circles(tgt1, c2, q4);
618 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) + (*ci)->hc_turn_length(**q4) +
619 (*cend)->hc_turn_length(**q4);
626 if (TiSTcT_exists(c1, c2))
628 return TiSTcT_path(c1, c2, cstart, cend, q1, q2, q3, q4, ci);
630 if (TeSTcT_exists(c1, c2))
632 return TeSTcT_path(c1, c2, cstart, cend, q1, q2, q3, q4, ci);
634 return numeric_limits<double>::max();
667 return TcTiST_exists(c1, c2) || TcTeST_exists(c1, c2);
673 double theta =
angle;
675 double delta_x = sqrt(pow(2 * c2.
kappa_inv, 2) - pow(delta_y, 2));
681 TcT_tangent_circles(c1, tgt1, q1);
682 TiST_tangent_circles(tgt1, c2, q2, q3);
688 return (*cstart)->rs_turn_length(**q1) + (*ci)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) +
689 (*cend)->cc_turn_length(**q3);
695 double theta =
angle;
703 TcT_tangent_circles(c1, tgt1, q1);
704 TeST_tangent_circles(tgt1, c2, q2, q3);
710 return (*cstart)->rs_turn_length(**q1) + (*ci)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) +
711 (*cend)->cc_turn_length(**q3);
717 if (TcTiST_exists(c1, c2))
719 return TcTiST_path(c1, c2, cstart, cend, q1, q2, q3, ci);
721 if (TcTeST_exists(c1, c2))
723 return TcTeST_path(c1, c2, cstart, cend, q1, q2, q3, ci);
725 return numeric_limits<double>::max();
758 return TcTiSTcT_exists(c1, c2) || TcTeSTcT_exists(c1, c2);
765 double theta =
angle;
767 double delta_x = sqrt(pow(2 * c2.
kappa_inv, 2) - pow(delta_y, 2));
775 TcT_tangent_circles(c1, tgt1, q1);
776 TiST_tangent_circles(tgt1, tgt2, q2, q3);
777 TcT_tangent_circles(tgt2, c2, q4);
784 return (*cstart)->rs_turn_length(**q1) + (*ci1)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) +
785 (*ci2)->hc_turn_length(**q4) + (*cend)->hc_turn_length(**q4);
792 double theta =
angle;
802 TcT_tangent_circles(c1, tgt1, q1);
803 TeST_tangent_circles(tgt1, tgt2, q2, q3);
804 TcT_tangent_circles(tgt2, c2, q4);
811 return (*cstart)->rs_turn_length(**q1) + (*ci1)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) +
812 (*ci2)->hc_turn_length(**q4) + (*cend)->hc_turn_length(**q4);
819 if (TcTiSTcT_exists(c1, c2))
821 return TcTiSTcT_path(c1, c2, cstart, cend, q1, q2, q3, q4, ci1, ci2);
823 if (TcTeSTcT_exists(c1, c2))
825 return TcTeSTcT_path(c1, c2, cstart, cend, q1, q2, q3, q4, ci1, ci2);
827 return numeric_limits<double>::max();
847 double theta =
angle;
848 double r1, r2, delta_x, delta_y, x, y;
854 delta_y = sqrt(pow(r2, 2) - pow(delta_x, 2));
859 delta_y = sqrt(pow(r2, 2) - pow(delta_x, 2));
872 TT_tangent_circles(c1, tgt1, q1);
873 TcT_tangent_circles(tgt1, tgt2, q2);
874 TT_tangent_circles(tgt2, c2, q3);
876 TT_tangent_circles(c1, tgt3, q4);
877 TcT_tangent_circles(tgt3, tgt4, q5);
878 TT_tangent_circles(tgt4, c2, q6);
886 TTcTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd, &qe, &qf);
887 HC_CC_Circle *start1, *start2, *middle1, *middle2, *middle3, *middle4;
900 (*cend)->cc_turn_length(*qc);
902 (*cend)->cc_turn_length(*qf);
903 if (length1 < length2)
936 return numeric_limits<double>::max();
956 double theta =
angle;
959 double delta_x = (pow(r1, 2) + pow(
distance / 2, 2) - pow(r2, 2)) /
distance;
960 double delta_y = sqrt(pow(r1, 2) - pow(delta_x, 2));
973 TcT_tangent_circles(c1, tgt1, q1);
974 TT_tangent_circles(tgt1, tgt2, q2);
975 TcT_tangent_circles(tgt2, c2, q3);
977 TcT_tangent_circles(c1, tgt3, q4);
978 TT_tangent_circles(tgt3, tgt4, q5);
979 TcT_tangent_circles(tgt4, c2, q6);
986 TcTTcT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd, &qe, &qf);
998 (*cend)->hc_turn_length(*qc);
1000 (*cend)->hc_turn_length(*qf);
1001 if (length1 < length2)
1029 return numeric_limits<double>::max();
1051 double theta =
angle;
1052 double r = 2 * c2.
radius;
1054 double delta_y = sqrt(pow(r, 2) - pow(delta_x, 2));
1062 TT_tangent_circles(c1, tgt1, q1);
1063 TT_tangent_circles(tgt1, c2, q2);
1064 TT_tangent_circles(c1, tgt2, q3);
1065 TT_tangent_circles(tgt2, c2, q4);
1072 TTT_tangent_circles(c1, c2, &qa, &qb, &qc, &qd);
1085 if (length1 < length2)
1109 return numeric_limits<double>::max();
1141 return TciST_exists(c1, c2) || TceST_exists(c1, c2);
1148 double delta_x1 = 0.0;
1187 return (*cstart)->rs_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->cc_turn_length(**q2);
1194 double delta_x1 = 0.0;
1233 return (*cstart)->rs_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->cc_turn_length(**q2);
1239 if (TciST_exists(c1, c2))
1241 return TciST_path(c1, c2, cstart, cend, q1, q2);
1243 if (TceST_exists(c1, c2))
1245 return TceST_path(c1, c2, cstart, cend, q1, q2);
1247 return numeric_limits<double>::max();
1279 return TiScT_exists(c1, c2) || TeScT_exists(c1, c2);
1288 double delta_x2 = 0.0;
1326 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) + (*cend)->hc_turn_length(**q3);
1335 double delta_x2 = 0.0;
1373 return (*cstart)->hc_turn_length(**q1) +
configuration_distance(**q2, **q3) + (*cend)->hc_turn_length(**q3);
1379 if (TiScT_exists(c1, c2))
1381 return TiScT_path(c1, c2, cstart, cend, q1, q2, q3);
1383 if (TeScT_exists(c1, c2))
1385 return TeScT_path(c1, c2, cstart, cend, q1, q2, q3);
1387 return numeric_limits<double>::max();
1419 return TciScT_exists(c1, c2) || TceScT_exists(c1, c2);
1426 double delta_x = 0.0;
1463 return (*cstart)->rs_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q2);
1469 double delta_x = 0.0;
1471 double theta =
angle;
1503 return (*cstart)->rs_turn_length(**q1) +
configuration_distance(**q1, **q2) + (*cend)->hc_turn_length(**q2);
1509 if (TciScT_exists(c1, c2))
1511 return TciScT_path(c1, c2, cstart, cend, q1, q2);
1513 if (TceScT_exists(c1, c2))
1515 return TceScT_path(c1, c2, cstart, cend, q1, q2);
1517 return numeric_limits<double>::max();
1523 HCpm0_Reeds_Shepp_State_Space::HCpm0_Reeds_Shepp_State_Space(
double kappa,
double sigma,
double discretization)
1525 , hcpm0_reeds_shepp_{ unique_ptr<HCpm0_Reeds_Shepp>(
new HCpm0_Reeds_Shepp(
this)) }
1527 rs_circle_param_.set_param(kappa_, numeric_limits<double>::max(), 1 / kappa_, 0.0, 0.0, 1.0, 0.0);
1528 radius_ = hc_cc_circle_param_.radius;
1529 mu_ = hc_cc_circle_param_.mu;
1680 qi3[best_path], qi4[best_path], cstart[best_path], cend[best_path], ci1[best_path],
1681 ci2[best_path],
length[best_path]);
1720 HC_CC_RS_Path *
path[] = {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
1721 nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr,
nullptr };
1723 double lg[] = { numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1724 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1725 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1726 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1727 numeric_limits<double>::max(), numeric_limits<double>::max(), numeric_limits<double>::max(),
1728 numeric_limits<double>::max() };
1730 for (
int i = 0; i < 4; i++)
1733 if (i == 0 && state1.
kappa < 0)
1735 else if (i == 1 && state1.
kappa > 0)
1737 else if (i == 2 && state1.
kappa < 0)
1739 else if (i == 3 && state1.
kappa > 0)
1741 for (
int j = 0; j < 4; j++)
1744 if (
path[4 * i + j])
1746 lg[4 * i + j] =
path[4 * i + j]->length;
1768 for (
int i = 0; i < 4; i++)
1770 delete start_circle[i];
1771 delete end_circle[i];
1773 for (
int i = 0; i < 16; i++)
1780 return path[best_path];
1793 vector<Control> hc_rs_controls;
1794 hc_rs_controls.reserve(9);
1888 return hc_rs_controls;