30 const double L = u.
norm();
44 const double b = -2 * u.
x * (o.
x - p0.
x) - 2 * u.
y * (o.
y - p0.
y);
50 if (nsols <= 0)
return false;
56 if (r1 < 0 && r2 < 0)
return false;
67 r_min = std::min(r1, r2);
71 if (r_min > L)
return false;
86 const double center2obs_dist = (ptArcCenter - o).
norm();
87 if (std::abs(center2obs_dist - std::abs(arc_radius)) >
R)
return false;
90 const double r = arc_radius;
92 (
R * r * 2.0 - o.
y * r * 2.0 -
R *
R + o.
x * o.
x + o.
y * o.
y) *
93 (
R * r * 2.0 + o.
y * r * 2.0 +
R *
R - o.
x * o.
x - o.
y * o.
y);
94 if (discr < 0)
return false;
96 ((
R *
R) * (-1.0 / 2.0) + (o.
x * o.
x) * (1.0 / 2.0) +
97 (o.
y * o.
y) * (1.0 / 2.0) -
99 (-(
R *
R) * o.
y + (
R *
R) * r + (o.
x * o.
x) * o.
y + (o.
x * o.
x) * r -
100 (o.
y * o.
y) * r + o.
y * o.
y * o.
y + o.
x * sqrt(discr)) *
102 (o.
y * r * -2.0 + o.
x * o.
x + o.
y * o.
y + r * r) +
104 (-(
R *
R) * o.
y + (
R *
R) * r + (o.
x * o.
x) * o.
y + (o.
x * o.
x) * r -
105 (o.
y * o.
y) * r + o.
y * o.
y * o.
y + o.
x * sqrt(discr)) *
107 (o.
y * r * -2.0 + o.
x * o.
x + o.
y * o.
y + r * r)) /
109 const double sol_x1 =
110 ((
R *
R) * (-1.0 / 2.0) + (o.
x * o.
x) * (1.0 / 2.0) +
111 (o.
y * o.
y) * (1.0 / 2.0) -
113 (-(
R *
R) * o.
y + (
R *
R) * r + (o.
x * o.
x) * o.
y + (o.
x * o.
x) * r -
114 (o.
y * o.
y) * r + o.
y * o.
y * o.
y - o.
x * sqrt(discr)) *
116 (o.
y * r * -2.0 + o.
x * o.
x + o.
y * o.
y + r * r) +
118 (-(
R *
R) * o.
y + (
R *
R) * r + (o.
x * o.
x) * o.
y + (o.
x * o.
x) * r -
119 (o.
y * o.
y) * r + o.
y * o.
y * o.
y - o.
x * sqrt(discr)) *
121 (o.
y * r * -2.0 + o.
x * o.
x + o.
y * o.
y + r * r)) /
125 const double sol_y0 =
126 ((
R *
R) * o.
y * (-1.0 / 2.0) + (
R *
R) * r * (1.0 / 2.0) +
127 (o.
x * o.
x) * o.
y * (1.0 / 2.0) + (o.
x * o.
x) * r * (1.0 / 2.0) -
128 (o.
y * o.
y) * r * (1.0 / 2.0) + (o.
y * o.
y * o.
y) * (1.0 / 2.0) +
129 o.
x * sqrt(discr) * (1.0 / 2.0)) /
130 (o.
y * r * -2.0 + o.
x * o.
x + o.
y * o.
y + r * r);
131 const double sol_y1 =
132 ((
R *
R) * o.
y * (-1.0 / 2.0) + (
R *
R) * r * (1.0 / 2.0) +
133 (o.
x * o.
x) * o.
y * (1.0 / 2.0) + (o.
x * o.
x) * r * (1.0 / 2.0) -
134 (o.
y * o.
y) * r * (1.0 / 2.0) + (o.
y * o.
y * o.
y) * (1.0 / 2.0) -
135 o.
x * sqrt(discr) * (1.0 / 2.0)) /
136 (o.
y * r * -2.0 + o.
x * o.
x + o.
y * o.
y + r * r);
141 sol0.x - ptArcCenter.
x,
142 -(sol0.y - ptArcCenter.
y));
143 double th1 = atan2(sol1.
x - ptArcCenter.
x, -(sol1.
y - ptArcCenter.
y));
156 out_col_dist = std::abs(r) * std::min(th0, th1);
bool collision_free_dist_arc_circ_robot(const double arc_radius, const double robot_radius, const mrpt::math::TPoint2D &obstacle, double &out_col_dist)
Computes the collision-free distance for a forward path (+X) circular arc path segment from pose (0...
This base provides a set of functions for maths stuff.
T wrapTo2Pi(T a)
Modifies the given angle to translate it into the [0,2pi[ range.
bool collision_free_dist_segment_circ_robot(const mrpt::math::TPoint2D &p_start, const mrpt::math::TPoint2D &p_end, const double robot_radius, const mrpt::math::TPoint2D &obstacle, double &out_col_dist)
Computes the collision-free distance for a linear segment path between two points, for a circular robot, and a point obstacle (ox,oy).
return_t square(const num_t x)
Inline function for the square of a number.
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
#define ASSERT_ABOVE_(__A, __B)
T norm() const
Point norm: |v| = sqrt(x^2+y^2)
CONTAINER::Scalar norm(const CONTAINER &v)
int solve_poly2(double a, double b, double c, double &r1, double &r2) noexcept
Solves equation a*x^2 + b*x + c = 0.