Skip to content
This repository was archived by the owner on Jul 1, 2024. It is now read-only.

Commit dba6de4

Browse files
takayuki5168mitsudome-rpre-commit-ci[bot]
authored
feat(lanelet2_extension): overwriteLaneletsCenterline supports "waypoints" (#252)
* feat(lanelet2_extension): centerline is converted to waypoints Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> * fix lanelet2_extension_python Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> * update README Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> * fix Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> * fix Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> * early return Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> * fix clang-tidy Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> * Update tmp/lanelet2_extension/lib/utilities.cpp Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> * style(pre-commit): autofix * fix Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> --------- Signed-off-by: Takayuki Murooka <takayuki5168@gmail.com> Co-authored-by: Ryohsuke Mitsudome <43976834+mitsudome-r@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 170bdb5 commit dba6de4

File tree

5 files changed

+129
-18
lines changed

5 files changed

+129
-18
lines changed

tmp/lanelet2_extension/docs/lanelet2_format_extension.md

+20
Original file line numberDiff line numberDiff line change
@@ -479,3 +479,23 @@ _An example:_
479479
...
480480

481481
```
482+
483+
### Centerline
484+
485+
Note that the following explanation is not related to the Lanelet2 map format but how the Autoware handles the centerline in the Lanelet2 map.
486+
487+
Centerline is defined in Lanelet2 to guide the vehicle. By explicitly setting the centerline in the Lanelet2 map, the ego's planned path follows the centerline.
488+
However, based on the current Autoware's usage of the centerline, there are several limitations.
489+
490+
- The object's predicted path also follows the centerline.
491+
- This may adversely affect the decision making of planning modules since the centerline is supposed to be used only by the ego's path planning.
492+
- The coordinate transformation on the lane's frenet frame cannot be calculated correctly.
493+
- For example, when the lateral distance between the actual road's centerline and a parked vehicle is calculated, actually the result will be the lateral distance between the (explicit) centerline and the vehicle.
494+
495+
To solve above limitations, the `overwriteLaneletsCenterlineWithWaypoints` was implemented in addition to `overwriteLaneletsCenterline` where the centerline in all the lanes is calculated.
496+
497+
- `overwriteLaneletsCenterlineWithWaypoints`
498+
- The (explicit) centerline in the Lanelet2 map is converted to the new `waypoints` tag. This `waypoints` is only applied to the ego's path planning.
499+
- Therefore, the above limitations can be solved, but the Autoware's usage of the centerline may be hard to understand.
500+
- `overwriteLaneletsCenterline`
501+
- The (explicit) centerline in the Lanelet2 map is used as it is. Easy to understand the Autoware's usage of the centerline, but we still have above limitations.

tmp/lanelet2_extension/include/lanelet2_extension/utility/utilities.hpp

+10
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,16 @@ void overwriteLaneletsCenterline(
5959
lanelet::LaneletMapPtr lanelet_map, const double resolution = 5.0,
6060
const bool force_overwrite = false);
6161

62+
/**
63+
* @brief Apply another patch for centerline because the overwriteLaneletsCenterline
64+
* has several limitations. See the following document in detail.
65+
* https://github.com/autowarefoundation/autoware_common/blob/main/tmp/lanelet2_extension/docs/lanelet2_format_extension.md#centerline
66+
* // NOLINT
67+
*/
68+
void overwriteLaneletsCenterlineWithWaypoints(
69+
lanelet::LaneletMapPtr lanelet_map, const double resolution = 5.0,
70+
const bool force_overwrite = false);
71+
6272
lanelet::ConstLanelets getConflictingLanelets(
6373
const lanelet::routing::RoutingGraphConstPtr & graph, const lanelet::ConstLanelet & lanelet);
6474

tmp/lanelet2_extension/lib/utilities.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,25 @@ void overwriteLaneletsCenterline(
511511
}
512512
}
513513

514+
void overwriteLaneletsCenterlineWithWaypoints(
515+
lanelet::LaneletMapPtr lanelet_map, const double resolution, const bool force_overwrite)
516+
{
517+
for (auto & lanelet_obj : lanelet_map->laneletLayer) {
518+
if (force_overwrite) {
519+
const auto fine_center_line = generateFineCenterline(lanelet_obj, resolution);
520+
lanelet_obj.setCenterline(fine_center_line);
521+
} else {
522+
if (lanelet_obj.hasCustomCenterline()) {
523+
const auto & centerline = lanelet_obj.centerline();
524+
lanelet_obj.setAttribute("waypoints", centerline.id());
525+
}
526+
527+
const auto fine_center_line = generateFineCenterline(lanelet_obj, resolution);
528+
lanelet_obj.setCenterline(fine_center_line);
529+
}
530+
}
531+
}
532+
514533
lanelet::ConstLanelets getConflictingLanelets(
515534
const lanelet::routing::RoutingGraphConstPtr & graph, const lanelet::ConstLanelet & lanelet)
516535
{

tmp/lanelet2_extension/test/src/test_utilities.cpp

+43
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,14 @@ class TestSuite : public ::testing::Test // NOLINT for gtest
8787
merging_lanelet.attributes()[lanelet::AttributeName::Subtype] =
8888
lanelet::AttributeValueString::Road;
8989

90+
// create sample lanelets
91+
Point3d cp1 = Point3d(getId(), 0.5, 0., 0.);
92+
Point3d cp2 = Point3d(getId(), 0.5, 0.5, 0.);
93+
Point3d cp3 = Point3d(getId(), 0.5, 1., 0.);
94+
95+
LineString3d ls_centerline(getId(), {cp1, cp2, cp3});
96+
road_lanelet.setCenterline(ls_centerline);
97+
9098
sample_map_ptr->add(road_lanelet);
9199
sample_map_ptr->add(next_lanelet);
92100
sample_map_ptr->add(next_lanelet2);
@@ -104,12 +112,47 @@ class TestSuite : public ::testing::Test // NOLINT for gtest
104112
private:
105113
};
106114

115+
TEST_F(TestSuite, OverwriteLaneletsCenterlineWithWaypoints) // NOLINT for gtest
116+
{
117+
double resolution = 5.0;
118+
bool force_overwrite = false;
119+
120+
// memorize the original information of the centerline
121+
std::unordered_map<lanelet::Id, lanelet::Id> lanelet_centerline_map{};
122+
for (const auto & lanelet : sample_map_ptr->laneletLayer) {
123+
if (lanelet.hasCustomCenterline()) {
124+
lanelet_centerline_map.insert({lanelet.id(), lanelet.centerline().id()});
125+
}
126+
}
127+
128+
// convert centerline to waypoints
129+
lanelet::utils::overwriteLaneletsCenterlineWithWaypoints(
130+
sample_map_ptr, resolution, force_overwrite);
131+
132+
for (const auto & lanelet : sample_map_ptr->laneletLayer) {
133+
if (lanelet_centerline_map.find(lanelet.id()) != lanelet_centerline_map.end()) {
134+
// check if the lanelet has waypoints.
135+
ASSERT_TRUE(lanelet.hasAttribute("waypoints")) << "The lanelet does not have a waypoints.";
136+
// check if the waypoints points to the linestring of the centerline.
137+
ASSERT_TRUE(
138+
lanelet.attribute("waypoints").asId().value() == lanelet_centerline_map.at(lanelet.id()))
139+
<< "The waypoint's ID is invalid.";
140+
}
141+
}
142+
143+
// check if all the lanelets have a centerline
144+
for (const auto & lanelet : sample_map_ptr->laneletLayer) {
145+
ASSERT_TRUE(lanelet.hasCustomCenterline()) << "failed to calculate fine centerline";
146+
}
147+
}
148+
107149
TEST_F(TestSuite, OverwriteLaneletsCenterline) // NOLINT for gtest
108150
{
109151
double resolution = 5.0;
110152
bool force_overwrite = false;
111153
lanelet::utils::overwriteLaneletsCenterline(sample_map_ptr, resolution, force_overwrite);
112154

155+
// check if all the lanelets have a centerline
113156
for (const auto & lanelet : sample_map_ptr->laneletLayer) {
114157
ASSERT_TRUE(lanelet.hasCustomCenterline()) << "failed to calculate fine centerline";
115158
}

tmp/lanelet2_extension_python/src/utility.cpp

+37-18
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,8 @@ lanelet::Optional<lanelet::ConstPolygon3d> lineStringWithWidthToPolygon(
4545
lanelet::ConstPolygon3d poly{};
4646
if (lanelet::utils::lineStringWithWidthToPolygon(linestring, &poly)) {
4747
return poly;
48-
} else {
49-
return {};
5048
}
49+
return {};
5150
}
5251

5352
lanelet::Optional<lanelet::ConstPolygon3d> lineStringToPolygon(
@@ -56,9 +55,8 @@ lanelet::Optional<lanelet::ConstPolygon3d> lineStringToPolygon(
5655
lanelet::ConstPolygon3d poly{};
5756
if (lanelet::utils::lineStringToPolygon(linestring, &poly)) {
5857
return poly;
59-
} else {
60-
return {};
6158
}
59+
return {};
6260
}
6361

6462
lanelet::ArcCoordinates getArcCoordinates(
@@ -69,7 +67,9 @@ lanelet::ArcCoordinates getArcCoordinates(
6967
serialized_msg.reserve(message_header_length + pose_byte.size());
7068
serialized_msg.get_rcl_serialized_message().buffer_length = pose_byte.size();
7169
for (size_t i = 0; i < pose_byte.size(); ++i) {
70+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
7271
serialized_msg.get_rcl_serialized_message().buffer[i] = pose_byte[i];
72+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
7373
}
7474
geometry_msgs::msg::Pose pose;
7575
static rclcpp::Serialization<geometry_msgs::msg::Pose> serializer;
@@ -84,7 +84,9 @@ double getLaneletAngle(const lanelet::ConstLanelet & lanelet, const std::string
8484
serialized_msg.reserve(message_header_length + point_byte.size());
8585
serialized_msg.get_rcl_serialized_message().buffer_length = point_byte.size();
8686
for (size_t i = 0; i < point_byte.size(); ++i) {
87+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
8788
serialized_msg.get_rcl_serialized_message().buffer[i] = point_byte[i];
89+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
8890
}
8991
geometry_msgs::msg::Point point;
9092
static rclcpp::Serialization<geometry_msgs::msg::Point> serializer;
@@ -100,7 +102,9 @@ bool isInLanelet(
100102
serialized_msg.reserve(message_header_length + pose_byte.size());
101103
serialized_msg.get_rcl_serialized_message().buffer_length = pose_byte.size();
102104
for (size_t i = 0; i < pose_byte.size(); ++i) {
105+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
103106
serialized_msg.get_rcl_serialized_message().buffer[i] = pose_byte[i];
107+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
104108
}
105109
geometry_msgs::msg::Pose pose;
106110
static rclcpp::Serialization<geometry_msgs::msg::Pose> serializer;
@@ -116,7 +120,9 @@ std::vector<double> getClosestCenterPose(
116120
serialized_point_msg.reserve(message_header_length + search_point_byte.size());
117121
serialized_point_msg.get_rcl_serialized_message().buffer_length = search_point_byte.size();
118122
for (size_t i = 0; i < search_point_byte.size(); ++i) {
123+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
119124
serialized_point_msg.get_rcl_serialized_message().buffer[i] = search_point_byte[i];
125+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
120126
}
121127
geometry_msgs::msg::Point search_point;
122128
static rclcpp::Serialization<geometry_msgs::msg::Point> serializer_point;
@@ -137,7 +143,9 @@ double getLateralDistanceToCenterline(
137143
serialized_msg.reserve(message_header_length + pose_byte.size());
138144
serialized_msg.get_rcl_serialized_message().buffer_length = pose_byte.size();
139145
for (size_t i = 0; i < pose_byte.size(); ++i) {
146+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
140147
serialized_msg.get_rcl_serialized_message().buffer[i] = pose_byte[i];
148+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
141149
}
142150
geometry_msgs::msg::Pose pose;
143151
static rclcpp::Serialization<geometry_msgs::msg::Pose> serializer;
@@ -153,7 +161,9 @@ double getLateralDistanceToClosestLanelet(
153161
serialized_msg.reserve(message_header_length + pose_byte.size());
154162
serialized_msg.get_rcl_serialized_message().buffer_length = pose_byte.size();
155163
for (size_t i = 0; i < pose_byte.size(); ++i) {
164+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
156165
serialized_msg.get_rcl_serialized_message().buffer[i] = pose_byte[i];
166+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
157167
}
158168
geometry_msgs::msg::Pose pose;
159169
static rclcpp::Serialization<geometry_msgs::msg::Pose> serializer;
@@ -180,9 +190,8 @@ lanelet::Optional<lanelet::ConstLanelet> getLinkedLanelet(
180190
if (lanelet::utils::query::getLinkedLanelet(
181191
parking_space, all_road_lanelets, all_parking_lots, &linked_lanelet)) {
182192
return linked_lanelet;
183-
} else {
184-
return {};
185193
}
194+
return {};
186195
}
187196

188197
lanelet::Optional<lanelet::ConstLanelet> getLinkedLanelet(
@@ -192,9 +201,8 @@ lanelet::Optional<lanelet::ConstLanelet> getLinkedLanelet(
192201
lanelet::ConstLanelet linked_lanelet;
193202
if (lanelet::utils::query::getLinkedLanelet(parking_space, lanelet_map_ptr, &linked_lanelet)) {
194203
return linked_lanelet;
195-
} else {
196-
return {};
197204
}
205+
return {};
198206
}
199207

200208
lanelet::Optional<lanelet::ConstPolygon3d> getLinkedParkingLot(
@@ -203,9 +211,8 @@ lanelet::Optional<lanelet::ConstPolygon3d> getLinkedParkingLot(
203211
lanelet::ConstPolygon3d linked_parking_lot;
204212
if (lanelet::utils::query::getLinkedParkingLot(lanelet, all_parking_lots, &linked_parking_lot)) {
205213
return linked_parking_lot;
206-
} else {
207-
return {};
208214
}
215+
return {};
209216
}
210217

211218
lanelet::Optional<lanelet::ConstPolygon3d> getLinkedParkingLot(
@@ -215,9 +222,8 @@ lanelet::Optional<lanelet::ConstPolygon3d> getLinkedParkingLot(
215222
if (lanelet::utils::query::getLinkedParkingLot(
216223
current_position, all_parking_lots, &linked_parking_lot)) {
217224
return linked_parking_lot;
218-
} else {
219-
return {};
220225
}
226+
return {};
221227
}
222228

223229
lanelet::Optional<lanelet::ConstPolygon3d> getLinkedParkingLot(
@@ -228,9 +234,8 @@ lanelet::Optional<lanelet::ConstPolygon3d> getLinkedParkingLot(
228234
if (lanelet::utils::query::getLinkedParkingLot(
229235
parking_space, all_parking_lots, &linked_parking_lot)) {
230236
return linked_parking_lot;
231-
} else {
232-
return {};
233237
}
238+
return {};
234239
}
235240

236241
lanelet::ConstLanelets getLaneletsWithinRange_point(
@@ -241,7 +246,9 @@ lanelet::ConstLanelets getLaneletsWithinRange_point(
241246
serialized_msg.reserve(message_header_length + point_byte.size());
242247
serialized_msg.get_rcl_serialized_message().buffer_length = point_byte.size();
243248
for (size_t i = 0; i < point_byte.size(); ++i) {
249+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
244250
serialized_msg.get_rcl_serialized_message().buffer[i] = point_byte[i];
251+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
245252
}
246253
geometry_msgs::msg::Point point;
247254
static rclcpp::Serialization<geometry_msgs::msg::Point> serializer;
@@ -258,7 +265,9 @@ lanelet::ConstLanelets getLaneChangeableNeighbors_point(
258265
serialized_msg.reserve(message_header_length + point_byte.size());
259266
serialized_msg.get_rcl_serialized_message().buffer_length = point_byte.size();
260267
for (size_t i = 0; i < point_byte.size(); ++i) {
268+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
261269
serialized_msg.get_rcl_serialized_message().buffer[i] = point_byte[i];
270+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
262271
}
263272
geometry_msgs::msg::Point point;
264273
static rclcpp::Serialization<geometry_msgs::msg::Point> serializer;
@@ -275,7 +284,9 @@ lanelet::ConstLanelets getAllNeighbors_point(
275284
serialized_msg.reserve(message_header_length + point_byte.size());
276285
serialized_msg.get_rcl_serialized_message().buffer_length = point_byte.size();
277286
for (size_t i = 0; i < point_byte.size(); ++i) {
287+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
278288
serialized_msg.get_rcl_serialized_message().buffer[i] = point_byte[i];
289+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
279290
}
280291
geometry_msgs::msg::Point point;
281292
static rclcpp::Serialization<geometry_msgs::msg::Point> serializer;
@@ -291,17 +302,18 @@ lanelet::Optional<lanelet::ConstLanelet> getClosestLanelet(
291302
serialized_msg.reserve(message_header_length + pose_byte.size());
292303
serialized_msg.get_rcl_serialized_message().buffer_length = pose_byte.size();
293304
for (size_t i = 0; i < pose_byte.size(); ++i) {
305+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
294306
serialized_msg.get_rcl_serialized_message().buffer[i] = pose_byte[i];
307+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
295308
}
296309
geometry_msgs::msg::Pose pose;
297310
static rclcpp::Serialization<geometry_msgs::msg::Pose> serializer;
298311
serializer.deserialize_message(&serialized_msg, &pose);
299312
lanelet::ConstLanelet closest_lanelet{};
300313
if (lanelet::utils::query::getClosestLanelet(lanelets, pose, &closest_lanelet)) {
301314
return closest_lanelet;
302-
} else {
303-
return {};
304315
}
316+
return {};
305317
}
306318

307319
lanelet::Optional<lanelet::ConstLanelet> getClosestLaneletWithConstrains(
@@ -314,7 +326,9 @@ lanelet::Optional<lanelet::ConstLanelet> getClosestLaneletWithConstrains(
314326
serialized_msg.reserve(message_header_length + pose_byte.size());
315327
serialized_msg.get_rcl_serialized_message().buffer_length = pose_byte.size();
316328
for (size_t i = 0; i < pose_byte.size(); ++i) {
329+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
317330
serialized_msg.get_rcl_serialized_message().buffer[i] = pose_byte[i];
331+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
318332
}
319333
geometry_msgs::msg::Pose pose;
320334
static rclcpp::Serialization<geometry_msgs::msg::Pose> serializer;
@@ -323,9 +337,8 @@ lanelet::Optional<lanelet::ConstLanelet> getClosestLaneletWithConstrains(
323337
if (lanelet::utils::query::getClosestLaneletWithConstrains(
324338
lanelets, pose, &closest_lanelet, dist_threshold, yaw_threshold)) {
325339
return closest_lanelet;
326-
} else {
327-
return {};
328340
}
341+
return {};
329342
}
330343

331344
lanelet::ConstLanelets getCurrentLanelets_point(
@@ -336,7 +349,9 @@ lanelet::ConstLanelets getCurrentLanelets_point(
336349
serialized_msg.reserve(message_header_length + point_byte.size());
337350
serialized_msg.get_rcl_serialized_message().buffer_length = point_byte.size();
338351
for (size_t i = 0; i < point_byte.size(); ++i) {
352+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
339353
serialized_msg.get_rcl_serialized_message().buffer[i] = point_byte[i];
354+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
340355
}
341356
geometry_msgs::msg::Point point;
342357
static rclcpp::Serialization<geometry_msgs::msg::Point> serializer;
@@ -354,7 +369,9 @@ lanelet::ConstLanelets getCurrentLanelets_pose(
354369
serialized_msg.reserve(message_header_length + pose_byte.size());
355370
serialized_msg.get_rcl_serialized_message().buffer_length = pose_byte.size();
356371
for (size_t i = 0; i < pose_byte.size(); ++i) {
372+
// NOLINTBEGIN(cppcoreguidelines-pro-bounds-pointer-arithmetic)
357373
serialized_msg.get_rcl_serialized_message().buffer[i] = pose_byte[i];
374+
// NOLINTEND(cppcoreguidelines-pro-bounds-pointer-arithmetic)
358375
}
359376
geometry_msgs::msg::Pose pose;
360377
static rclcpp::Serialization<geometry_msgs::msg::Pose> serializer;
@@ -368,6 +385,7 @@ lanelet::ConstLanelets getCurrentLanelets_pose(
368385

369386
// for handling functions with default arguments
370387
/// utilities.cpp
388+
// NOLINTBEGIN
371389
BOOST_PYTHON_FUNCTION_OVERLOADS(
372390
generateFineCenterline_overload, lanelet::utils::generateFineCenterline, 1, 2)
373391
BOOST_PYTHON_FUNCTION_OVERLOADS(
@@ -387,6 +405,7 @@ BOOST_PYTHON_FUNCTION_OVERLOADS(
387405
getClosestLaneletWithConstrains_overload, ::getClosestLaneletWithConstrains, 2, 4)
388406
BOOST_PYTHON_FUNCTION_OVERLOADS(
389407
getPrecedingLaneletSequences_overload, lanelet::utils::query::getPrecedingLaneletSequences, 3, 4)
408+
// NOLINTEND
390409

391410
BOOST_PYTHON_MODULE(_lanelet2_extension_python_boost_python_utility)
392411
{

0 commit comments

Comments
 (0)