36 const std::vector<SLPoint>& boundary,
const double s) {
38 if (s <= boundary.front().s()) {
39 return boundary.front().l();
40 }
else if (s >= boundary.back().s()) {
41 return boundary.back().l();
46 auto cmp = [](
const SLPoint& sl_point,
const double s) {
47 return sl_point.
s() < s;
49 auto iter = std::lower_bound(boundary.begin(), boundary.end(), s, cmp);
50 auto last_iter = *(iter - 1);
51 return last_iter.l() + (s - last_iter.s()) * (iter->l() - last_iter.l()) /
52 (iter->s() - last_iter.s());
76 : sl_boundary_(sl_boundary), id_(id), obstacle_type_(type) {
81 double min_s = std::numeric_limits<double>::max();
82 double min_l = std::numeric_limits<double>::max();
83 double max_s = std::numeric_limits<double>::lowest();
84 double max_l = std::numeric_limits<double>::lowest();
85 for (
int i = 0; i < sl_boundary.boundary_point_size(); i++) {
87 if (sl_point.s() < min_s) {
91 if (sl_point.s() > max_s) {
95 if (sl_point.l() < min_l) {
99 if (sl_point.l() > max_l) {
100 max_l = sl_point.l();
114 while (t != max_s_index) {
117 right_boundary_.push_back(sl_point);
118 t = (t + 1) % sl_boundary.boundary_point_size();
122 right_boundary_.push_back(sl_point);
123 if (right_boundary_.front().s() > right_boundary_.back().s()) {
124 std::reverse(right_boundary_.begin(), right_boundary_.end());
128 while (t != min_s_index) {
131 left_boundary_.push_back(sl_point);
132 t = (t + 1) % sl_boundary.boundary_point_size();
136 left_boundary_.push_back(sl_point);
137 if (left_boundary_.front().s() > left_boundary_.back().s()) {
138 std::reverse(left_boundary_.begin(), left_boundary_.end());
146 std::swap(left_boundary_, right_boundary_);
151 for (
auto pt : right_boundary_) {
152 print_curve.
AddPoint(
"right_boundary", pt.s(), pt.l());
154 for (
auto pt : left_boundary_) {
155 print_curve.
AddPoint(
"left_boundary", pt.s(), pt.l());
162 const std::vector<SLPoint>& boundary,
double s) {
163 if (s <= boundary.front().s()) {
164 return boundary.front().l();
166 if (s >= boundary.back().s()) {
167 return boundary.back().l();
169 auto iter = std::lower_bound(
170 boundary.begin(), boundary.end(), s,
171 [](
const SLPoint& sl_point,
const double s) { return sl_point.s() < s; });
172 auto last_iter = std::prev(iter);
173 double ret = last_iter->l() + (s - last_iter->s()) *
174 (iter->l() - last_iter->l()) /
175 (iter->s() - last_iter->s());
189 if (min_radius_stop_distance_ > 0) {
190 return min_radius_stop_distance_;
192 static constexpr double stop_distance_buffer = 0.4;
194 AINFO <<
"min_turn_radius: " << min_turn_radius;
196 const auto& adc_param =
197 VehicleConfigHelper::Instance()->GetConfig().vehicle_param();
198 double lateral_diff = 0.0;
199 double expand_adc_half_width =
200 adc_param.width() / 2.0 + FLAGS_nonstatic_obstacle_nudge_l_buffer;
201 min_turn_radius += expand_adc_half_width;
202 AINFO <<
"expand min_turn_radius: " << min_turn_radius;
204 lateral_diff = expand_adc_half_width - check_l + max_l_point_.
l();
206 lateral_diff = expand_adc_half_width + check_l - min_l_point_.
l();
208 lateral_diff = std::max(0.0, lateral_diff);
209 const double kEpison = 1e-5;
210 lateral_diff = std::min(lateral_diff, min_turn_radius - kEpison);
211 AINFO <<
"obs: " << id_ <<
", lateral_diff: " << lateral_diff;
212 double min_radius_stop_distance_ =
213 std::sqrt(std::fabs(min_turn_radius * min_turn_radius -
214 (min_turn_radius - lateral_diff) *
215 (min_turn_radius - lateral_diff))) +
216 stop_distance_buffer;
217 double turn_heading =
218 std::atan2(min_radius_stop_distance_, min_turn_radius - lateral_diff);
220 min_radius_stop_distance_ +=
221 adc_param.front_edge_to_center() * std::cos(turn_heading);
222 min_radius_stop_distance_ =
223 std::min(min_radius_stop_distance_, FLAGS_max_stop_distance_obstacle);
224 min_radius_stop_distance_ =
225 std::max(min_radius_stop_distance_, FLAGS_min_stop_distance_obstacle);
226 AINFO <<
"obs: " << id_
227 <<
", min_radius_stop_distance: " << min_radius_stop_distance_;
228 return min_radius_stop_distance_;