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);
139 return TiST_exists(c1, c2) || TeST_exists(c1, c2);
190 double theta = atan2(c2.
yc - c1.
yc, c2.
xc - c1.
xc);
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();
275 double theta =
angle;
276 double r = 2 * parent_->
radius_;
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();
361 double theta =
angle;
362 double r1, delta_x, delta_y, x, y;
367 delta_y = sqrt(pow(r1, 2) - pow(delta_x, 2));
372 delta_y = sqrt(pow(r1, 2) - pow(delta_x, 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)) }
463 rs_circle_param_.set_param(kappa_, numeric_limits<double>::max(), 1 / kappa_, 0.0, 0.0, 1.0, 0.0);
464 radius_ = hc_cc_circle_param_.radius;
465 mu_ = hc_cc_circle_param_.mu;
466 sin_mu_ = hc_cc_circle_param_.sin_mu;
467 cos_mu_ = hc_cc_circle_param_.cos_mu;
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;