48 {
49 CHECK_NOTNULL(frame);
50 CHECK_NOTNULL(reference_line_info);
51
52
54 const std::vector<PathOverlap>& keep_clear_overlaps =
55 reference_line_info->reference_line().map_path().clear_area_overlaps();
56 for (const auto& keep_clear_overlap : keep_clear_overlaps) {
57 const auto obstacle_id =
58 KEEP_CLEAR_VO_ID_PREFIX + keep_clear_overlap.object_id;
59
60 if (BuildKeepClearObstacle(frame, reference_line_info, obstacle_id,
61 keep_clear_overlap.start_s,
62 keep_clear_overlap.end_s)) {
63 ADEBUG <<
"KEEP_CLAER for keep_clear_zone["
64 << keep_clear_overlap.object_id << "] s["
65 << keep_clear_overlap.start_s << ", " << keep_clear_overlap.end_s
66 << "] BUILD";
67 }
68 }
69 }
70
71
73 hdmap::PathOverlap* crosswalk_overlap = nullptr;
74 hdmap::PathOverlap* stop_sign_overlap = nullptr;
75 hdmap::PathOverlap* traffic_light_overlap = nullptr;
76 hdmap::PathOverlap* pnc_junction_overlap = nullptr;
77
78 const auto& first_encountered_overlaps =
79 reference_line_info->FirstEncounteredOverlaps();
80 for (const auto& overlap : first_encountered_overlaps) {
81 ADEBUG << overlap.first <<
", " << overlap.second.DebugString();
82 switch (overlap.first) {
84 ADEBUG <<
"CROSSWALK[" << overlap.second.object_id <<
"] s["
85 << overlap.second.start_s << ", " << overlap.second.end_s
86 << "]";
87 crosswalk_overlap = const_cast<PathOverlap*>(&overlap.second);
88 break;
90 ADEBUG <<
"STOP_SIGN[" << overlap.second.object_id <<
"] s["
91 << overlap.second.start_s << ", " << overlap.second.end_s
92 << "]";
93 stop_sign_overlap = const_cast<PathOverlap*>(&overlap.second);
94 break;
96 ADEBUG <<
"SIGNAL[" << overlap.second.object_id <<
"] s["
97 << overlap.second.start_s << ", " << overlap.second.end_s
98 << "]";
99 traffic_light_overlap = const_cast<PathOverlap*>(&overlap.second);
100 break;
102 ADEBUG <<
"PNC_JUNCTION[" << overlap.second.object_id <<
"] s["
103 << overlap.second.start_s << ", " << overlap.second.end_s
104 << "]";
105 pnc_junction_overlap = const_cast<PathOverlap*>(&overlap.second);
106 break;
107 default:
108 break;
109 }
110 }
111
112 if (pnc_junction_overlap != nullptr) {
113 const double adc_front_edge_s =
114 reference_line_info->AdcSlBoundary().end_s();
115 if (!IsCreeping(pnc_junction_overlap->start_s, adc_front_edge_s)) {
116
117
118 double pnc_junction_start_s = pnc_junction_overlap->start_s;
119
120 if (traffic_light_overlap != nullptr &&
121 std::fabs(pnc_junction_start_s - traffic_light_overlap->start_s) <=
123 ADEBUG <<
"adjust pnc_junction_start_s[" << pnc_junction_start_s
124 << "] to traffic_light_start_s"
125 << traffic_light_overlap->start_s << "]";
126 pnc_junction_start_s = traffic_light_overlap->start_s;
127 } else if (stop_sign_overlap != nullptr &&
128 std::fabs(pnc_junction_start_s -
129 stop_sign_overlap->start_s) <=
131 ADEBUG <<
"adjust pnc_junction_start_s[" << pnc_junction_start_s
132 << "] to stop_sign_start_s" << stop_sign_overlap->start_s
133 << "]";
134 pnc_junction_start_s = stop_sign_overlap->start_s;
135 } else if (crosswalk_overlap != nullptr &&
136 std::fabs(pnc_junction_start_s -
137 crosswalk_overlap->start_s) <=
139 ADEBUG <<
"adjust pnc_junction_start_s[" << pnc_junction_start_s
140 << "] to cross_walk_start_s" << crosswalk_overlap->start_s
141 << "]";
142 pnc_junction_start_s = crosswalk_overlap->start_s;
143 }
144
145 const auto obstacle_id =
146 KEEP_CLEAR_JUNCTION_VO_ID_PREFIX + pnc_junction_overlap->object_id;
147
148 if (BuildKeepClearObstacle(frame, reference_line_info, obstacle_id,
149 pnc_junction_start_s,
150 pnc_junction_overlap->end_s)) {
151 ADEBUG <<
"KEEP_CLAER for junction["
152 << pnc_junction_overlap->object_id << "] s["
153 << pnc_junction_start_s << ", " << pnc_junction_overlap->end_s
154 << "] BUILD";
155 }
156 }
157 }
158 }
159
161}
static Status OK()
generate a success status.
optional bool enable_junction
optional bool enable_keep_clear_zone
optional double align_with_traffic_sign_tolerance