53 {
54 static constexpr double kConstDeceleration = -0.8;
55 static constexpr double kProceedingSpeed = 2.23;
56 const double proceeding_speed = std::fmin(max_speed, kProceedingSpeed);
57 const double distance_to_start_deceleration =
58 proceeding_speed * proceeding_speed / kConstDeceleration / 2;
59 bool is_const_deceleration_mode = distance < distance_to_start_deceleration;
60
61 double a = kConstDeceleration;
62 double t = 0.0;
63 double s = 0.0;
64 double v = proceeding_speed;
65
66 static constexpr double kDeltaT = 0.1;
67
68 SpeedData speed_data;
69 while (s < distance && v > 0) {
70 if (is_const_deceleration_mode) {
71 speed_data.AppendSpeedPoint(s, t, v, a, 0.0);
72 t += kDeltaT;
73 double v_new = std::max(0.0, v + a * t);
74 s += kDeltaT * (v + v_new) / 2;
75 v = v_new;
76 } else {
77 speed_data.AppendSpeedPoint(s, t, v, 0.0, 0.0);
78 t += kDeltaT;
79 s += kDeltaT * v;
80 if (distance - s < distance_to_start_deceleration)
81 is_const_deceleration_mode = true;
82 }
83 }
84
85 return speed_data;
86}