diff --git a/modules/planning/proto/planning_status.proto b/modules/planning/proto/planning_status.proto index 56bf5ef75f8a624cba92a980f9837133b3d27371..9265a38cece0faa304050b7903be2a297f96865a 100644 --- a/modules/planning/proto/planning_status.proto +++ b/modules/planning/proto/planning_status.proto @@ -38,6 +38,9 @@ message ChangeLaneStatus { // if the current path and speed planning on the lane-change // reference-line succeed. optional bool is_current_opt_succeed = 7 [default = false]; + // denotes if the surrounding area is clear for ego vehicle to + // change lane at this moment. + optional bool is_clear_to_change_lane = 8 [default = false]; } message StopTime { diff --git a/modules/planning/tasks/deciders/lane_change_decider/lane_change_decider.cc b/modules/planning/tasks/deciders/lane_change_decider/lane_change_decider.cc index 2c313c5716aebc6b76bbbde3bec988b9478f10a8..1b34c92a26ce1da2567fe57436f768d3f23c8c6b 100644 --- a/modules/planning/tasks/deciders/lane_change_decider/lane_change_decider.cc +++ b/modules/planning/tasks/deciders/lane_change_decider/lane_change_decider.cc @@ -57,6 +57,12 @@ Status LaneChangeDecider::Process( ->mutable_change_lane(); double now = Clock::NowInSeconds(); + prev_status->set_is_clear_to_change_lane(false); + if (current_reference_line_info->IsChangeLanePath()) { + prev_status->set_is_clear_to_change_lane( + IsClearToChangeLane(current_reference_line_info)); + } + if (!prev_status->has_status()) { UpdateStatus(now, ChangeLaneStatus::CHANGE_LANE_FINISHED, GetCurrentPathId(*reference_line_info)); diff --git a/modules/planning/tasks/deciders/path_bounds_decider/path_bounds_decider.cc b/modules/planning/tasks/deciders/path_bounds_decider/path_bounds_decider.cc index 7f96a65d7901573c4fda1a0f49316704629b884e..229c4f2c09265c649308b643fd2a3e60a26452d5 100644 --- a/modules/planning/tasks/deciders/path_bounds_decider/path_bounds_decider.cc +++ b/modules/planning/tasks/deciders/path_bounds_decider/path_bounds_decider.cc @@ -1185,6 +1185,11 @@ void PathBoundsDecider::GetBoundaryFromLaneChangeForbiddenZone( auto* lane_change_status = PlanningContext::Instance() ->mutable_planning_status() ->mutable_change_lane(); + if (lane_change_status->is_clear_to_change_lane()) { + ADEBUG << "Current position is clear to change lane. No need prep s."; + lane_change_status->set_exist_lane_change_start_position(false); + return; + } double lane_change_start_s = 0.0; if (lane_change_status->exist_lane_change_start_position()) { common::SLPoint point_sl;