Skip to content

Commit a3ee6f4

Browse files
committed
fix(out_of_lane): calculate path lanelets that we can miss during a lane change (autowarefoundation#6600)
Signed-off-by: Maxime CLEMENT <maxime.clement@tier4.jp>
1 parent c01980c commit a3ee6f4

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

planning/behavior_velocity_out_of_lane_module/src/lanelets_selection.cpp

+39-2
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,47 @@
2424

2525
namespace behavior_velocity_planner::out_of_lane
2626
{
27+
28+
lanelet::ConstLanelets consecutive_lanelets(
29+
const route_handler::RouteHandler & route_handler, const lanelet::ConstLanelet & lanelet)
30+
{
31+
lanelet::ConstLanelets consecutives = route_handler.getRoutingGraphPtr()->following(lanelet);
32+
const auto previous = route_handler.getRoutingGraphPtr()->previous(lanelet);
33+
consecutives.insert(consecutives.end(), previous.begin(), previous.end());
34+
return consecutives;
35+
}
36+
37+
lanelet::ConstLanelets get_missing_lane_change_lanelets(
38+
lanelet::ConstLanelets & path_lanelets, const route_handler::RouteHandler & route_handler)
39+
{
40+
lanelet::ConstLanelets missing_lane_change_lanelets;
41+
const auto & routing_graph = *route_handler.getRoutingGraphPtr();
42+
lanelet::ConstLanelets adjacents;
43+
lanelet::ConstLanelets consecutives;
44+
for (const auto & ll : path_lanelets) {
45+
const auto consecutives_of_ll = consecutive_lanelets(route_handler, ll);
46+
std::copy_if(
47+
consecutives_of_ll.begin(), consecutives_of_ll.end(), std::back_inserter(consecutives),
48+
[&](const auto & l) { return !contains_lanelet(consecutives, l.id()); });
49+
const auto adjacents_of_ll = routing_graph.besides(ll);
50+
std::copy_if(
51+
adjacents_of_ll.begin(), adjacents_of_ll.end(), std::back_inserter(adjacents),
52+
[&](const auto & l) { return !contains_lanelet(adjacents, l.id()); });
53+
}
54+
std::copy_if(
55+
adjacents.begin(), adjacents.end(), std::back_inserter(missing_lane_change_lanelets),
56+
[&](const auto & l) {
57+
return !contains_lanelet(missing_lane_change_lanelets, l.id()) &&
58+
!contains_lanelet(path_lanelets, l.id()) && contains_lanelet(consecutives, l.id());
59+
});
60+
return missing_lane_change_lanelets;
61+
}
62+
2763
lanelet::ConstLanelets calculate_path_lanelets(
2864
const EgoData & ego_data, const route_handler::RouteHandler & route_handler)
2965
{
3066
const auto lanelet_map_ptr = route_handler.getLaneletMapPtr();
31-
lanelet::ConstLanelets path_lanelets =
32-
planning_utils::getLaneletsOnPath(ego_data.path, lanelet_map_ptr, ego_data.pose);
67+
lanelet::ConstLanelets path_lanelets;
3368
lanelet::BasicLineString2d path_ls;
3469
for (const auto & p : ego_data.path.points)
3570
path_ls.emplace_back(p.point.pose.position.x, p.point.pose.position.y);
@@ -38,6 +73,8 @@ lanelet::ConstLanelets calculate_path_lanelets(
3873
if (!contains_lanelet(path_lanelets, dist_lanelet.second.id()))
3974
path_lanelets.push_back(dist_lanelet.second);
4075
}
76+
const auto missing_lanelets = get_missing_lane_change_lanelets(path_lanelets, route_handler);
77+
path_lanelets.insert(path_lanelets.end(), missing_lanelets.begin(), missing_lanelets.end());
4178
return path_lanelets;
4279
}
4380

planning/behavior_velocity_out_of_lane_module/src/lanelets_selection.hpp

+7
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ inline bool contains_lanelet(const lanelet::ConstLanelets & lanelets, const lane
4141
/// @return lanelets crossed by the ego vehicle
4242
lanelet::ConstLanelets calculate_path_lanelets(
4343
const EgoData & ego_data, const route_handler::RouteHandler & route_handler);
44+
/// @brief calculate lanelets that may not be crossed by the path but may be overlapped during a
45+
/// lane change
46+
/// @param [in] path_lanelets lanelets driven by the ego vehicle
47+
/// @param [in] route_handler route handler
48+
/// @return lanelets that may be overlapped by a lane change (and are not already in path_lanelets)
49+
lanelet::ConstLanelets get_missing_lane_change_lanelets(
50+
lanelet::ConstLanelets & path_lanelets, const route_handler::RouteHandler & route_handler);
4451
/// @brief calculate lanelets that should be ignored
4552
/// @param [in] ego_data data about the ego vehicle
4653
/// @param [in] path_lanelets lanelets driven by the ego vehicle

0 commit comments

Comments
 (0)