Skip to content

Commit 76b2fbd

Browse files
committed
fix(goal_planner): failed to generate candidate paths when entering another lane for avoidance (autowarefoundation#11560)
Signed-off-by: kosuke55 <kosuke.tnp@gmail.com>
1 parent 1627fcc commit 76b2fbd

File tree

5 files changed

+83
-25
lines changed

5 files changed

+83
-25
lines changed

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/include/autoware/behavior_path_goal_planner_module/util.hpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,9 +318,26 @@ std::optional<lanelet::ConstLanelet> find_last_lane_change_completed_lanelet(
318318
const lanelet::routing::RoutingGraphConstPtr routing_graph);
319319

320320
/**
321-
* @brief generate lanelets with which pull over path is aligned
322-
* @note if lane changing path is detected, this returns lanelets aligned with later part of the
323-
* lane changing path
321+
* @brief Get reference road lane sequence that covers both the path length and goal search range
322+
*
323+
* @param path The path with lane IDs from upstream module
324+
* @param planner_data Shared pointer to planner data containing route handler and parameters
325+
* @param backward_length Distance to extend backward from lane_change_complete_lane
326+
* Expected: backward_path_length + backward_goal_search_length
327+
* - Covers both path length and goal search range backward
328+
* - Sum is used because which is longer is unknown
329+
* - Backward lanes are necessary for path generation
330+
* @param forward_length Distance to extend forward from goal_lane
331+
* Expected: forward_goal_search_length
332+
* - Covers goal search range beyond the path length forward
333+
*
334+
* @return Continuous lanelet sequence from (lane_change_complete_lane - backward_length) to
335+
* (goal_lane + forward_length) if goal_lane is reachable from lane_change_complete_lane.
336+
* Otherwise, returns sequence from (lane_change_complete_lane - backward_length) to
337+
* the end of lane_change_complete_lane's sequence (until loop or no next lane).
338+
*
339+
* @note If lane changing path is detected, this returns lanelets aligned with the later part
340+
* of the lane changing path (lane_change_complete_lane)
324341
*/
325342
lanelet::ConstLanelets get_reference_lanelets_for_pullover(
326343
const PathWithLaneId & path, const std::shared_ptr<const PlannerData> & planner_data,

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/bezier_pull_over.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ std::optional<PullOverPath> BezierPullOver::plan(
4848
[[maybe_unused]] const BehaviorModuleOutput & upstream_module_output)
4949
{
5050
const auto & route_handler = planner_data->route_handler;
51+
const double backward_path_length = planner_data->parameters.backward_path_length;
5152
const double min_jerk = parameters_.minimum_lateral_jerk;
5253
const double max_jerk = parameters_.maximum_lateral_jerk;
5354
const double backward_search_length = parameters_.backward_goal_search_length;
@@ -57,7 +58,8 @@ std::optional<PullOverPath> BezierPullOver::plan(
5758
std::abs(max_jerk - min_jerk) / shift_sampling_num;
5859

5960
const auto road_lanes = goal_planner_utils::get_reference_lanelets_for_pullover(
60-
upstream_module_output.path, planner_data, backward_search_length, forward_search_length);
61+
upstream_module_output.path, planner_data, backward_path_length + backward_search_length,
62+
forward_search_length);
6163

6264
const auto pull_over_lanes = goal_planner_utils::getPullOverLanes(
6365
*route_handler, left_side_parking_, backward_search_length, forward_search_length);
@@ -92,10 +94,11 @@ std::vector<PullOverPath> BezierPullOver::plans(
9294
const int shift_sampling_num = parameters_.shift_sampling_num;
9395
[[maybe_unused]] const double jerk_resolution =
9496
std::abs(max_jerk - min_jerk) / shift_sampling_num;
97+
const double backward_path_length = planner_data->parameters.backward_path_length;
9598

96-
const auto road_lanes = utils::getExtendedCurrentLanesFromPath(
97-
upstream_module_output.path, planner_data, backward_search_length, forward_search_length,
98-
/*forward_only_in_route*/ false);
99+
const auto road_lanes = goal_planner_utils::get_reference_lanelets_for_pullover(
100+
upstream_module_output.path, planner_data, backward_search_length + backward_path_length,
101+
forward_search_length);
99102

100103
const auto pull_over_lanes = goal_planner_utils::getPullOverLanes(
101104
*route_handler, left_side_parking_, backward_search_length, forward_search_length);

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/geometric_pull_over.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,13 @@ std::optional<PullOverPath> GeometricPullOver::plan(
4848
[[maybe_unused]] const BehaviorModuleOutput & upstream_module_output)
4949
{
5050
const auto & route_handler = planner_data->route_handler;
51+
const double backward_path_length = planner_data->parameters.backward_path_length;
5152

5253
const auto & goal_pose = modified_goal_pose.goal_pose;
5354
// prepare road nad shoulder lanes
5455
const auto road_lanes = goal_planner_utils::get_reference_lanelets_for_pullover(
55-
upstream_module_output.path, planner_data, parameters_.backward_goal_search_length,
56+
upstream_module_output.path, planner_data,
57+
backward_path_length + parameters_.backward_goal_search_length,
5658
parameters_.forward_goal_search_length);
5759
const auto pull_over_lanes = goal_planner_utils::getPullOverLanes(
5860
*route_handler, left_side_parking_, parameters_.backward_goal_search_length,

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/pull_over_planner/shift_pull_over.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ std::optional<PullOverPath> ShiftPullOver::plan(
4747
const BehaviorModuleOutput & upstream_module_output)
4848
{
4949
const auto & route_handler = planner_data->route_handler;
50+
const double backward_path_length = planner_data->parameters.backward_path_length;
5051
const double min_jerk = parameters_.minimum_lateral_jerk;
5152
const double max_jerk = parameters_.maximum_lateral_jerk;
5253
const double backward_search_length = parameters_.backward_goal_search_length;
@@ -55,7 +56,8 @@ std::optional<PullOverPath> ShiftPullOver::plan(
5556
const double jerk_resolution = std::abs(max_jerk - min_jerk) / shift_sampling_num;
5657

5758
const auto road_lanes = goal_planner_utils::get_reference_lanelets_for_pullover(
58-
upstream_module_output.path, planner_data, backward_search_length, forward_search_length);
59+
upstream_module_output.path, planner_data, backward_path_length + backward_search_length,
60+
forward_search_length);
5961

6062
const auto pull_over_lanes = goal_planner_utils::getPullOverLanes(
6163
*route_handler, left_side_parking_, backward_search_length, forward_search_length);

planning/behavior_path_planner/autoware_behavior_path_goal_planner_module/src/util.cpp

Lines changed: 50 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,36 +1142,70 @@ lanelet::ConstLanelets get_reference_lanelets_for_pullover(
11421142
{
11431143
const auto & routing_graph = planner_data->route_handler->getRoutingGraphPtr();
11441144
const auto & lanelet_map = planner_data->route_handler->getLaneletMapPtr();
1145+
const auto & route_handler = planner_data->route_handler;
1146+
1147+
const auto goal_lane_id = planner_data->route_handler->getGoalLaneId();
1148+
11451149
const auto lane_change_complete_lane =
11461150
find_last_lane_change_completed_lanelet(path, lanelet_map, routing_graph);
1151+
11471152
if (!lane_change_complete_lane) {
11481153
return utils::getExtendedCurrentLanesFromPath(
11491154
path, planner_data, backward_length, forward_length,
11501155
/*forward_only_in_route*/ false);
11511156
}
1152-
auto route_lanes = planner_data->route_handler->getLaneletSequence(
1153-
*lane_change_complete_lane, backward_length, forward_length);
1154-
const double remaining_distance =
1155-
forward_length + backward_length - lanelet::utils::getLaneletLength3d(route_lanes);
1156-
if (route_lanes.empty() || remaining_distance <= 0.0) {
1157-
return route_lanes;
1157+
1158+
const auto extend_forward = [&](
1159+
const lanelet::ConstLanelet & start_lane, const double distance,
1160+
lanelet::ConstLanelets & result) {
1161+
double acc_dist = 0.0;
1162+
auto current_lane = start_lane;
1163+
while (acc_dist < distance) {
1164+
const auto nexts = routing_graph->following(current_lane);
1165+
if (nexts.empty()) {
1166+
break;
1167+
}
1168+
current_lane = nexts.front();
1169+
if (lanelet::utils::contains(result, current_lane)) {
1170+
// loop detected
1171+
break;
1172+
}
1173+
result.push_back(current_lane);
1174+
acc_dist += lanelet::utils::getLaneletLength3d(current_lane);
1175+
}
1176+
};
1177+
1178+
lanelet::ConstLanelets route_lanes;
1179+
1180+
// Add backward lanes from lane_change_complete_lane
1181+
const auto backward_lanes = route_handler->getPrecedingLaneletSequence(
1182+
*lane_change_complete_lane, backward_length, {*lane_change_complete_lane});
1183+
for (auto it = backward_lanes.rbegin(); it != backward_lanes.rend(); ++it) {
1184+
route_lanes.insert(route_lanes.end(), it->begin(), it->end());
11581185
}
1159-
double acc_dist = 0.0;
1160-
auto last_lanelet = route_lanes.back();
1161-
while (acc_dist < remaining_distance) {
1162-
const auto nexts = routing_graph->following(last_lanelet);
1186+
1187+
route_lanes.push_back(*lane_change_complete_lane);
1188+
1189+
// Extend forward from lane_change_complete_lane
1190+
auto current_lane = *lane_change_complete_lane;
1191+
while (true) {
1192+
const auto nexts = routing_graph->following(current_lane);
11631193
if (nexts.empty()) {
11641194
break;
11651195
}
1166-
const auto & next = nexts.front();
1167-
if (lanelet::utils::contains(route_lanes, next)) {
1168-
// loop
1196+
current_lane = nexts.front();
1197+
if (lanelet::utils::contains(route_lanes, current_lane)) {
1198+
// loop detected
1199+
break;
1200+
}
1201+
route_lanes.push_back(current_lane);
1202+
1203+
if (current_lane.id() == goal_lane_id) {
1204+
extend_forward(current_lane, forward_length, route_lanes);
11691205
break;
11701206
}
1171-
last_lanelet = next;
1172-
route_lanes.push_back(next);
1173-
acc_dist += lanelet::utils::getLaneletLength3d(next);
11741207
}
1208+
11751209
return route_lanes;
11761210
}
11771211
} // namespace autoware::behavior_path_planner::goal_planner_utils

0 commit comments

Comments
 (0)