Skip to content

Commit 9ff7d60

Browse files
committed
refactor: use LaneKey instead of Lane references everywhere; get rid of Lane::key to align closer to OpenDrive data model
1 parent eaf7e2e commit 9ff7d60

File tree

5 files changed

+61
-75
lines changed

5 files changed

+61
-75
lines changed

include/Lane.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,10 @@ inline std::ostream& operator<<(std::ostream& os, const LaneKey& lk)
5050

5151
struct Lane
5252
{
53-
Lane(std::string road_id, double lanesection_s0, int id, bool level, std::string type);
53+
Lane(int id, bool level, std::string type);
5454

5555
std::vector<SingleRoadMark> get_roadmarks(const double s_start, const double s_end) const;
5656

57-
LaneKey key;
5857
int id;
5958
bool level = false;
6059
std::string type = "";

include/Road.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#pragma once
22
#include "Geometries/CubicSpline.h"
3+
#include "Lane.h"
34
#include "LaneSection.h"
45
#include "Math.hpp"
56
#include "Mesh.h"
@@ -97,20 +98,18 @@ class Road
9798
Vec3D get_xyz(const double s, const double t, const double h, Vec3D* e_s = nullptr, Vec3D* e_t = nullptr, Vec3D* e_h = nullptr) const;
9899
Vec3D get_surface_pt(double s, const double t, Vec3D* vn = nullptr) const;
99100

100-
Line3D get_lane_border_line(const Lane& lane, const double s_start, const double s_end, const double eps, const bool outer = true) const;
101-
Line3D get_lane_border_line(const Lane& lane, const double eps, const bool outer = true) const;
101+
Line3D get_lane_border_line(const LaneKey& lane_key, double s_start, double s_end, double eps, bool outer = true) const;
102+
Line3D get_lane_border_line(const LaneKey& lane_key, double eps, bool outer = true) const;
102103

103-
Mesh3D get_lane_mesh(
104-
const Lane& lane, const double s_start, const double s_end, const double eps, std::vector<uint32_t>* outline_indices = nullptr) const;
105-
Mesh3D get_lane_mesh(const Lane& lane, const double eps, std::vector<uint32_t>* outline_indices = nullptr) const;
104+
Mesh3D get_lane_mesh(const LaneKey& lane_key, double s_start, double s_end, double eps, std::vector<uint32_t>* outline_indices = nullptr) const;
105+
Mesh3D get_lane_mesh(const LaneKey& lane_key, double eps, std::vector<uint32_t>* outline_indices = nullptr) const;
106106

107-
Mesh3D get_roadmark_mesh(const Lane& lane, const SingleRoadMark& roadmark, const double eps) const;
107+
Mesh3D get_roadmark_mesh(const LaneKey& lane_key, const SingleRoadMark& roadmark, double eps) const;
108108
Mesh3D get_road_signal_mesh(const RoadSignal& road_signal) const;
109-
Mesh3D get_road_object_mesh(const RoadObject& road_object, const double eps) const;
109+
Mesh3D get_road_object_mesh(const RoadObject& road_object, double eps) const;
110110

111-
std::set<double>
112-
approximate_lane_border_linear(const Lane& lane, const double s_start, const double s_end, const double eps, const bool outer = true) const;
113-
std::set<double> approximate_lane_border_linear(const Lane& lane, const double eps, const bool outer = true) const;
111+
std::set<double> approximate_lane_border_linear(const LaneKey& lane_key, double s_start, double s_end, double eps, bool outer = true) const;
112+
std::set<double> approximate_lane_border_linear(const LaneKey& lane_key, double eps, bool outer = true) const;
114113

115114
double length = 0;
116115
std::string id = "";

src/Lane.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,7 @@ std::string LaneKey::to_string() const
1919
return fmt::format("{}/{:.17g}/{}", this->road_id, this->lanesection_s0, this->lane_id);
2020
}
2121

22-
Lane::Lane(std::string road_id, double lanesection_s0, int id, bool level, std::string type) :
23-
key(road_id, lanesection_s0, id), id(id), level(level), type(type)
24-
{
25-
}
22+
Lane::Lane(int id, bool level, std::string type) : id(id), level(level), type(type) {}
2623

2724
std::vector<SingleRoadMark> Lane::get_roadmarks(const double s_start, const double s_end) const
2825
{

src/OpenDriveMap.cpp

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -403,8 +403,7 @@ OpenDriveMap::OpenDriveMap(const std::string& xodr_file,
403403

404404
Lane& lane =
405405
lanesection.id_to_lane
406-
.emplace(lane_id,
407-
Lane(road_id, s0, lane_id, lane_node.attribute("level").as_bool(false), lane_node.attribute("type").as_string("")))
406+
.emplace(lane_id, Lane(lane_id, lane_node.attribute("level").as_bool(false), lane_node.attribute("type").as_string("")))
408407
.first->second;
409408

410409
if (const pugi::xml_attribute id_attr = lane_node.child("link").child("predecessor").attribute("id"))
@@ -924,50 +923,46 @@ RoadNetworkMesh OpenDriveMap::get_road_network_mesh(const double eps) const
924923
RoadObjectsMesh& road_objects_mesh = out_mesh.road_objects_mesh;
925924
RoadSignalsMesh& road_signals_mesh = out_mesh.road_signals_mesh;
926925

927-
for (const auto& id_road : this->id_to_road)
926+
for (const auto& [road_id, road] : this->id_to_road)
928927
{
929-
const Road& road = id_road.second;
930-
lanes_mesh.road_start_indices[lanes_mesh.vertices.size()] = road.id;
931-
roadmarks_mesh.road_start_indices[roadmarks_mesh.vertices.size()] = road.id;
932-
road_objects_mesh.road_start_indices[road_objects_mesh.vertices.size()] = road.id;
928+
lanes_mesh.road_start_indices[lanes_mesh.vertices.size()] = road_id;
929+
roadmarks_mesh.road_start_indices[roadmarks_mesh.vertices.size()] = road_id;
930+
road_objects_mesh.road_start_indices[road_objects_mesh.vertices.size()] = road_id;
933931

934-
for (const auto& s_lanesec : road.s_to_lanesection)
932+
for (const auto& [lanesec_s0, lanesec] : road.s_to_lanesection)
935933
{
936-
const LaneSection& lanesec = s_lanesec.second;
937-
lanes_mesh.lanesec_start_indices[lanes_mesh.vertices.size()] = lanesec.s0;
938-
roadmarks_mesh.lanesec_start_indices[roadmarks_mesh.vertices.size()] = lanesec.s0;
939-
for (const auto& id_lane : lanesec.id_to_lane)
934+
lanes_mesh.lanesec_start_indices[lanes_mesh.vertices.size()] = lanesec_s0;
935+
roadmarks_mesh.lanesec_start_indices[roadmarks_mesh.vertices.size()] = lanesec_s0;
936+
for (const auto& [lane_id, lane] : lanesec.id_to_lane)
940937
{
941-
const Lane& lane = id_lane.second;
938+
const LaneKey lane_key(road_id, lanesec_s0, lane_id);
942939
const std::size_t lanes_idx_offset = lanes_mesh.vertices.size();
943-
lanes_mesh.lane_start_indices[lanes_idx_offset] = lane.id;
944-
lanes_mesh.add_mesh(road.get_lane_mesh(lane, eps));
940+
lanes_mesh.lane_start_indices[lanes_idx_offset] = lane_id;
941+
lanes_mesh.add_mesh(road.get_lane_mesh(lane_key, eps));
945942

946943
std::size_t roadmarks_idx_offset = roadmarks_mesh.vertices.size();
947-
roadmarks_mesh.lane_start_indices[roadmarks_idx_offset] = lane.id;
944+
roadmarks_mesh.lane_start_indices[roadmarks_idx_offset] = lane_id;
948945
const std::vector<SingleRoadMark> roadmarks = lane.get_roadmarks(lanesec.s0, road.get_lanesection_end(lanesec));
949946
for (const SingleRoadMark& roadmark : roadmarks)
950947
{
951948
roadmarks_idx_offset = roadmarks_mesh.vertices.size();
952949
roadmarks_mesh.roadmark_type_start_indices[roadmarks_idx_offset] = roadmark.type;
953-
roadmarks_mesh.add_mesh(road.get_roadmark_mesh(lane, roadmark, eps));
950+
roadmarks_mesh.add_mesh(road.get_roadmark_mesh(lane_key, roadmark, eps));
954951
}
955952
}
956953
}
957954

958-
for (const auto& id_road_object : road.id_to_object)
955+
for (const auto& [road_object_id, road_object] : road.id_to_object)
959956
{
960-
const RoadObject& road_object = id_road_object.second;
961957
const std::size_t road_objs_idx_offset = road_objects_mesh.vertices.size();
962-
road_objects_mesh.road_object_start_indices[road_objs_idx_offset] = road_object.id;
958+
road_objects_mesh.road_object_start_indices[road_objs_idx_offset] = road_object_id;
963959
road_objects_mesh.add_mesh(road.get_road_object_mesh(road_object, eps));
964960
}
965961

966-
for (const auto& id_signal : road.id_to_signal)
962+
for (const auto& [road_signal_id, road_signal] : road.id_to_signal)
967963
{
968-
const RoadSignal& road_signal = id_signal.second;
969964
const std::size_t signals_idx_offset = road_signals_mesh.vertices.size();
970-
road_signals_mesh.road_signal_start_indices[signals_idx_offset] = road_signal.id;
965+
road_signals_mesh.road_signal_start_indices[signals_idx_offset] = road_signal_id;
971966
road_signals_mesh.add_mesh(road.get_road_signal_mesh(road_signal));
972967
}
973968
}

src/Road.cpp

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -212,18 +212,14 @@ Vec3D Road::get_surface_pt(double s, const double t, Vec3D* vn) const
212212
return this->get_xyz(s, t, h, nullptr, nullptr, vn);
213213
}
214214

215-
std::set<double>
216-
Road::approximate_lane_border_linear(const Lane& lane, const double s_start, const double s_end, const double eps, const bool outer) const
215+
std::set<double> Road::approximate_lane_border_linear(const LaneKey& lane_key, double s_start, double s_end, double eps, bool outer) const
217216
{
217+
const LaneSection& lanesection = this->s_to_lanesection.at(lane_key.lanesection_s0);
218+
const Lane& lane = lanesection.id_to_lane.at(lane_key.lane_id);
219+
218220
std::set<double> s_vals = this->ref_line.approximate_linear(eps, s_start, s_end);
219221

220-
CubicProfile border = lane.outer_border;
221-
if (!outer)
222-
{
223-
const LaneSection& lanesection = this->s_to_lanesection.at(lane.key.lanesection_s0);
224-
const Lane& inner_neighbor_lane = lanesection.get_lane(next_towards_zero(lane.id));
225-
border = inner_neighbor_lane.outer_border;
226-
}
222+
const CubicProfile border = outer ? lane.outer_border : lanesection.id_to_lane.at(next_towards_zero(lane.id)).outer_border;
227223

228224
std::set<double> s_vals_brdr = border.approximate_linear(eps, s_start, s_end);
229225
s_vals.insert(s_vals_brdr.begin(), s_vals_brdr.end());
@@ -238,23 +234,20 @@ Road::approximate_lane_border_linear(const Lane& lane, const double s_start, con
238234
return s_vals;
239235
}
240236

241-
std::set<double> Road::approximate_lane_border_linear(const Lane& lane, const double eps, const bool outer) const
237+
std::set<double> Road::approximate_lane_border_linear(const LaneKey& lane_key, double eps, bool outer) const
242238
{
243-
const double s_end = this->get_lanesection_end(lane.key.lanesection_s0);
244-
return this->approximate_lane_border_linear(lane, lane.key.lanesection_s0, s_end, eps, outer);
239+
const double lanesec_s_end = this->get_lanesection_end(lane_key.lanesection_s0);
240+
return this->approximate_lane_border_linear(lane_key, lane_key.lanesection_s0, lanesec_s_end, eps, outer);
245241
}
246242

247-
Line3D Road::get_lane_border_line(const Lane& lane, const double s_start, const double s_end, const double eps, const bool outer) const
243+
Line3D Road::get_lane_border_line(const LaneKey& lane_key, double s_start, double s_end, double eps, bool outer) const
248244
{
249-
std::set<double> s_vals = this->approximate_lane_border_linear(lane, s_start, s_end, eps, outer);
245+
const LaneSection& lanesection = this->s_to_lanesection.at(lane_key.lanesection_s0);
246+
const Lane& lane = lanesection.id_to_lane.at(lane_key.lane_id);
250247

251-
CubicProfile border = lane.outer_border;
252-
if (!outer)
253-
{
254-
const LaneSection& lanesection = this->s_to_lanesection.at(lane.key.lanesection_s0);
255-
const Lane& inner_neighbor_lane = lanesection.get_lane(next_towards_zero(lane.id));
256-
border = inner_neighbor_lane.outer_border;
257-
}
248+
std::set<double> s_vals = this->approximate_lane_border_linear(lane_key, s_start, s_end, eps, outer);
249+
250+
const CubicProfile border = outer ? lane.outer_border : lanesection.id_to_lane.at(next_towards_zero(lane.id)).outer_border;
258251

259252
Line3D border_line;
260253
for (const double& s : s_vals)
@@ -268,21 +261,23 @@ Line3D Road::get_lane_border_line(const Lane& lane, const double s_start, const
268261
return border_line;
269262
}
270263

271-
Line3D Road::get_lane_border_line(const Lane& lane, const double eps, const bool outer) const
264+
Line3D Road::get_lane_border_line(const LaneKey& lane_key, double eps, bool outer) const
272265
{
273-
const double s_end = this->get_lanesection_end(lane.key.lanesection_s0);
274-
return this->get_lane_border_line(lane, lane.key.lanesection_s0, s_end, eps, outer);
266+
const double lanesec_s_end = this->get_lanesection_end(lane_key.lanesection_s0);
267+
return this->get_lane_border_line(lane_key, lane_key.lanesection_s0, lanesec_s_end, eps, outer);
275268
}
276269

277-
Mesh3D Road::get_lane_mesh(const Lane& lane, const double s_start, const double s_end, const double eps, std::vector<uint32_t>* outline_indices) const
270+
Mesh3D Road::get_lane_mesh(const LaneKey& lane_key, double s_start, double s_end, double eps, std::vector<uint32_t>* outline_indices) const
278271
{
272+
const LaneSection& lanesection = this->s_to_lanesection.at(lane_key.lanesection_s0);
273+
const Lane& lane = lanesection.id_to_lane.at(lane_key.lane_id);
274+
279275
std::set<double> s_vals = this->ref_line.approximate_linear(eps, s_start, s_end);
280276
std::set<double> s_vals_outer_brdr = lane.outer_border.approximate_linear(eps, s_start, s_end);
281277
s_vals.insert(s_vals_outer_brdr.begin(), s_vals_outer_brdr.end());
282278

283-
const LaneSection& lanesection = this->s_to_lanesection.at(lane.key.lanesection_s0);
284-
const Lane& inner_neighbor_lane = lanesection.get_lane(next_towards_zero(lane.id));
285-
std::set<double> s_vals_inner_brdr = inner_neighbor_lane.outer_border.approximate_linear(eps, s_start, s_end);
279+
const Lane& inner_neighbor_lane = lanesection.get_lane(next_towards_zero(lane.id));
280+
std::set<double> s_vals_inner_brdr = inner_neighbor_lane.outer_border.approximate_linear(eps, s_start, s_end);
286281
s_vals.insert(s_vals_inner_brdr.begin(), s_vals_inner_brdr.end());
287282
std::set<double> s_vals_lane_offset = this->lane_offset.approximate_linear(eps, s_start, s_end);
288283
s_vals.insert(s_vals_lane_offset.begin(), s_vals_lane_offset.end());
@@ -333,25 +328,26 @@ Mesh3D Road::get_lane_mesh(const Lane& lane, const double s_start, const double
333328
}
334329

335330
if (outline_indices)
336-
{
337331
*outline_indices = get_triangle_strip_outline_indices<uint32_t>(out_mesh.vertices.size());
338-
}
339332

340333
return out_mesh;
341334
}
342335

343-
Mesh3D Road::get_lane_mesh(const Lane& lane, const double eps, std::vector<uint32_t>* outline_indices) const
336+
Mesh3D Road::get_lane_mesh(const LaneKey& lane_key, double eps, std::vector<uint32_t>* outline_indices) const
344337
{
345-
const double s_end = this->get_lanesection_end(lane.key.lanesection_s0);
346-
return this->get_lane_mesh(lane, lane.key.lanesection_s0, s_end, eps, outline_indices);
338+
const double lanesec_s_end = this->get_lanesection_end(lane_key.lanesection_s0);
339+
return this->get_lane_mesh(lane_key, lane_key.lanesection_s0, lanesec_s_end, eps, outline_indices);
347340
}
348341

349-
Mesh3D Road::get_roadmark_mesh(const Lane& lane, const SingleRoadMark& roadmark, const double eps) const
342+
Mesh3D Road::get_roadmark_mesh(const LaneKey& lane_key, const SingleRoadMark& roadmark, double eps) const
350343
{
351344
if (is_zero(roadmark.width))
352345
return Mesh3D{};
353346

354-
const std::set<double> s_vals = this->approximate_lane_border_linear(lane, roadmark.s0, roadmark.s1, eps, true);
347+
const LaneSection& lanesection = this->s_to_lanesection.at(lane_key.lanesection_s0);
348+
const Lane& lane = lanesection.id_to_lane.at(lane_key.lane_id);
349+
350+
const std::set<double> s_vals = this->approximate_lane_border_linear(lane_key, roadmark.s0, roadmark.s1, eps, true);
355351

356352
Mesh3D out_mesh;
357353
for (const double& s : s_vals)
@@ -402,7 +398,7 @@ Mesh3D Road::get_road_signal_mesh(const RoadSignal& road_signal) const
402398
return road_signal_mesh;
403399
}
404400

405-
Mesh3D Road::get_road_object_mesh(const RoadObject& road_obj, const double eps) const
401+
Mesh3D Road::get_road_object_mesh(const RoadObject& road_obj, double eps) const
406402
{
407403
std::vector<RoadObjectRepeat> repeats_copy = road_obj.repeats; // make copy to keep method const
408404
if (repeats_copy.empty() && road_obj.outlines.empty()) // handle single road object as one object repeat

0 commit comments

Comments
 (0)