42 const std::vector<SLPoint>& boundary,
const double s) {
44 if (s <= boundary.front().s()) {
45 return boundary.front().l();
46 }
else if (s >= boundary.back().s()) {
47 return boundary.back().l();
52 auto cmp = [](
const SLPoint& sl_point,
const double s) {
53 return sl_point.
s() < s;
55 auto iter = std::lower_bound(boundary.begin(), boundary.end(), s, cmp);
56 auto last_iter = *(iter - 1);
57 return last_iter.l() + (s - last_iter.s()) * (iter->l() - last_iter.l()) /
58 (iter->s() - last_iter.s());
82 : sl_boundary_(sl_boundary), id_(id), obstacle_type_(type) {
87 double min_s = std::numeric_limits<double>::max();
88 double min_l = std::numeric_limits<double>::max();
89 double max_s = std::numeric_limits<double>::lowest();
90 double max_l = std::numeric_limits<double>::lowest();
91 for (
int i = 0; i < sl_boundary.boundary_point_size(); i++) {
93 if (sl_point.s() < min_s) {
97 if (sl_point.s() > max_s) {
101 if (sl_point.l() < min_l) {
102 min_l = sl_point.l();
105 if (sl_point.l() > max_l) {
106 max_l = sl_point.l();
120 while (t != max_s_index) {
123 right_boundary_.push_back(sl_point);
124 t = (t + 1) % sl_boundary.boundary_point_size();
128 right_boundary_.push_back(sl_point);
129 if (right_boundary_.front().s() > right_boundary_.back().s()) {
130 std::reverse(right_boundary_.begin(), right_boundary_.end());
134 while (t != min_s_index) {
137 left_boundary_.push_back(sl_point);
138 t = (t + 1) % sl_boundary.boundary_point_size();
142 left_boundary_.push_back(sl_point);
143 if (left_boundary_.front().s() > left_boundary_.back().s()) {
144 std::reverse(left_boundary_.begin(), left_boundary_.end());
152 std::swap(left_boundary_, right_boundary_);
157 for (
auto pt : right_boundary_) {
158 print_curve.
AddPoint(
"right_boundary", pt.s(), pt.l());
160 for (
auto pt : left_boundary_) {
161 print_curve.
AddPoint(
"left_boundary", pt.s(), pt.l());
168 const std::vector<SLPoint>& boundary,
double s) {
169 if (s <= boundary.front().s()) {
170 return boundary.front().l();
172 if (s >= boundary.back().s()) {
173 return boundary.back().l();
175 auto iter = std::lower_bound(
176 boundary.begin(), boundary.end(), s,
177 [](
const SLPoint& sl_point,
const double s) { return sl_point.s() < s; });
178 auto last_iter = std::prev(iter);
179 double ret = last_iter->l() + (s - last_iter->s()) *
180 (iter->l() - last_iter->l()) /
181 (iter->s() - last_iter->s());
198 double ego_half_width) {
199 if (min_radius_stop_distance_ > 0) {
200 return min_radius_stop_distance_;
202 static constexpr double stop_distance_buffer = 0.4;
204 AINFO <<
"min_turn_radius: " << min_turn_radius;
206 const auto& adc_param =
207 VehicleConfigHelper::Instance()->GetConfig().vehicle_param();
208 double lateral_diff = 0.0;
209 double expand_adc_half_width =
210 ego_half_width + FLAGS_nonstatic_obstacle_nudge_l_buffer;
211 min_turn_radius += expand_adc_half_width;
212 AINFO <<
"expand min_turn_radius: " << min_turn_radius;
215 max_l_point_.
l() - adc_min_l + FLAGS_nonstatic_obstacle_nudge_l_buffer;
218 adc_max_l + FLAGS_nonstatic_obstacle_nudge_l_buffer - min_l_point_.
l();
220 lateral_diff = std::max(0.0, lateral_diff);
221 const double kEpison = 1e-5;
222 lateral_diff = std::min(lateral_diff, min_turn_radius - kEpison);
223 AINFO <<
"obs: " << id_ <<
", lateral_diff: " << lateral_diff;
224 double min_radius_stop_distance_ =
225 std::sqrt(std::fabs(min_turn_radius * min_turn_radius -
226 (min_turn_radius - lateral_diff) *
227 (min_turn_radius - lateral_diff))) +
228 stop_distance_buffer;
229 double turn_heading =
230 std::atan2(min_radius_stop_distance_, min_turn_radius - lateral_diff);
232 min_radius_stop_distance_ +=
233 adc_param.front_edge_to_center() * std::cos(turn_heading);
234 min_radius_stop_distance_ =
235 std::min(min_radius_stop_distance_, FLAGS_max_stop_distance_obstacle);
236 min_radius_stop_distance_ =
237 std::max(min_radius_stop_distance_, FLAGS_min_stop_distance_obstacle +
238 adc_param.front_edge_to_center());
239 AINFO <<
"obs: " << id_
240 <<
", min_radius_stop_distance: " << min_radius_stop_distance_;
241 return min_radius_stop_distance_;