118 double safe_distance,
119 double following_accel_ratio,
121 double cruise_speed) {
122 CHECK_GE(distance, 0.0);
123 CHECK_GE(safe_distance, 0.0);
124 CHECK_GT(following_accel_ratio, 0.0);
127 if (distance > safe_distance &&
128 distance - safe_distance < kSafeDistanceSmooth &&
129 std::abs(v - start_v_) < kFollowSpeedSmooth) {
130 distance = safe_distance;
135 v = std::max(v, 0.0);
139 for (
auto& pc : constraints_) {
140 auto t = (s - distance) / v;
143 constraints.
t_min = t;
144 CombineConstraints(constraints, &pc);
150 auto od = distance - safe_distance;
153 auto r0 = (distance - safe_distance) / (distance + safe_distance);
154 auto vm = std::max(cruise_speed * r0, 0.0) +
155 (1.0 + following_accel_ratio * r0) * v1;
156 auto ra = (v1 - vm) * (v1 - vm) * (v1 + v0 - 2.0 * vm) / (od * od);
157 auto rb = (v1 - vm) * (v1 + 2.0 * v0 - 3.0 * vm) / od;
159 auto t1 = -1.0 * od / (v1 - vm);
160 auto s1 = ra * t1 * t1 * t1 + rb * t1 * t1 + rc * t1;
165 for (
auto& pc : constraints_) {
175 }
else if (s <= s1 && t <= t1) {
176 auto a = 6.0 * ra * t + 2.0 * rb;
177 t += (std::sqrt(prev_v * prev_v + 2.0 * a * s_step_) - prev_v) / a;
178 auto cur_v = 3.0 * ra * t * t + 2.0 * rb * t + rc;
184 t += 2.0 * s_step_ / (prev_v + cur_v);
190 CombineConstraints(constraints, &pc);
195 CHECK_NOTNULL(output);
198 auto& constraints = constraints_[0];
199 constraints.v_max = start_v_;
200 constraints.v_preffered = start_v_;
201 constraints.a_max = start_a_;
202 constraints.a_preffered = start_a_;
203 constraints.da_max = start_da_;
204 constraints.da_preffered = start_da_;
207 for (ssize_t i = constraints_.size() - 2; i >= 0; i--) {
208 const auto& next = constraints_[i + 1];
209 auto& cur = constraints_[i];
211 std::min(std::sqrt(next.v_max * next.v_max + 2 * next.b_max * s_step_),
213 cur.v_preffered = std::min(cur.v_max, cur.v_preffered);
217 for (
size_t i = 1; i < constraints_.size(); i++) {
218 const auto& prev = constraints_[i - 1];
219 auto& cur = constraints_[i];
221 std::min(std::sqrt(prev.v_max * prev.v_max + 2 * cur.a_max * s_step_),
223 cur.v_preffered = std::min(cur.v_max, cur.v_preffered);
227 for (ssize_t i = constraints_.size() - 2; i >= 0; i--) {
228 const auto& next = constraints_[i + 1];
229 auto& cur = constraints_[i];
230 cur.v_preffered = std::min(std::sqrt(next.v_preffered * next.v_preffered +
231 2 * next.b_preffered * s_step_),
236 for (
size_t i = 1; i < constraints_.size(); i++) {
237 const auto& prev = constraints_[i - 1];
238 auto& cur = constraints_[i];
239 cur.v_preffered = std::min(std::sqrt(prev.v_preffered * prev.v_preffered +
240 2 * cur.a_preffered * s_step_),
244 auto& points = *output;
245 points.resize(constraints_.size());
248 auto& point = points[0];
253 point.da = start_da_;
256 for (
size_t i = 1; i < points.size(); i++) {
257 const auto& prev = points[i - 1];
258 const auto& constraints = constraints_[i];
259 auto& cur = points[i];
262 auto t_min = std::max(prev.t, constraints.t_min);
263 auto v_max = constraints.v_max;
264 t_min = std::max(prev.t + 2.0 * s_step_ / (prev.v + v_max), t_min);
267 auto t_max = std::numeric_limits<double>::infinity();
268 auto b_max = constraints.b_max;
269 auto r0 = prev.v * prev.v - 2 * b_max * s_step_;
271 t_max = prev.t + (prev.v - std::sqrt(r0)) / b_max;
275 AERROR <<
"failure to satisfy the constraints.";
276 return Status(ErrorCode::PLANNING_ERROR,
277 "failure to satisfy the constraints.");
281 auto v_preffered = constraints.v_preffered;
282 auto t_preffered = prev.t + 2 * s_step_ / (prev.v + v_preffered);
284 cur.s = prev.s + s_step_;
285 cur.t = Clamp(t_preffered, t_min, t_max);
286 auto dt = cur.t - prev.t;
287 cur.v = std::max(2.0 * s_step_ / dt - prev.v, 0.0);
290 if (std::isinf(cur.t)) {
291 points.resize(i + 1);
296 for (
size_t i = 1; i < points.size() - 1; i++) {
297 const auto& prev = points[i - 1];
298 const auto& next = points[i + 1];
299 auto& cur = points[i];
300 auto ds = next.s - prev.s;
301 auto dt = next.t - prev.t;
305 auto& first = points[0];
306 const auto& second = points[1];
307 first.a = (second.v - first.v) / (2.0 * (second.t - first.t));
309 for (
size_t i = 1; i < points.size() - 1; i++) {
310 const auto& prev = points[i - 1];
311 const auto& next = points[i + 1];
312 auto& cur = points[i];
313 auto dv = next.v - prev.v;
314 auto dt = next.t - prev.t;
318 for (
size_t i = 1; i < points.size() - 1; i++) {
319 const auto& prev = points[i - 1];
320 const auto& next = points[i + 1];
321 auto& cur = points[i];
322 auto da = next.a - prev.a;
323 auto dt = next.t - prev.t;
327 for (
size_t i = 0; i < points.size(); i++) {
328 auto& point = points[i];
329 point.s = std::min(kInfinityValue, point.s);
330 point.t = std::min(kInfinityValue, point.t);
331 point.v = std::min(kInfinityValue, point.v);
332 point.a = std::min(kInfinityValue, point.a);
333 point.da = std::min(kInfinityValue, point.da);
335 if (std::abs(point.t - kInfinityValue) < kDoubleEpsilon)
336 points.resize(i + 1);