84 const double t = std::max(0.0, elapsed_time);
89 return State{target_, 0.0};
92 const double sign = (target_ >= initial_.position) ? 1.0 : -1.0;
93 const double a_dec = constraints_.effectiveDeceleration();
100 const double accel = sign * constraints_.max_acceleration;
101 state.
velocity = initial_.velocity + accel * t;
102 state.
position = initial_.position + initial_.velocity * t + 0.5 * accel * t * t;
104 else if (t <= accel_time_ + cruise_time_)
107 const double cruise_t = t - accel_time_;
108 state.
velocity = sign * cruise_velocity_;
114 const double decel_t = t - accel_time_ - cruise_time_;
115 const double decel = -sign * a_dec;
116 state.
velocity = sign * cruise_velocity_ + decel * decel_t;
117 state.
position = decel_start_position_ + sign * cruise_velocity_ * decel_t + 0.5 * decel * decel_t * decel_t;
151 double c_pos = current.
position * dir;
152 double c_vel = current.
velocity * dir;
153 const double g_pos = goal.
position * dir;
154 const double g_vel = goal.
velocity * dir;
157 if (std::abs(c_vel) > max_v)
158 c_vel = std::copysign(max_v, c_vel);
163 const double cutoff_begin = c_vel / a_acc;
164 const double cutoff_dist_begin = cutoff_begin * cutoff_begin * a_acc * 0.5;
166 const double cutoff_end = g_vel / a_dec;
167 const double cutoff_dist_end = cutoff_end * cutoff_end * a_dec * 0.5;
169 const double full_trapezoid_dist =
170 cutoff_dist_begin + (g_pos - c_pos) + cutoff_dist_end;
172 double accel_time = max_v / a_acc;
173 double decel_time = max_v / a_dec;
174 double full_speed_dist =
175 full_trapezoid_dist - 0.5 * a_acc * accel_time * accel_time
176 - 0.5 * a_dec * decel_time * decel_time;
178 double cruise_v = max_v;
181 if (full_speed_dist < 0.0)
184 const double v_peak_sq = 2.0 * std::max(0.0, full_trapezoid_dist)
185 * a_acc * a_dec / (a_acc + a_dec);
186 cruise_v = std::sqrt(std::max(0.0, v_peak_sq));
187 accel_time = cruise_v / a_acc;
188 decel_time = cruise_v / a_dec;
189 full_speed_dist = 0.0;
192 const double end_accel = accel_time - cutoff_begin;
193 const double end_full_speed =
194 end_accel + (cruise_v > 1e-10 ? full_speed_dist / cruise_v : 0.0);
195 const double end_decel = end_full_speed + decel_time - cutoff_end;
202 r_vel = c_vel + dt * a_acc;
203 r_pos = c_pos + (c_vel + dt * a_acc * 0.5) * dt;
205 else if (dt < end_full_speed)
210 + (c_vel + end_accel * a_acc * 0.5) * end_accel
211 + cruise_v * (dt - end_accel);
213 else if (dt <= end_decel)
216 const double time_left = end_decel - dt;
217 r_vel = g_vel + time_left * a_dec;
218 r_pos = g_pos - (g_vel + time_left * a_dec * 0.5) * time_left;
228 return State{r_pos * dir, r_vel * dir};