test_lanelet_map.cpp
Go to the documentation of this file.
1 #include <gtest/gtest.h>
2 
3 #include <future>
4 
7 
8 using namespace lanelet;
9 using namespace std::string_literals;
10 
11 using utils::getId;
12 
13 class LaneletMapTest : public ::testing::Test, public test_cases::LaneletMapTestCase {};
14 
15 TEST(UniqueId, registerIdParallel) { // NOLINT
16  Ids ids{2000, 3000, 2001, -5, -200};
17  auto registerId = [](auto id) { return std::async(std::launch::async, [id]() { utils::registerId(id); }); };
18  auto futs = utils::transform(ids, registerId);
19  utils::forEach(futs, [](auto& f) { f.get(); });
20  auto newId = utils::getId();
21  EXPECT_FALSE(!!utils::find(ids, newId));
22 }
23 
24 TEST_F(LaneletMapTest, AddWorks) { // NOLINT
25  EXPECT_FALSE(map->pointLayer.exists(p5.id()));
26  map->add(ll2);
27  EXPECT_TRUE(map->pointLayer.exists(p5.id()));
28  EXPECT_TRUE(map->laneletLayer.exists(ll2.id()));
29 }
30 
31 TEST_F(LaneletMapTest, AddAPolygon) { // NOLINT
32  poly1.setId(InvalId);
33  auto map = utils::createMap({poly1});
34  Points3d pointsInLayer(map->pointLayer.begin(), map->pointLayer.end());
35  std::sort(pointsInLayer.begin(), pointsInLayer.end(), utils::idLess<Point3d>);
36  EXPECT_EQ(pointsInLayer, Points3d({p1, p2, p3, p4}));
37 }
38 
39 TEST_F(LaneletMapTest, AddRegelemWorks) { // NOLINT
40  auto regelemData = std::make_shared<RegulatoryElementData>(InvalId);
41  regelemData->parameters[RoleName::Refers].emplace_back(p1);
42  regelemData->parameters[RoleName::RefLine].emplace_back(left);
43  regelemData->parameters[RoleName::Refers].emplace_back(ll1);
44  regelemData->parameters[RoleName::Refers].emplace_back(ar1);
45  auto regelem = lanelet::RegulatoryElementFactory::create("", regelemData);
46  LaneletMap map;
47  EXPECT_EQ(InvalId, regelem->id());
48  map.add(regelem);
49  EXPECT_NE(InvalId, regelem->id());
50  EXPECT_TRUE(map.pointLayer.exists(p1.id()));
51  EXPECT_TRUE(map.lineStringLayer.exists(left.id()));
52  EXPECT_TRUE(map.laneletLayer.exists(ll1.id()));
53  EXPECT_TRUE(map.areaLayer.exists(ar1.id()));
54  EXPECT_TRUE(map.pointLayer.exists(p1.id()));
55 }
56 
57 TEST_F(LaneletMapTest, CanAddEmptyRegelem) { // NOLINT
58  LaneletMap map;
59  auto regelemData = std::make_shared<RegulatoryElementData>(InvalId);
60  auto regelem = lanelet::RegulatoryElementFactory::create("", regelemData);
61  map.add(regelem);
62  EXPECT_NE(InvalId, regelem->id());
63 }
64 
65 TEST_F(LaneletMapTest, CanAddExistingElement) { // NOLINT
66  EXPECT_EQ(map->areaLayer.size(), 1ul);
67  map->add(ar1);
68  testConstAndNonConst([](auto& map) { EXPECT_EQ(map->areaLayer.size(), 1ul); });
69 }
70 
71 TEST_F(LaneletMapTest, AddAssignsCorrectId) { // NOLINT
72  Point3d newPoint;
73  EXPECT_EQ(newPoint.id(), InvalId);
74  map->add(newPoint);
75  EXPECT_NE(newPoint.id(), InvalId);
76  EXPECT_TRUE(newPoint.id() < p1.id() || newPoint.id() > p4.id());
77 }
78 
79 TEST_F(LaneletMapTest, FindWorks) { // NOLINT
80  auto elem = map->laneletLayer.get(ll1.id());
81  EXPECT_EQ(elem, ll1);
82 }
83 
84 TEST_F(LaneletMapTest, FindThrowsIfNotExistent) { // NOLINT
85  testConstAndNonConst([](auto& map) {
86  EXPECT_THROW(map->laneletLayer.get(InvalId), NoSuchPrimitiveError); // NOLINT
87  EXPECT_THROW(map->laneletLayer.get(-5), NoSuchPrimitiveError); // NOLINT
88  });
89 }
90 
91 TEST_F(LaneletMapTest, emptyWorks) { // NOLINT
92  testConstAndNonConst([](auto& map) {
93  EXPECT_TRUE(LaneletMap().polygonLayer.empty());
94  EXPECT_FALSE(map->areaLayer.empty());
95  });
96 }
97 
98 TEST_F(LaneletMapTest, nearestWorksForPoints) { // NOLINT
99  testConstAndNonConst([this](auto& map) {
100  auto pts = map->pointLayer.nearest(Point2d(p3), 1);
101  ASSERT_EQ(pts.size(), 1ul);
102  EXPECT_EQ(pts[0], p3);
103  });
104 }
105 
106 TEST_F(LaneletMapTest, nearestWorksForLanelets) { // NOLINT
107  map->add(ll2);
108  testConstAndNonConst([this](auto& map) {
109  auto llts = map->laneletLayer.nearest(Point2d(p2), 1);
110  ASSERT_EQ(llts.size(), 1ul);
111  EXPECT_EQ(llts[0], ll1);
112  });
113 }
114 
115 TEST_F(LaneletMapTest, findWorksForPoints) { // NOLINT
116  map->add(ll2);
117  testConstAndNonConst([this](auto& map) {
118  auto pts = map->pointLayer.search(BoundingBox2d(BasicPoint2d(0, 0.2), BasicPoint2d(2, 1)));
119  auto in = [pts](const Point3d& p) { return std::find(pts.begin(), pts.end(), p) != pts.end(); };
120  ASSERT_EQ(pts.size(), 5ul);
121  EXPECT_TRUE(in(p1));
122  EXPECT_TRUE(in(p2));
123  EXPECT_TRUE(in(p5));
124  EXPECT_TRUE(in(p6));
125  EXPECT_TRUE(in(p7));
126  });
127 }
128 
129 TEST_F(LaneletMapTest, findWorksForLanelets) { // NOLINT
130  map->add(ll2);
131  testConstAndNonConst([this](auto& map) {
132  auto llts = map->laneletLayer.search(BoundingBox2d(BasicPoint2d(0, 0.7), BasicPoint2d(2, 1)));
133  ASSERT_EQ(llts.size(), 1ul);
134  EXPECT_EQ(llts[0], ll1);
135  });
136 }
137 
138 TEST_F(LaneletMapTest, findWithLargeBoxWorksForLanelets) { // NOLINT
139  testConstAndNonConst([this](auto& map) {
140  auto llts = map->laneletLayer.search(BoundingBox2d(BasicPoint2d(-5, -5), BasicPoint2d(5, 5)));
141  ASSERT_EQ(llts.size(), 1ul);
142  EXPECT_EQ(llts[0], ll1);
143  });
144 }
145 
146 TEST_F(LaneletMapTest, findNearestWorksForLanelets) { // NOLINT
147  this->map = utils::createMap({ll1, ll2});
148  testConstAndNonConst([this](auto& map) {
149  auto llts = geometry::findNearest(map->laneletLayer, BasicPoint2d(0, -10), 10);
150  ASSERT_EQ(2ul, llts.size());
151  EXPECT_DOUBLE_EQ(9, llts.front().first);
152  EXPECT_EQ(ll2, llts.front().second);
153  });
154 }
155 
156 TEST_F(LaneletMapTest, findNearestWorksForRegElems) { // NOLINT
157  testConstAndNonConst([this](auto& map) {
158  auto regElem = geometry::findNearest(map->regulatoryElementLayer, BasicPoint2d(0, -1), 10);
159  ASSERT_EQ(1ul, regElem.size());
160  EXPECT_DOUBLE_EQ(1, regElem.front().first);
161  EXPECT_EQ(regelem1, regElem.front().second);
162  });
163 }
164 
165 TEST_F(LaneletMapTest, findNearestWorksForComplexRegElems) { // NOLINT
166  RuleParameterMap rules{
167  {"test"s, {ll1}}, {"point"s, {p1, p9}}, {"areas"s, {ar1}}, {"linestr"s, {outside}}, {"poly"s, {poly1}}};
168  auto regelem = std::make_shared<GenericRegulatoryElement>(getId(), rules);
169  ll1.addRegulatoryElement(regelem);
170  ar1.addRegulatoryElement(regelem);
171  this->map = utils::createMap({ar1});
172  this->map->add(ll1);
173  testConstAndNonConst([this, regelem](auto& map) {
174  auto regElem = geometry::findNearest(map->regulatoryElementLayer, BasicPoint2d(0, -1), 10);
175  ASSERT_EQ(1ul, regElem.size());
176  EXPECT_DOUBLE_EQ(0, regElem.front().first);
177  EXPECT_EQ(regelem, regElem.front().second);
178  });
179 }
180 
181 TEST_F(LaneletMapTest, findNearestWorksOnEmptyMap) { // NOLINT
182  this->map = utils::createMap(Points3d());
183  testConstAndNonConst([](auto& map) {
184  auto pts = geometry::findNearest(map->pointLayer, BasicPoint2d(0, -10), 10);
185  ASSERT_EQ(0ul, pts.size());
186  });
187 }
188 
189 TEST_F(LaneletMapTest, findUsagesInLanelet) { // NOLINT
190  testConstAndNonConst([this](auto& map) {
191  auto llts = utils::findUsagesInLanelets(*map, p4);
192  ASSERT_EQ(llts.size(), 1ul);
193  EXPECT_EQ(llts[0], ll1);
194  });
195 }
196 
198  testConstAndNonConst([this](auto& map) {
199  auto ars = utils::findUsagesInAreas(*map, p4);
200  ASSERT_EQ(ars.size(), 1ul);
201  EXPECT_EQ(ars[0], ar1);
202  });
203 }
204 
205 TEST_F(LaneletMapTest, sizeAndEmpty) { // NOLINT
206  auto pointMap = utils::createMap(Points3d{map->pointLayer.begin(), map->pointLayer.end()});
207  EXPECT_FALSE(pointMap->empty());
208  EXPECT_EQ(pointMap->size(), pointMap->pointLayer.size());
209  EXPECT_TRUE(LaneletMap().empty());
210 }
211 
212 TEST_F(LaneletMapTest, findRegelemUsagesInLanelet) { // NOLINT
213  ll2.addRegulatoryElement(regelem1);
214  map->add(ll2);
215  testConstAndNonConst([this](auto& map) { // NOLINT
216  auto usages = map->laneletLayer.findUsages(regelem1);
217  ASSERT_EQ(1ul, usages.size());
218  EXPECT_EQ(ll2, usages[0]);
219  });
220 }
221 
222 TEST_F(LaneletMapTest, findRegelemUsagesInArea) { // NOLINT
223  ar1.addRegulatoryElement(regelem1);
224  this->map = utils::createMap({ar1});
225  testConstAndNonConst([this](auto& map) {
226  auto usages = map->areaLayer.findUsages(regelem1);
227  ASSERT_EQ(1ul, usages.size());
228  EXPECT_EQ(ar1, usages[0]);
229  });
230 }
231 
232 TEST_F(LaneletMapTest, findUsagesInPolygon) { // NOLINT
233  testConstAndNonConst([this](auto& map) {
234  auto polys = map->polygonLayer.findUsages(p1);
235  ASSERT_EQ(polys.size(), 1ul);
236  EXPECT_EQ(poly1, polys[0]);
237 
238  polys = map->polygonLayer.findUsages(p9);
239  EXPECT_TRUE(polys.empty());
240  });
241 }
242 
243 TEST_F(LaneletMapTest, createMapWithCustomCenterline) { // NOLINT
244  ll1.setCenterline(front);
245  auto map = utils::createConstMap(ConstLanelets{ll1}, {});
246  EXPECT_TRUE(map->lineStringLayer.exists(front.id()));
247 }
248 
250  auto map = utils::createConstMap(ConstLanelets{ll1, ll2}, ConstAreas{ar1});
251  EXPECT_TRUE(map->laneletLayer.exists(ll1.id()));
252  EXPECT_TRUE(map->areaLayer.exists(ar1.id()));
253 }
254 
256  auto submap = utils::createSubmap(Lanelets{ll1, ll2});
257  EXPECT_EQ(submap->size(), 2ul);
258  auto llMap = submap->laneletMap();
259  EXPECT_LT(0ul, llMap->lineStringLayer.size());
260  EXPECT_LT(0ul, llMap->pointLayer.size());
261 }
lanelet::InvalId
constexpr Id InvalId
indicates a primitive that is not part of a map
Definition: Forward.h:199
lanelet::LaneletMapLayers::laneletLayer
LaneletLayer laneletLayer
access to the lanelets within this map
Definition: LaneletMap.h:353
TEST_F
TEST_F(LaneletMapTest, AddWorks)
Definition: test_lanelet_map.cpp:24
lanelet::test_cases::LaneletMapTestCase
Definition: lanelet_map_test_case.h:27
lanelet::RoleName::RefLine
@ RefLine
The referring line where the rule becomes active.
lanelet::LaneletMapLayers::lineStringLayer
LineStringLayer lineStringLayer
access to the lineStrings
Definition: LaneletMap.h:357
lanelet::utils::forEach
void forEach(Container &&c, Func &&f)
Definition: Utilities.h:226
lanelet::utils::registerId
void registerId(Id id)
Definition: LaneletMap.cpp:885
lanelet::LaneletMapLayers::areaLayer
AreaLayer areaLayer
access to areas
Definition: LaneletMap.h:354
lanelet
Definition: Attribute.h:13
LaneletMapTest
Definition: test_lanelet_map.cpp:13
p2
BasicPoint p2
Definition: LineStringGeometry.cpp:167
lanelet::LaneletMapLayers::pointLayer
PointLayer pointLayer
access to the points
Definition: LaneletMap.h:358
p
BasicPoint p
Definition: LineStringGeometry.cpp:196
lanelet::utils::getId
Id getId()
returns a unique id by incrementing a counter each time this is called.
Definition: LaneletMap.cpp:883
lanelet::Point2d
A mutable 2d point.
Definition: primitives/Point.h:230
lanelet::LaneletMapLayers::empty
bool empty() const noexcept
Returns whether all layers of this object are empty.
Definition: LaneletMap.h:342
lanelet::LaneletMap::add
void add(Lanelet lanelet)
adds a lanelet and all the elements it owns to the map
Definition: LaneletMap.cpp:568
lanelet::Ids
std::vector< Id > Ids
Definition: Forward.h:200
lanelet::utils::transform
auto transform(Iterator begin, Iterator end, const Func f)
Definition: Utilities.h:176
lanelet_map_test_case.h
TEST
TEST(UniqueId, registerIdParallel)
Definition: test_lanelet_map.cpp:15
lanelet::Lanelets
std::vector< Lanelet > Lanelets
Definition: Forward.h:113
id
Id id
Definition: LaneletMap.cpp:63
lanelet::NoSuchPrimitiveError
Thrown when an element is not part of the map.
Definition: Exceptions.h:49
lanelet::BoundingBox2d
Axis-Aligned bounding box in 2d.
Definition: primitives/BoundingBox.h:23
lanelet::LaneletMap
Basic element for accessing and managing the elements of a map.
Definition: LaneletMap.h:375
lanelet::utils::createMap
LaneletMapUPtr createMap(const Points3d &fromPoints)
Efficiently create a LaneletMap from a vector of things. All elements must have a valid id!
Definition: LaneletMap.cpp:813
lanelet::utils::findUsagesInAreas
ConstAreas findUsagesInAreas(const LaneletMapLayers &map, const ConstPoint3d &p)
Definition: LaneletMap.cpp:803
lanelet::Points3d
std::vector< Point3d > Points3d
Definition: Forward.h:34
p1
BasicPoint p1
Definition: LineStringGeometry.cpp:166
LaneletMap.h
lanelet::BasicPoint2d
Eigen::Matrix< double, 2, 1, Eigen::DontAlign > BasicPoint2d
a simple 2d-point
Definition: primitives/Point.h:20
lanelet::Point3d
A mutable 3d point.
Definition: primitives/Point.h:271
lanelet::utils::createConstMap
LaneletMapConstUPtr createConstMap(const ConstLanelets &fromLanelets, const ConstAreas &fromAreas)
Definition: LaneletMap.cpp:875
lanelet::HybridMap< RuleParameters, decltype(RoleNameString::Map)&, RoleNameString::Map >
lanelet::PrimitiveLayer::exists
bool exists(Id id) const
checks whether an element exists in this layer
Definition: LaneletMap.cpp:354
lanelet::RegulatoryElementFactory::create
static RegulatoryElementPtr create(std::string ruleName, const RegulatoryElementDataPtr &data)
create a regulatory element based on the name of the rule
Definition: RegulatoryElement.cpp:114
lanelet::utils::findUsagesInLanelets
ConstLanelets findUsagesInLanelets(const LaneletMapLayers &map, const ConstPoint3d &p)
Definition: LaneletMap.cpp:793
lanelet::utils::createSubmap
LaneletSubmapUPtr createSubmap(const Points3d &fromPoints)
Efficiently create a LaneletSubmap from a vector of things. All elements must have a valid id!
Definition: LaneletMap.cpp:893
lanelet::geometry::findNearest
std::vector< std::pair< double, PrimT > > findNearest(PrimitiveLayer< PrimT > &map, const BasicPoint2d &pt, unsigned count)
returns the nearest n primitives to a point.
Definition: LaneletMap.cpp:987
lanelet::RoleName::Refers
@ Refers
The primitive(s) that are the origin of this rule (ie signs)
lanelet::utils::find
auto find(ContainerT &&c, const ValueT &val)
Definition: Utilities.h:186
lanelet::ConstAreas
std::vector< ConstArea > ConstAreas
Definition: Forward.h:126
lanelet::ConstPrimitive::id
Id id() const noexcept
get the unique id of this primitive
Definition: Primitive.h:96
lanelet::ConstLanelets
std::vector< ConstLanelet > ConstLanelets
Definition: Forward.h:114


lanelet2_core
Author(s): Fabian Poggenhans
autogenerated on Thu Mar 6 2025 03:25:52