Skip to content

Commit eaf7e2e

Browse files
committed
refactor: use LaneKey instead of Lane reference in OpenDriveMap::get_adjacent_lane; remove get_adjacent_lanesection
1 parent 5448477 commit eaf7e2e

File tree

2 files changed

+48
-43
lines changed

2 files changed

+48
-43
lines changed

include/OpenDriveMap.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
#pragma once
22
#include "Junction.h"
3+
#include "Lane.h"
34
#include "Road.h"
45
#include "RoadNetworkMesh.h"
56
#include "RoutingGraph.h"
67

78
#include "pugixml.hpp"
89

910
#include <map>
11+
#include <optional>
1012
#include <string>
1113
#include <vector>
1214

@@ -30,8 +32,7 @@ class OpenDriveMap
3032
Junction get_junction(const std::string& id) const;
3133
std::vector<Junction> get_junctions() const;
3234

33-
const LaneSection* get_adjacent_lanesection(const std::string& road_id, const double& lanesection_s0, const bool predecessor) const;
34-
const Lane* get_adjacent_lane(const Lane& lane, const bool predecessor) const;
35+
std::optional<LaneKey> get_adjacent_lane(const LaneKey& lane, int adjacent_lane_id, bool predecessor) const;
3536

3637
RoadNetworkMesh get_road_network_mesh(const double eps) const;
3738
RoutingGraph get_routing_graph() const;

src/OpenDriveMap.cpp

Lines changed: 45 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -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

922919
RoadNetworkMesh 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

Comments
 (0)