35 {
36 const double v0 = ego_info->start_point().v();
37 const double a0 = ego_info->start_point().a();
38
39
40 const double max_deceleration = FLAGS_slowdown_profile_deceleration;
41
42 std::vector<std::vector<Vec2d>> lower_bounds;
43 GetLowerSTBound(lower_bounds);
44
45 if (a0 <= 0.0) {
46 SpeedData speed_data;
47 if (v0 <= 0.0) {
48
49 speed_data.AppendSpeedPoint(0.0, 0.0, 0.0, 0.0, 0.0);
50 AINFO <<
"Fallback speed: current speed is already 0! a0: " << a0 <<
" v0: " << v0;
52 return speed_data;
53 } else {
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;
58
59 double s = 0.0;
60 double v = 0.0;
61 double a = 0.0;
62 double square_t = 0.0;
63 for (double t = 0.0; t < slow_down_time; t += FLAGS_fallback_time_unit) {
64 square_t = t * t;
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;
68 speed_data.AppendSpeedPoint(s, t, v, a, min_jerk_required);
69 }
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;
74 return speed_data;
75 }
76
77 SpeedData fast_stop_speed_data;
80 AINFO <<
"Fallback speed: Fast stop because of collision. a0: " << a0 <<
" v0: " << v0
81 << " dec: " << max_deceleration;
82 return fast_stop_speed_data;
83 }
84 }
85 }
86
87 SpeedData 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;
93 }
94
95
96 SpeedData smooth_stop_speed_data;
98 v0,
99 a0,
100 max_deceleration,
101 FLAGS_longitudinal_jerk_upper_bound,
102 FLAGS_longitudinal_jerk_lower_bound,
103 &smooth_stop_speed_data);
104 if (IsCollisionWithSpeedBoundaries(smooth_stop_speed_data)) {
105
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. "
111 "a0: "
112 << a0 << " v0: " << v0 << " dec: " << max_deceleration;
114 return fast_stop_speed_data;
115 }
116 SpeedData last_no_collision_speed_data = smooth_stop_speed_data;
117
118 double lower_jerk
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;
128 } else {
129 upper_jerk = mid_jerk;
130 last_no_collision_speed_data = smooth_stop_speed_data;
131 }
132 }
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;
137 }
138 AINFO <<
"Fallback speed: stop smoothly the vehilce. a0: " << a0 <<
" v0: " << v0 <<
" dec: " << max_deceleration;
140 return smooth_stop_speed_data;
141}
static void SmoothStop(double v0, double a0, double max_deceleration, double max_pos_jerk, double max_neg_jerk, SpeedData *speed_data)
static void FastStop(double v0, double a0, double max_deceleration, SpeedData *speed_data)
static void FillEnoughSpeedPoints(SpeedData *const speed_data)