32 for (
const auto* obstacle :
34 if (obstacle->IsVirtual() || obstacle->IsStatic()) {
35 ADEBUG <<
"skip one virtual or static obstacle";
39 double start_s = std::numeric_limits<double>::max();
40 double end_s = -std::numeric_limits<double>::max();
41 double start_l = std::numeric_limits<double>::max();
42 double end_l = -std::numeric_limits<double>::max();
44 for (
const auto& p : obstacle->PerceptionPolygon().points()) {
47 start_s = std::fmin(start_s, sl_point.
s());
48 end_s = std::fmax(end_s, sl_point.
s());
50 start_l = std::fmin(start_l, sl_point.
l());
51 end_l = std::fmax(end_l, sl_point.
l());
55 double left_width(0), right_width(0);
57 (start_s + end_s) * 0.5, &left_width, &right_width);
58 if (end_l < -right_width || start_l > left_width) {
65 bool same_direction =
true;
66 if (obstacle->HasTrajectory()) {
67 double obstacle_moving_direction =
68 obstacle->Trajectory().trajectory_point(0).path_point().theta();
69 const auto& vehicle_state = reference_line_info->
vehicle_state();
70 double vehicle_moving_direction = vehicle_state.
heading();
72 vehicle_moving_direction =
76 obstacle_moving_direction - vehicle_moving_direction));
77 same_direction = heading_difference < (M_PI / 2.0);
81 static constexpr double kSafeTimeOnSameDirection = 3.0;
82 static constexpr double kSafeTimeOnOppositeDirection = 5.0;
83 static constexpr double kForwardMinSafeDistanceOnSameDirection = 10.0;
84 static constexpr double kBackwardMinSafeDistanceOnSameDirection = 10.0;
85 static constexpr double kForwardMinSafeDistanceOnOppositeDirection = 50.0;
86 static constexpr double kBackwardMinSafeDistanceOnOppositeDirection = 1.0;
87 static constexpr double kDistanceBuffer = 0.5;
89 double kForwardSafeDistance = 0.0;
90 double kBackwardSafeDistance = 0.0;
92 kForwardSafeDistance =
93 std::fmax(kForwardMinSafeDistanceOnSameDirection,
94 (ego_v - obstacle->speed()) * kSafeTimeOnSameDirection);
95 kBackwardSafeDistance =
96 std::fmax(kBackwardMinSafeDistanceOnSameDirection,
97 (obstacle->speed() - ego_v) * kSafeTimeOnSameDirection);
99 kForwardSafeDistance =
100 std::fmax(kForwardMinSafeDistanceOnOppositeDirection,
101 (ego_v + obstacle->speed()) * kSafeTimeOnOppositeDirection);
102 kBackwardSafeDistance = kBackwardMinSafeDistanceOnOppositeDirection;
106 kDistanceBuffer, obstacle->IsLaneChangeBlocking()) &&
108 kDistanceBuffer, obstacle->IsLaneChangeBlocking())) {
110 ->
Find(obstacle->Id())
112 ADEBUG <<
"Lane Change is blocked by obstacle" << obstacle->Id();
116 ->
Find(obstacle->Id())
124 const double search_beam_length,
125 const double search_beam_radius_intensity,
126 const double search_range,
127 const double is_block_angle_threshold) {
128 const auto& vehicle_state = reference_line_info.
vehicle_state();
130 const double adv_heading = vehicle_state.heading();
132 for (
auto* obstacle :
134 double left_most_angle =
136 double right_most_angle =
138 bool right_most_found =
false;
139 if (obstacle->IsVirtual()) {
140 ADEBUG <<
"skip one virtual obstacle";
143 const auto& obstacle_polygon = obstacle->PerceptionPolygon();
144 for (
double search_angle = 0.0; search_angle < search_range;
145 search_angle += search_beam_radius_intensity) {
148 adv_heading - 0.5 * search_range + search_angle);
150 search_beam_end += adv_pos;
153 if (!right_most_found && obstacle_polygon.HasOverlap(search_beam)) {
154 right_most_found =
true;
155 right_most_angle = beam_heading;
158 if (right_most_found && !obstacle_polygon.HasOverlap(search_beam)) {
159 left_most_angle = beam_heading;
163 if (!right_most_found) {
168 left_most_angle - right_most_angle)) > is_block_angle_threshold) {
bool IsPerceptionBlocked(const ReferenceLineInfo &reference_line_info, const double search_beam_length, const double search_beam_radius_intensity, const double search_range, const double is_block_angle_threshold)
A static function to estimate if an obstacle in certain range in front of ADV blocks too much space p...