Skip to content

Commit 2e4164c

Browse files
fix(lane_change): skip generating path if lane changing path is too long (autowarefoundation#8362)
rework. skip lane changing for insufficeient distance in target lane Signed-off-by: Muhammad Zulfaqar Azmi <zulfaqar.azmi@tier4.jp> Signed-off-by: Zulfaqar Azmi <zulfaqar.azmi@tier4.jp>
1 parent a1d4bfe commit 2e4164c

File tree

4 files changed

+30
-44
lines changed

4 files changed

+30
-44
lines changed

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/data_structs.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ struct Lanes
191191
{
192192
bool current_lane_in_goal_section{false};
193193
lanelet::ConstLanelets current;
194+
lanelet::ConstLanelets target_neighbor;
194195
lanelet::ConstLanelets target;
195196
std::vector<lanelet::ConstLanelets> preceding_target;
196197
};

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/utils.hpp

-4
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,6 @@ lanelet::ConstLanelets getTargetNeighborLanes(
106106
const RouteHandler & route_handler, const lanelet::ConstLanelets & target_lanes,
107107
const LaneChangeModuleType & type);
108108

109-
lanelet::BasicPolygon2d getTargetNeighborLanesPolygon(
110-
const RouteHandler & route_handler, const lanelet::ConstLanelets & current_lanes,
111-
const LaneChangeModuleType & type);
112-
113109
bool isPathInLanelets(
114110
const PathWithLaneId & path, const lanelet::ConstLanelets & current_lanes,
115111
const lanelet::ConstLanelets & target_lanes);

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp

+27-22
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ void NormalLaneChange::update_lanes(const bool is_approved)
8787
common_data_ptr_->lanes_ptr->target = target_lanes;
8888

8989
const auto & route_handler_ptr = common_data_ptr_->route_handler_ptr;
90+
common_data_ptr_->lanes_ptr->target_neighbor = utils::lane_change::getTargetNeighborLanes(
91+
*route_handler_ptr, current_lanes, common_data_ptr_->lc_type);
92+
9093
common_data_ptr_->lanes_ptr->current_lane_in_goal_section =
9194
route_handler_ptr->isInGoalRouteSection(current_lanes.back());
9295
common_data_ptr_->lanes_ptr->preceding_target = utils::getPrecedingLanelets(
@@ -1464,6 +1467,9 @@ bool NormalLaneChange::getLaneChangePaths(
14641467
RCLCPP_DEBUG(logger_, " - sampling num for lat_acc: %lu", sample_lat_acc.size());
14651468

14661469
debug_print("Prepare path satisfy constraints");
1470+
const auto dist_lc_start_to_end_of_lanes = calculation::calc_dist_from_pose_to_terminal_end(
1471+
common_data_ptr_, common_data_ptr_->lanes_ptr->target_neighbor, lane_changing_start_pose);
1472+
14671473
for (const auto & lateral_acc : sample_lat_acc) {
14681474
const auto lane_changing_time = PathShifter::calcShiftTimeFromJerk(
14691475
shift_length, lane_change_parameters_->lane_changing_lateral_jerk, lateral_acc);
@@ -1474,11 +1480,6 @@ bool NormalLaneChange::getLaneChangePaths(
14741480
const auto lane_changing_length = utils::lane_change::calcPhaseLength(
14751481
initial_lane_changing_velocity, getCommonParam().max_vel,
14761482
longitudinal_acc_on_lane_changing, lane_changing_time);
1477-
const auto terminal_lane_changing_velocity = std::min(
1478-
initial_lane_changing_velocity + longitudinal_acc_on_lane_changing * lane_changing_time,
1479-
getCommonParam().max_vel);
1480-
utils::lane_change::setPrepareVelocity(
1481-
prepare_segment, current_velocity, terminal_lane_changing_velocity);
14821483

14831484
const auto debug_print_lat = [&](const auto & s) {
14841485
RCLCPP_DEBUG(
@@ -1493,26 +1494,30 @@ bool NormalLaneChange::getLaneChangePaths(
14931494
continue;
14941495
}
14951496

1496-
if (is_goal_in_route) {
1497-
const double s_start =
1498-
lanelet::utils::getArcCoordinates(target_lanes, lane_changing_start_pose).length;
1499-
const double s_goal =
1500-
lanelet::utils::getArcCoordinates(target_lanes, route_handler.getGoalPose()).length;
1501-
const auto num =
1497+
// if multiple lane change is necessary, does the remaining distance is sufficient
1498+
const auto remaining_dist_in_target = std::invoke([&]() {
1499+
const auto finish_judge_buffer = lane_change_parameters_->lane_change_finish_judge_buffer;
1500+
const auto num_to_preferred_lane_from_target_lane =
15021501
std::abs(route_handler.getNumLaneToPreferredLane(target_lanes.back(), direction));
1503-
const double backward_buffer =
1504-
num == 0 ? 0.0 : lane_change_parameters_->backward_length_buffer_for_end_of_lane;
1505-
const double finish_judge_buffer =
1506-
lane_change_parameters_->lane_change_finish_judge_buffer;
1507-
if (
1508-
s_start + lane_changing_length + finish_judge_buffer + backward_buffer +
1509-
next_lane_change_buffer >
1510-
s_goal) {
1511-
debug_print_lat("Reject: length of lane changing path is longer than length to goal!!");
1512-
continue;
1513-
}
1502+
const auto backward_len_buffer =
1503+
lane_change_parameters_->backward_length_buffer_for_end_of_lane;
1504+
const auto backward_buffer_to_target_lane =
1505+
num_to_preferred_lane_from_target_lane == 0 ? 0.0 : backward_len_buffer;
1506+
return lane_changing_length + finish_judge_buffer + backward_buffer_to_target_lane +
1507+
next_lane_change_buffer;
1508+
});
1509+
1510+
if (remaining_dist_in_target > dist_lc_start_to_end_of_lanes) {
1511+
debug_print_lat("Reject: length of lane changing path is longer than length to goal!!");
1512+
continue;
15141513
}
15151514

1515+
const auto terminal_lane_changing_velocity = std::min(
1516+
initial_lane_changing_velocity + longitudinal_acc_on_lane_changing * lane_changing_time,
1517+
getCommonParam().max_vel);
1518+
utils::lane_change::setPrepareVelocity(
1519+
prepare_segment, current_velocity, terminal_lane_changing_velocity);
1520+
15161521
const auto target_segment = getTargetSegment(
15171522
target_lanes, lane_changing_start_pose, target_lane_length, lane_changing_length,
15181523
initial_lane_changing_velocity, next_lane_change_buffer);

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/utils.cpp

+2-18
Original file line numberDiff line numberDiff line change
@@ -290,21 +290,6 @@ lanelet::ConstLanelets getTargetNeighborLanes(
290290
return neighbor_lanes;
291291
}
292292

293-
lanelet::BasicPolygon2d getTargetNeighborLanesPolygon(
294-
const RouteHandler & route_handler, const lanelet::ConstLanelets & current_lanes,
295-
const LaneChangeModuleType & type)
296-
{
297-
const auto target_neighbor_lanelets =
298-
utils::lane_change::getTargetNeighborLanes(route_handler, current_lanes, type);
299-
if (target_neighbor_lanelets.empty()) {
300-
return {};
301-
}
302-
const auto target_neighbor_preferred_lane_poly = lanelet::utils::getPolygonFromArcLength(
303-
target_neighbor_lanelets, 0, std::numeric_limits<double>::max());
304-
305-
return lanelet::utils::to2D(target_neighbor_preferred_lane_poly).basicPolygon();
306-
}
307-
308293
bool isPathInLanelets(
309294
const PathWithLaneId & path, const lanelet::ConstLanelets & current_lanes,
310295
const lanelet::ConstLanelets & target_lanes)
@@ -1227,9 +1212,8 @@ LanesPolygon create_lanes_polygon(const CommonDataPtr & common_data_ptr)
12271212
lanes_polygon.expanded_target = utils::lane_change::createPolygon(
12281213
expanded_target_lanes, 0.0, std::numeric_limits<double>::max());
12291214

1230-
const auto & route_handler = *common_data_ptr->route_handler_ptr;
1231-
lanes_polygon.target_neighbor =
1232-
getTargetNeighborLanesPolygon(route_handler, lanes->current, common_data_ptr->lc_type);
1215+
lanes_polygon.target_neighbor = *utils::lane_change::createPolygon(
1216+
lanes->target_neighbor, 0.0, std::numeric_limits<double>::max());
12331217

12341218
lanes_polygon.preceding_target.reserve(lanes->preceding_target.size());
12351219
for (const auto & preceding_lane : lanes->preceding_target) {

0 commit comments

Comments
 (0)