31 auto vehicle_status = vehicle_state_provider;
33 const double adc_heading = vehicle_status->heading();
38 const auto reference_line_info = std::min_element(
39 reference_line_list.begin(), reference_line_list.end(),
41 common::SLPoint adc_position_sl_a;
42 common::SLPoint adc_position_sl_b;
43 ref_a.reference_line().XYToSL(adc_position, &adc_position_sl_a);
44 ref_b.reference_line().XYToSL(adc_position, &adc_position_sl_b);
45 return std::fabs(adc_position_sl_a.l()) <
46 std::fabs(adc_position_sl_b.l());
48 reference_line_info->reference_line().XYToSL(adc_position, &adc_position_sl);
49 bool is_near_front_obstacle =
52 bool heading_align_w_reference_line =
55 ADEBUG <<
"is_near_front_obstacle: " << is_near_front_obstacle;
56 ADEBUG <<
"heading_align_w_reference_line: "
57 << heading_align_w_reference_line;
60 static constexpr double kMinSpeed = 0.1;
62 std::fabs(vehicle_status->vehicle_state().linear_velocity()) <
64 !is_near_front_obstacle && heading_align_w_reference_line &&
65 std::fabs(adc_position_sl.
l()) < 0.5);
73 const double adc_heading,
Frame* frame,
74 const double front_obstacle_buffer) {
75 const auto& vehicle_config =
76 common::VehicleConfigHelper::Instance()->GetConfig();
77 const double adc_length = vehicle_config.vehicle_param().length();
78 const double adc_width = vehicle_config.vehicle_param().width();
80 Box2d adc_box(adc_position, adc_heading, adc_length + front_obstacle_buffer,
82 double shift_distance = front_obstacle_buffer / 2 +
83 vehicle_config.vehicle_param().back_edge_to_center();
84 Vec2d shift_vec{shift_distance * std::cos(adc_heading),
85 shift_distance * std::sin(adc_heading)};
86 adc_box.
Shift(shift_vec);
87 const auto& adc_polygon =
Polygon2d(adc_box);
90 for (
const auto& obstacle : obstacles) {
91 if (obstacle->IsVirtual()) {
94 const auto& obstacle_polygon = obstacle->PerceptionPolygon();
96 std::fabs(FLAGS_static_obstacle_nudge_l_buffer));
97 if (adc_polygon.HasOverlap(nudge_polygon)) {
98 ADEBUG <<
"blocked obstacle: " << obstacle->Id();
110 const double adc_heading,
112 const double heading_diff_to_reference_line) {
113 const double kReducedHeadingBuffer = 0.2;
114 const auto& reference_line = reference_line_info.
reference_line();
116 reference_line.XYToSL(adc_position, &adc_position_sl);
118 const auto reference_point =
119 reference_line.GetReferencePoint(adc_position_sl.
s());
120 const auto path_point = reference_point.ToPathPoint(adc_position_sl.
s());
121 AINFO <<
"heading difference: "
123 double angle_difference =
125 if (angle_difference >
126 -1.0 * (heading_diff_to_reference_line - kReducedHeadingBuffer) &&
127 angle_difference < heading_diff_to_reference_line) {
bool CheckADCSurroundObstacles(const common::math::Vec2d adc_position, const double adc_heading, Frame *frame, const double front_obstacle_buffer)
: front obstacle is far enough before PardAndGo cruise stage (adc_position: center of rear wheel)
bool CheckADCHeading(const common::math::Vec2d adc_position, const double adc_heading, const ReferenceLineInfo &reference_line_info, const double heading_diff_to_reference_line)
Park_and_go: heading angle should be close to reference line before PardAndGo cruise stage