23
23
24
24
namespace behavior_velocity_planner ::out_of_lane
25
25
{
26
+
27
+ lanelet::ConstLanelets consecutive_lanelets (
28
+ const route_handler::RouteHandler & route_handler, const lanelet::ConstLanelet & lanelet)
29
+ {
30
+ lanelet::ConstLanelets consecutives = route_handler.getRoutingGraphPtr ()->following (lanelet);
31
+ const auto previous = route_handler.getRoutingGraphPtr ()->previous (lanelet);
32
+ consecutives.insert (consecutives.end (), previous.begin (), previous.end ());
33
+ return consecutives;
34
+ }
35
+
36
+ lanelet::ConstLanelets get_missing_lane_change_lanelets (
37
+ lanelet::ConstLanelets & path_lanelets, const route_handler::RouteHandler & route_handler)
38
+ {
39
+ lanelet::ConstLanelets missing_lane_change_lanelets;
40
+ const auto & routing_graph = *route_handler.getRoutingGraphPtr ();
41
+ lanelet::ConstLanelets adjacents;
42
+ lanelet::ConstLanelets consecutives;
43
+ for (const auto & ll : path_lanelets) {
44
+ const auto consecutives_of_ll = consecutive_lanelets (route_handler, ll);
45
+ std::copy_if (
46
+ consecutives_of_ll.begin (), consecutives_of_ll.end (), std::back_inserter (consecutives),
47
+ [&](const auto & l) { return !contains_lanelet (consecutives, l.id ()); });
48
+ const auto adjacents_of_ll = routing_graph.besides (ll);
49
+ std::copy_if (
50
+ adjacents_of_ll.begin (), adjacents_of_ll.end (), std::back_inserter (adjacents),
51
+ [&](const auto & l) { return !contains_lanelet (adjacents, l.id ()); });
52
+ }
53
+ std::copy_if (
54
+ adjacents.begin (), adjacents.end (), std::back_inserter (missing_lane_change_lanelets),
55
+ [&](const auto & l) {
56
+ return !contains_lanelet (missing_lane_change_lanelets, l.id ()) &&
57
+ !contains_lanelet (path_lanelets, l.id ()) && contains_lanelet (consecutives, l.id ());
58
+ });
59
+ return missing_lane_change_lanelets;
60
+ }
61
+
26
62
lanelet::ConstLanelets calculate_path_lanelets (
27
63
const EgoData & ego_data, const route_handler::RouteHandler & route_handler)
28
64
{
29
65
const auto lanelet_map_ptr = route_handler.getLaneletMapPtr ();
30
- lanelet::ConstLanelets path_lanelets =
31
- planning_utils::getLaneletsOnPath (ego_data.path , lanelet_map_ptr, ego_data.pose );
66
+ lanelet::ConstLanelets path_lanelets;
32
67
lanelet::BasicLineString2d path_ls;
33
68
for (const auto & p : ego_data.path .points )
34
69
path_ls.emplace_back (p.point .pose .position .x , p.point .pose .position .y );
@@ -37,6 +72,8 @@ lanelet::ConstLanelets calculate_path_lanelets(
37
72
if (!contains_lanelet (path_lanelets, dist_lanelet.second .id ()))
38
73
path_lanelets.push_back (dist_lanelet.second );
39
74
}
75
+ const auto missing_lanelets = get_missing_lane_change_lanelets (path_lanelets, route_handler);
76
+ path_lanelets.insert (path_lanelets.end (), missing_lanelets.begin (), missing_lanelets.end ());
40
77
return path_lanelets;
41
78
}
42
79
0 commit comments