@@ -862,61 +862,58 @@ std::vector<Junction> OpenDriveMap::get_junctions() const
862862 return get_map_values (this ->id_to_junction );
863863}
864864
865- const LaneSection* OpenDriveMap::get_adjacent_lanesection (const std::string& road_id, const double & lanesection_s0, const bool predecessor) const
865+ std::optional<LaneKey> OpenDriveMap::get_adjacent_lane (const LaneKey& lane, int adjacent_lane_id, bool predecessor) const
866866{
867- const Road& road = this ->id_to_road .at (road_id);
868- const auto s_lanesec_iter = road.s_to_lanesection .find (lanesection_s0);
867+ const auto id_road_iter = this ->id_to_road .find (lane.road_id );
868+ if (id_road_iter == this ->id_to_road .end ())
869+ return std::nullopt ;
870+
871+ const Road& road = id_road_iter->second ;
872+ const auto s_lanesec_iter = road.s_to_lanesection .find (lane.lanesection_s0 );
869873 if (s_lanesec_iter == road.s_to_lanesection .end ()) // also catches empty road
870- return nullptr ;
874+ return std:: nullopt ;
871875
876+ // adjacent lanesection in the same road
872877 if (predecessor)
873878 {
874879 if (s_lanesec_iter != road.s_to_lanesection .begin ())
875- return &(std::prev (s_lanesec_iter)->second );
880+ {
881+ const LaneSection& prev_lanesec = std::prev (s_lanesec_iter)->second ;
882+ if (prev_lanesec.id_to_lane .find (adjacent_lane_id) != prev_lanesec.id_to_lane .end ())
883+ return LaneKey (lane.road_id , prev_lanesec.s0 , adjacent_lane_id);
884+ }
876885 }
877886 else
878887 {
879888 const auto next_lanesec_iter = std::next (s_lanesec_iter);
880889 if (next_lanesec_iter != road.s_to_lanesection .end ())
881- return &(next_lanesec_iter->second );
890+ {
891+ const LaneSection& next_lanesec = next_lanesec_iter->second ;
892+ if (next_lanesec.id_to_lane .find (adjacent_lane_id) != next_lanesec.id_to_lane .end ())
893+ return LaneKey (lane.road_id , next_lanesec.s0 , adjacent_lane_id);
894+ }
882895 }
883896
884- // adjacent lanesection not in the same road
897+ // adjacent lanesection NOT in the same road
885898 const RoadLink& road_link = predecessor ? road.predecessor : road.successor ;
886899 if (road_link.type == RoadLink::Type::Road && road_link.contact_point != RoadLink::ContactPoint::None)
887900 {
888901 const auto next_road_iter = this ->id_to_road .find (road_link.id );
889902 if (next_road_iter == this ->id_to_road .end ())
890- return nullptr ;
903+ return std:: nullopt ;
891904
892905 const Road& next_road = next_road_iter->second ;
893906 if (next_road.s_to_lanesection .empty ())
894- return nullptr ;
907+ return std:: nullopt ;
895908
896909 const LaneSection& adjacent_lanesection = (road_link.contact_point == RoadLink::ContactPoint::Start)
897910 ? next_road.s_to_lanesection .begin ()->second
898911 : next_road.s_to_lanesection .rbegin ()->second ;
899- return &adjacent_lanesection;
900- }
901-
902- return nullptr ;
903- }
904-
905- const Lane* OpenDriveMap::get_adjacent_lane (const Lane& lane, const bool predecessor) const
906- {
907- const LaneSection* adjacent_lanesec = this ->get_adjacent_lanesection (lane.key .road_id , lane.key .lanesection_s0 , predecessor);
908- if (!adjacent_lanesec)
909- return nullptr ;
910-
911- const std::optional<int > adjacent_lane_id = predecessor ? lane.predecessor : lane.successor ;
912- if (adjacent_lane_id)
913- {
914- const auto adjacent_lane_iter = adjacent_lanesec->id_to_lane .find (adjacent_lane_id.value ());
915- if (adjacent_lane_iter != adjacent_lanesec->id_to_lane .end ())
916- return &(adjacent_lane_iter->second );
912+ if (adjacent_lanesection.id_to_lane .find (adjacent_lane_id) != adjacent_lanesection.id_to_lane .end ())
913+ return LaneKey (next_road.id , adjacent_lanesection.s0 , adjacent_lane_id);
917914 }
918915
919- return nullptr ;
916+ return std:: nullopt ;
920917}
921918
922919RoadNetworkMesh OpenDriveMap::get_road_network_mesh (const double eps) const
@@ -983,27 +980,34 @@ RoutingGraph OpenDriveMap::get_routing_graph() const
983980 RoutingGraph routing_graph;
984981
985982 // Parse Roads
986- for (const auto & [_ , road] : id_to_road)
983+ for (const auto & [road_id , road] : id_to_road)
987984 {
988- for (const auto & [_ , lanesection] : road.s_to_lanesection )
985+ for (const auto & [lanesection_s0 , lanesection] : road.s_to_lanesection )
989986 {
990- for (const auto & [_ , lane] : lanesection.id_to_lane )
987+ for (const auto & [lane_id , lane] : lanesection.id_to_lane )
991988 {
992- const bool lane_follows_road_direction = lane.key .lane_id < 0 ;
989+ const LaneKey lane_key (road_id, lanesection_s0, lane_id);
990+ const bool lane_follows_road_dir = lane_id < 0 ;
993991
994- const Lane* predecessor_lane = this ->get_adjacent_lane (lane, lane_follows_road_direction);
995- if (predecessor_lane)
992+ if (lane.predecessor )
996993 {
997- const Road& predecessor_road = this ->id_to_road .at (predecessor_lane->key .road_id );
998- const double lane_length = predecessor_road.get_lanesection_length (predecessor_lane->key .lanesection_s0 );
999- routing_graph.add_edge (RoutingGraphEdge (predecessor_lane->key , lane.key , lane_length));
994+ const std::optional<LaneKey> predecessor_lane = this ->get_adjacent_lane (lane_key, *(lane.predecessor ), lane_follows_road_dir);
995+ if (predecessor_lane)
996+ {
997+ const Road& predecessor_road = this ->id_to_road .at (predecessor_lane->road_id );
998+ const double lane_length = predecessor_road.get_lanesection_length (predecessor_lane->lanesection_s0 );
999+ routing_graph.add_edge (RoutingGraphEdge (*predecessor_lane, lane_key, lane_length));
1000+ }
10001001 }
10011002
1002- const Lane* successor_lane = this ->get_adjacent_lane (lane, !lane_follows_road_direction);
1003- if (successor_lane)
1003+ if (lane.successor )
10041004 {
1005- const double lane_length = road.get_lanesection_length (lane.key .lanesection_s0 );
1006- routing_graph.add_edge (RoutingGraphEdge (lane.key , successor_lane->key , lane_length));
1005+ const std::optional<LaneKey> successor_lane = this ->get_adjacent_lane (lane_key, *(lane.successor ), !lane_follows_road_dir);
1006+ if (successor_lane)
1007+ {
1008+ const double lane_length = road.get_lanesection_length (lane_key.lanesection_s0 );
1009+ routing_graph.add_edge (RoutingGraphEdge (lane_key, *successor_lane, lane_length));
1010+ }
10071011 }
10081012 }
10091013 }
0 commit comments