31 double s(
double t,
double s0,
double v0,
double a0,
double j)
33 return s0 + v0 * t + 0.5 * a0 * t * t + 1.0 / 6.0 * j * t * t * t;
35 double v(
double t,
double v0,
double a0,
double j)
37 return v0 + a0 * t + 0.5 * j * t * t;
39 double a(
double t,
double a0,
double j)
62 return 2 *
t_to_v(
v / 2.0, a0, j);
73 auto t =
t_to_v(v0, -signV * a0, signV * j);
74 return s(t, 0, v0, a0, -signV * j);
82 double dt1 =
std::abs((dec_max - a0) / (-j * d));
85 double v1 =
v(dt1, v0, a0, -d * j);
86 double acc_duration =
std::abs(dec_max) / j;
87 double v2 =
v(acc_duration, 0, 0, d * j);
90 double dt2 = d * ((v1 - v2) / dec_max);
94 double s1 =
s(dt1, 0, v0, a0, d * j);
95 double s2 =
s(dt2, 0, v1, dec_max, 0);
96 double s3 =
s(dt3, 0, v2, dec_max, d * j);
97 double v3 =
v(dt3, v2, dec_max, d * j);
98 double s_total = s1 + s2 + s3;
103 double delta_a =
a(excess_time / 2, 0, d * j);
104 a_max -= d * delta_a;
110 return {s_total * d, v1, v2, v3, dt1, dt2, dt3};
120 return j * v0 - a0 * a0 / 2 > 0.0f;
123 double jerk(
double t,
double s0,
double v0,
double a0)
125 return (6 * s0 - 3 * t * (a0 * t + 2 * v0)) / (t * t * t);
131 double t = - (3 * s0) / v0;
132 double a0 = - (2 * v0) / t;
133 double j = 2 * v0 / (t * t);
134 return std::make_tuple(t, a0, j);
154 double part = j * v0 - a0 * a0 / 2.0;
161 throw std::runtime_error(
"unsuitable parameters! : j: " +
std::to_string(j) +
166 double t2 = (a0 / j) + t1;
167 double v1 =
v(t1, v0, a0, -j);
170 double a1 =
a(t1, -a0, -j);
172 double v2 =
v(t2, v1, a1, j);
175 double a2 =
a(t2, a1, j);
178 double s1 =
s(t1, 0, v0, a0, -j);
179 double s2 =
s(t2, 0, v1, a1, j);
180 double s_total = s1 + s2;
181 return {s_total, s1, s2, d * v1, d * v2, d * a1, d * a2, t1 + t2, t1, t2};