28double slerp(
const double a0,
const double t0,
const double a1,
const double t1,
31 ADEBUG <<
"input time difference is too small";
36 double d = a1_n - a0_n;
39 }
else if (d < -M_PI) {
43 const double r = (t - t0) / (t1 - t0);
44 const double a = a0_n + d * r;
49 const SLPoint &p1,
const double w) {
53 p.set_s((1 - w) * p0.
s() + w * p1.
s());
54 p.set_l((1 - w) * p0.
l() + w * p1.
l());
65 double weight = (s - s0) / (s1 - s0);
66 double x = (1 - weight) * p0.
x() + weight * p1.
x();
67 double y = (1 - weight) * p0.
y() + weight * p1.
y();
69 double kappa = (1 - weight) * p0.
kappa() + weight * p1.
kappa();
70 double dkappa = (1 - weight) * p0.
dkappa() + weight * p1.
dkappa();
71 double ddkappa = (1 - weight) * p0.
ddkappa() + weight * p1.
ddkappa();
74 path_point.set_theta(theta);
75 path_point.set_kappa(kappa);
76 path_point.set_dkappa(dkappa);
77 path_point.set_ddkappa(ddkappa);
85 if (!tp0.has_path_point() || !tp1.has_path_point()) {
87 p.mutable_path_point()->CopyFrom(
PathPoint());
96 tp.set_v(
lerp(tp0.
v(), t0, tp1.
v(), t1, t));
97 tp.set_a(
lerp(tp0.
a(), t0, tp1.
a(), t1, t));
98 tp.set_relative_time(t);
101 PathPoint *path_point = tp.mutable_path_point();
102 path_point->set_x(
lerp(pp0.
x(), t0, pp1.
x(), t1, t));
103 path_point->set_y(
lerp(pp0.
y(), t0, pp1.
y(), t1, t));
108 path_point->set_s(
lerp(pp0.
s(), t0, pp1.
s(), t1, t));
Linear interpolation functions.
Math-related util functions.
SLPoint InterpolateUsingLinearApproximation(const SLPoint &p0, const SLPoint &p1, const double w)
T lerp(const T &x0, const double t0, const T &x1, const double t1, const double t)
Linear interpolation between two points of type T.
constexpr double kMathEpsilon
double NormalizeAngle(const double angle)
Normalize angle to [-PI, PI).
double slerp(const double a0, const double t0, const double a1, const double t1, const double t)
Spherical linear interpolation between two angles.
optional double relative_time
optional PathPoint path_point