40 const double max_deceleration = FLAGS_slowdown_profile_deceleration;
42 std::vector<std::vector<Vec2d>> lower_bounds;
43 GetLowerSTBound(lower_bounds);
50 AINFO <<
"Fallback speed: current speed is already 0! a0: " << a0 <<
" v0: " << v0;
54 double square_a0 = a0 * a0;
55 double min_jerk_required = square_a0 / (2.0 * v0);
56 if (FLAGS_longitudinal_jerk_upper_bound < min_jerk_required) {
57 double slow_down_time = -a0 / min_jerk_required;
62 double square_t = 0.0;
63 for (
double t = 0.0; t < slow_down_time; t += FLAGS_fallback_time_unit) {
65 a = a0 + t * min_jerk_required;
66 v = v0 + a0 * t + 0.5 * min_jerk_required * square_t;
67 s = v0 * t + 0.5 * a0 * square_t + min_jerk_required * square_t * t / 6.0;
70 if (!IsCollisionWithSpeedBoundaries(speed_data)) {
71 AINFO <<
"Fallback speed: Make vehicle just stop to zero speed. a0: " << a0 <<
" v0: " << v0
72 <<
" new_jerk: " << min_jerk_required;
80 AINFO <<
"Fallback speed: Fast stop because of collision. a0: " << a0 <<
" v0: " << v0
81 <<
" dec: " << max_deceleration;
82 return fast_stop_speed_data;
89 if (IsCollisionWithSpeedBoundaries(fast_stop_speed_data)) {
91 AINFO <<
"Fallback speed: Fast stop the vehicle. a0: " << a0 <<
" v0: " << v0 <<
" dec: " << max_deceleration;
92 return fast_stop_speed_data;
101 FLAGS_longitudinal_jerk_upper_bound,
102 FLAGS_longitudinal_jerk_lower_bound,
103 &smooth_stop_speed_data);
104 if (IsCollisionWithSpeedBoundaries(smooth_stop_speed_data)) {
106 double max_jerk = fabs(max_deceleration / FLAGS_fallback_time_unit);
107 smooth_stop_speed_data.clear();
109 if (IsCollisionWithSpeedBoundaries(smooth_stop_speed_data)) {
110 AINFO <<
"Fallback speed: Hard to stop smoothly and use still fast stop. "
112 << a0 <<
" v0: " << v0 <<
" dec: " << max_deceleration;
114 return fast_stop_speed_data;
116 SpeedData last_no_collision_speed_data = smooth_stop_speed_data;
119 = std::min(fabs(FLAGS_longitudinal_jerk_upper_bound), fabs(FLAGS_longitudinal_jerk_lower_bound));
120 double upper_jerk = max_jerk;
121 double mid_jerk = 0.0;
122 const double jerk_error = 1.0;
123 while (mid_jerk - lower_jerk > jerk_error) {
124 mid_jerk = (lower_jerk + upper_jerk) * 0.5;
126 if (IsCollisionWithSpeedBoundaries(smooth_stop_speed_data)) {
127 lower_jerk = mid_jerk;
129 upper_jerk = mid_jerk;
130 last_no_collision_speed_data = smooth_stop_speed_data;
134 AINFO <<
"Fallback speed: Find new jerk to stop the vehilce. a0: " << a0 <<
" v0: " << v0
135 <<
" new jerk: " << mid_jerk;
136 return last_no_collision_speed_data;
138 AINFO <<
"Fallback speed: stop smoothly the vehilce. a0: " << a0 <<
" v0: " << v0 <<
" dec: " << max_deceleration;
140 return smooth_stop_speed_data;