1616
1717#include < autoware/lanelet2_utils/conversion.hpp>
1818#include < autoware/lanelet2_utils/geometry.hpp>
19+ #include < autoware/lanelet2_utils/nn_search.hpp>
1920#include < autoware/motion_utils/trajectory/trajectory.hpp>
2021#include < autoware_utils/geometry/geometry.hpp>
2122#include < autoware_utils/ros/uuid_helper.hpp>
@@ -241,7 +242,7 @@ PredictedObject convertToPredictedObject(const TrackedObject & tracked_object)
241242}
242243
243244double calculateLocalLikelihood (
244- const lanelet::Lanelet & current_lanelet, const TrackedObject & object,
245+ const lanelet::ConstLanelet & current_lanelet, const TrackedObject & object,
245246 const double sigma_lateral_offset, const double sigma_yaw_angle_deg)
246247{
247248 const auto & obj_point = object.kinematics .pose_with_covariance .pose .position ;
@@ -311,7 +312,7 @@ bool isDuplicated(
311312}
312313
313314bool checkCloseLaneletCondition (
314- const std::pair<double , lanelet::Lanelet > & lanelet, const TrackedObject & object,
315+ const std::pair<double , lanelet::ConstLanelet > & lanelet, const TrackedObject & object,
315316 const std::unordered_map<std::string, std::deque<RoadUser>> & road_users_history,
316317 const double dist_threshold_for_searching_lanelet,
317318 const double delta_yaw_threshold_for_searching_lanelet)
@@ -413,8 +414,12 @@ LaneletsData getCurrentLanelets(
413414 object.kinematics .pose_with_covariance .pose .position .y );
414415
415416 // nearest lanelet
416- std::vector<std::pair<double , lanelet::Lanelet>> surrounding_lanelets =
417- lanelet::geometry::findNearest (lanelet_map_ptr->laneletLayer , search_point, 10 );
417+ // NOTE: Search for nearest lanelets considering 3D distances.
418+ // Because lanelet::geometry::findNearest considers only 2D space, it increases computation
419+ // costs when lanelets are overlapped in 3D space.
420+ const std::vector<std::pair<double , lanelet::ConstLanelet>> surrounding_lanelets =
421+ experimental::lanelet2_utils::find_nearest (
422+ lanelet_map_ptr->laneletLayer , object.kinematics .pose_with_covariance .pose , 10 );
418423
419424 { // Step 1. Search same directional lanelets
420425 // No Closest Lanelets
@@ -423,7 +428,7 @@ LaneletsData getCurrentLanelets(
423428 }
424429
425430 LaneletsData object_lanelets;
426- std::optional<std::pair<double , lanelet::Lanelet >> closest_lanelet{std::nullopt };
431+ std::optional<std::pair<double , lanelet::ConstLanelet >> closest_lanelet{std::nullopt };
427432 for (const auto & lanelet : surrounding_lanelets) {
428433 // Check if the close lanelets meet the necessary condition for start lanelets and
429434 // Check if similar lanelet is inside the object lanelet
@@ -445,8 +450,9 @@ LaneletsData getCurrentLanelets(
445450 constexpr double epsilon = 1e-3 ;
446451 if (lanelet.first < epsilon) {
447452 const auto object_lanelet = LaneletData{
448- lanelet.second , utils::calculateLocalLikelihood (
449- lanelet.second , object, sigma_lateral_offset, sigma_yaw_angle_deg)};
453+ experimental::lanelet2_utils::remove_const (lanelet.second ),
454+ utils::calculateLocalLikelihood (
455+ lanelet.second , object, sigma_lateral_offset, sigma_yaw_angle_deg)};
450456 object_lanelets.push_back (object_lanelet);
451457 }
452458 }
@@ -456,7 +462,7 @@ LaneletsData getCurrentLanelets(
456462 }
457463 if (closest_lanelet) {
458464 return LaneletsData{LaneletData{
459- closest_lanelet->second ,
465+ experimental::lanelet2_utils::remove_const ( closest_lanelet->second ) ,
460466 utils::calculateLocalLikelihood (
461467 closest_lanelet->second , object, sigma_lateral_offset, sigma_yaw_angle_deg)}};
462468 }
0 commit comments