24
24
25
25
namespace behavior_velocity_planner ::out_of_lane
26
26
{
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
+
27
63
lanelet::ConstLanelets calculate_path_lanelets (
28
64
const EgoData & ego_data, const route_handler::RouteHandler & route_handler)
29
65
{
30
66
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;
33
68
lanelet::BasicLineString2d path_ls;
34
69
for (const auto & p : ego_data.path .points )
35
70
path_ls.emplace_back (p.point .pose .position .x , p.point .pose .position .y );
@@ -38,6 +73,8 @@ lanelet::ConstLanelets calculate_path_lanelets(
38
73
if (!contains_lanelet (path_lanelets, dist_lanelet.second .id ()))
39
74
path_lanelets.push_back (dist_lanelet.second );
40
75
}
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 ());
41
78
return path_lanelets;
42
79
}
43
80
0 commit comments