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
+ for (const auto & consecutive : consecutive_lanelets (route_handler, ll))
46
+ if (!contains_lanelet (consecutives, consecutive.id ())) consecutives.push_back (consecutive);
47
+ for (const auto & adjacent : routing_graph.besides (ll))
48
+ if (!contains_lanelet (adjacents, adjacent.id ())) adjacents.push_back (adjacent);
49
+ }
50
+ for (const auto & ll : adjacents) {
51
+ if (
52
+ !contains_lanelet (missing_lane_change_lanelets, ll.id ()) &&
53
+ !contains_lanelet (path_lanelets, ll.id ()) && contains_lanelet (consecutives, ll.id ()))
54
+ missing_lane_change_lanelets.push_back (ll);
55
+ }
56
+ return missing_lane_change_lanelets;
57
+ }
58
+
27
59
lanelet::ConstLanelets calculate_path_lanelets (
28
60
const EgoData & ego_data, const route_handler::RouteHandler & route_handler)
29
61
{
30
62
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 );
63
+ lanelet::ConstLanelets path_lanelets;
33
64
lanelet::BasicLineString2d path_ls;
34
65
for (const auto & p : ego_data.path .points )
35
66
path_ls.emplace_back (p.point .pose .position .x , p.point .pose .position .y );
@@ -38,6 +69,8 @@ lanelet::ConstLanelets calculate_path_lanelets(
38
69
if (!contains_lanelet (path_lanelets, dist_lanelet.second .id ()))
39
70
path_lanelets.push_back (dist_lanelet.second );
40
71
}
72
+ const auto missing_lanelets = get_missing_lane_change_lanelets (path_lanelets, route_handler);
73
+ path_lanelets.insert (path_lanelets.end (), missing_lanelets.begin (), missing_lanelets.end ());
41
74
return path_lanelets;
42
75
}
43
76
0 commit comments