48 CHECK_NOTNULL(speed_limit_data);
53 for (uint32_t i = 0; i < discretized_path.size(); ++i) {
54 const double path_s = discretized_path.at(i).s();
55 const double reference_line_s = frenet_path.at(i).s();
56 if (reference_line_s > reference_line_.
Length()) {
57 AWARN <<
"path w.r.t. reference line at [" << reference_line_s
58 <<
"] is LARGER than reference_line_ length ["
59 << reference_line_.
Length() <<
"]. Please debug before proceeding.";
64 double speed_limit_from_reference_line =
66 print_curve.
AddPoint(
"speed_limit_from_ref", path_s,
67 speed_limit_from_reference_line);
70 const double speed_limit_from_centripetal_acc =
72 std::fmax(std::fabs(discretized_path.at(i).kappa()),
74 print_curve.
AddPoint(
"speed_limit_from_centripetal_acc", path_s,
75 speed_limit_from_centripetal_acc);
79 double speed_limit_from_nearby_obstacles =
80 std::numeric_limits<double>::max();
81 const double collision_safety_range =
83 for (
const auto* ptr_obstacle : obstacles.
Items()) {
84 if (ptr_obstacle->IsVirtual()) {
87 if (!ptr_obstacle->LateralDecision().has_nudge()) {
100 const double vehicle_front_s =
102 const double vehicle_back_s =
104 const double obstacle_front_s =
105 ptr_obstacle->PerceptionSLBoundary().end_s();
106 const double obstacle_back_s =
107 ptr_obstacle->PerceptionSLBoundary().start_s();
109 if (vehicle_front_s < obstacle_back_s ||
110 vehicle_back_s > obstacle_front_s) {
114 const auto& nudge_decision = ptr_obstacle->LateralDecision().nudge();
117 const double frenet_point_l = frenet_path.at(i).l();
120 bool is_close_on_left =
121 (nudge_decision.type() == ObjectNudge::LEFT_NUDGE) &&
123 collision_safety_range <
124 ptr_obstacle->PerceptionSLBoundary().end_l());
127 bool is_close_on_right =
128 (nudge_decision.type() == ObjectNudge::RIGHT_NUDGE) &&
129 (ptr_obstacle->PerceptionSLBoundary().start_l() -
130 collision_safety_range <
134 if (is_close_on_left || is_close_on_right) {
135 double nudge_speed_ratio = 1.0;
136 if (ptr_obstacle->IsStatic()) {
143 speed_limit_from_nearby_obstacles =
144 nudge_speed_ratio * speed_limit_from_reference_line;
149 double curr_speed_limit = 0.0;
153 std::min({speed_limit_from_reference_line,
154 speed_limit_from_centripetal_acc,
155 speed_limit_from_nearby_obstacles}));
159 std::min({speed_limit_from_reference_line,
160 speed_limit_from_centripetal_acc}));
162 if (speed_limit_from_nearby_obstacles <
163 std::numeric_limits<double>::max()) {
164 print_curve.
AddPoint(
"speed_limit_from_nearby_obstacles", path_s,
165 speed_limit_from_nearby_obstacles);
168 print_curve.
AddPoint(
"curr_speed_limit", path_s, curr_speed_limit);