40 const KDL::Frame& goal_pose,
41 const KDL::Vector& center_point,
double eqradius)
43 double a = (start_pose.p - center_point).Norm();
44 double b = (goal_pose.p - center_point).Norm();
45 double c = (start_pose.p - goal_pose.p).Norm();
47 if (fabs(
a - b) > MAX_RADIUS_DIFF)
53 double alpha = cosines(
a, b,
c);
55 KDL::RotationalInterpolation* rot_interpo =
new KDL::RotationalInterpolation_SingleAxis();
56 double old_kdl_epsilon = KDL::epsilon;
59 KDL::epsilon = MAX_COLINEAR_NORM;
60 auto circle = std::unique_ptr<KDL::Path>(
61 new KDL::Path_Circle(start_pose, center_point, goal_pose.p, goal_pose.M, alpha, rot_interpo, eqradius,
63 KDL::epsilon = old_kdl_epsilon;
66 catch (KDL::Error_MotionPlanning&)
68 KDL::epsilon = old_kdl_epsilon;
74 const KDL::Frame& goal_pose,
75 const KDL::Vector& interim_point,
double eqradius)
79 const KDL::Vector t = interim_point - start_pose.p;
80 const KDL::Vector u = goal_pose.p - start_pose.p;
81 const KDL::Vector v = goal_pose.p - interim_point;
83 const KDL::Vector
w = t * u;
86 if (
w.Norm() < MAX_COLINEAR_NORM)
88 throw KDL::Error_MotionPlanning_Circle_No_Plane();
90 const KDL::Vector center_point =
91 start_pose.p + (u * dot(t, t) * dot(u, v) - t * dot(u, u) * dot(t, v)) * 0.5 / pow(
w.Norm(), 2);
95 const KDL::Vector t_center = center_point - start_pose.p;
96 const KDL::Vector v_center = goal_pose.p - center_point;
97 double a = t_center.Norm();
98 double b = v_center.Norm();
100 double alpha = cosines(
a, b,
c);
102 KDL::Vector kdl_aux_point(interim_point);
108 double interim_angle = cosines(t.Norm(), v.Norm(), u.Norm());
109 if (interim_angle < M_PI / 2)
111 alpha = 2 * M_PI - alpha;
115 if ((t_center * v_center).Norm() > MAX_COLINEAR_NORM)
117 kdl_aux_point = 2 * center_point - goal_pose.p;
121 KDL::RotationalInterpolation* rot_interpo =
new KDL::RotationalInterpolation_SingleAxis();
122 return std::unique_ptr<KDL::Path>(
123 std::make_unique<KDL::Path_Circle>(start_pose, center_point, kdl_aux_point, goal_pose.M, alpha, rot_interpo,
127 double PathCircleGenerator::cosines(
const double a,
const double b,
const double c)
129 return acos(std::max(std::min((pow(
a, 2) + pow(b, 2) - pow(
c, 2)) / (2.0 *
a * b), 1.0), -1.0));
static std::unique_ptr< KDL::Path > circleFromCenter(const KDL::Frame &start_pose, const KDL::Frame &goal_pose, const KDL::Vector ¢er_point, double eqradius)
set the path circle from start, goal and center point
static std::unique_ptr< KDL::Path > circleFromInterim(const KDL::Frame &start_pose, const KDL::Frame &goal_pose, const KDL::Vector &interim_point, double eqradius)
set circle from start, goal and interim point