Skip to content

Commit a363f9e

Browse files
zusizusia-maumaupre-commit-ci[bot]
authored
fix(detected_object_validation): use search for searching intersected lanelet (#1420)
fix(detected_object_validation): use search for searching intersected lanelet (autowarefoundation#8109) * refactor: use search method of lanelet * rm unuse and mod args * style(pre-commit): autofix --------- Signed-off-by: a-maumau <maumaumaumaumaumaumaumaumaumau@gmail.com> Co-authored-by: Masaki Baba <maumaumaumaumaumaumaumaumaumau@gmail.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
1 parent 69348a2 commit a363f9e

File tree

2 files changed

+38
-28
lines changed

2 files changed

+38
-28
lines changed

perception/detected_object_validation/include/detected_object_validation/detected_object_filter/object_lanelet_filter.hpp

+2-6
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@ class ObjectLaneletFilterNode : public rclcpp::Node
5555
std::unique_ptr<autoware::universe_utils::DebugPublisher> debug_publisher_{nullptr};
5656

5757
lanelet::LaneletMapPtr lanelet_map_ptr_;
58-
lanelet::ConstLanelets road_lanelets_;
59-
lanelet::ConstLanelets shoulder_lanelets_;
6058
std::string lanelet_frame_id_;
6159

6260
tf2_ros::Buffer tf_buffer_;
@@ -74,12 +72,10 @@ class ObjectLaneletFilterNode : public rclcpp::Node
7472
bool filterObject(
7573
const autoware_perception_msgs::msg::DetectedObject & transformed_object,
7674
const autoware_perception_msgs::msg::DetectedObject & input_object,
77-
const lanelet::ConstLanelets & intersected_road_lanelets,
78-
const lanelet::ConstLanelets & intersected_shoulder_lanelets,
75+
const lanelet::ConstLanelets & intersected_lanelets,
7976
autoware_perception_msgs::msg::DetectedObjects & output_object_msg);
8077
LinearRing2d getConvexHull(const autoware_perception_msgs::msg::DetectedObjects &);
81-
lanelet::ConstLanelets getIntersectedLanelets(
82-
const LinearRing2d &, const lanelet::ConstLanelets &);
78+
lanelet::ConstLanelets getIntersectedLanelets(const LinearRing2d &);
8379
bool isObjectOverlapLanelets(
8480
const autoware_perception_msgs::msg::DetectedObject & object,
8581
const lanelet::ConstLanelets & intersected_lanelets);

perception/detected_object_validation/src/object_lanelet_filter.cpp

+36-22
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
#include <boost/geometry/algorithms/disjoint.hpp>
2424
#include <boost/geometry/algorithms/intersects.hpp>
2525

26+
#include <lanelet2_core/geometry/BoundingBox.h>
27+
#include <lanelet2_core/geometry/LaneletMap.h>
2628
#include <lanelet2_core/geometry/Polygon.h>
2729

2830
namespace object_lanelet_filter
@@ -74,9 +76,6 @@ void ObjectLaneletFilterNode::mapCallback(
7476
lanelet_frame_id_ = map_msg->header.frame_id;
7577
lanelet_map_ptr_ = std::make_shared<lanelet::LaneletMap>();
7678
lanelet::utils::conversion::fromBinMsg(*map_msg, lanelet_map_ptr_);
77-
const lanelet::ConstLanelets all_lanelets = lanelet::utils::query::laneletLayer(lanelet_map_ptr_);
78-
road_lanelets_ = lanelet::utils::query::roadLanelets(all_lanelets);
79-
shoulder_lanelets_ = lanelet::utils::query::shoulderLanelets(all_lanelets);
8079
}
8180

8281
void ObjectLaneletFilterNode::objectCallback(
@@ -101,19 +100,15 @@ void ObjectLaneletFilterNode::objectCallback(
101100

102101
// calculate convex hull
103102
const auto convex_hull = getConvexHull(transformed_objects);
103+
104104
// get intersected lanelets
105-
lanelet::ConstLanelets intersected_road_lanelets =
106-
getIntersectedLanelets(convex_hull, road_lanelets_);
107-
lanelet::ConstLanelets intersected_shoulder_lanelets =
108-
getIntersectedLanelets(convex_hull, shoulder_lanelets_);
105+
lanelet::ConstLanelets intersected_lanelets = getIntersectedLanelets(convex_hull);
109106

110107
// filtering process
111108
for (size_t index = 0; index < transformed_objects.objects.size(); ++index) {
112109
const auto & transformed_object = transformed_objects.objects.at(index);
113110
const auto & input_object = input_msg->objects.at(index);
114-
filterObject(
115-
transformed_object, input_object, intersected_road_lanelets, intersected_shoulder_lanelets,
116-
output_object_msg);
111+
filterObject(transformed_object, input_object, intersected_lanelets, output_object_msg);
117112
}
118113
object_pub_->publish(output_object_msg);
119114
published_time_publisher_->publish_if_subscribed(object_pub_, output_object_msg.header.stamp);
@@ -131,8 +126,7 @@ void ObjectLaneletFilterNode::objectCallback(
131126
bool ObjectLaneletFilterNode::filterObject(
132127
const autoware_perception_msgs::msg::DetectedObject & transformed_object,
133128
const autoware_perception_msgs::msg::DetectedObject & input_object,
134-
const lanelet::ConstLanelets & intersected_road_lanelets,
135-
const lanelet::ConstLanelets & intersected_shoulder_lanelets,
129+
const lanelet::ConstLanelets & intersected_lanelets,
136130
autoware_perception_msgs::msg::DetectedObjects & output_object_msg)
137131
{
138132
const auto & label = transformed_object.classification.front().label;
@@ -141,8 +135,7 @@ bool ObjectLaneletFilterNode::filterObject(
141135
// 1. is polygon overlap with road lanelets or shoulder lanelets
142136
if (filter_settings_.polygon_overlap_filter) {
143137
const bool is_polygon_overlap =
144-
isObjectOverlapLanelets(transformed_object, intersected_road_lanelets) ||
145-
isObjectOverlapLanelets(transformed_object, intersected_shoulder_lanelets);
138+
isObjectOverlapLanelets(transformed_object, intersected_lanelets);
146139
filter_pass = filter_pass && is_polygon_overlap;
147140
}
148141

@@ -152,8 +145,7 @@ bool ObjectLaneletFilterNode::filterObject(
152145
autoware_perception_msgs::msg::TrackedObjectKinematics::UNAVAILABLE;
153146
if (filter_settings_.lanelet_direction_filter && !orientation_not_available) {
154147
const bool is_same_direction =
155-
isSameDirectionWithLanelets(intersected_road_lanelets, transformed_object) ||
156-
isSameDirectionWithLanelets(intersected_shoulder_lanelets, transformed_object);
148+
isSameDirectionWithLanelets(intersected_lanelets, transformed_object);
157149
filter_pass = filter_pass && is_same_direction;
158150
}
159151

@@ -212,18 +204,40 @@ LinearRing2d ObjectLaneletFilterNode::getConvexHull(
212204
return convex_hull;
213205
}
214206

207+
// fetch the intersected candidate lanelets with bounding box and then
208+
// check the intersections among the lanelets and the convex hull
215209
lanelet::ConstLanelets ObjectLaneletFilterNode::getIntersectedLanelets(
216-
const LinearRing2d & convex_hull, const lanelet::ConstLanelets & road_lanelets)
210+
const LinearRing2d & convex_hull)
217211
{
212+
namespace bg = boost::geometry;
213+
218214
lanelet::ConstLanelets intersected_lanelets;
219215

220-
// WARNING: This implementation currently iterate all lanelets, which could degrade performance
221-
// when handling large sized map.
222-
for (const auto & road_lanelet : road_lanelets) {
223-
if (boost::geometry::intersects(convex_hull, road_lanelet.polygon2d().basicPolygon())) {
224-
intersected_lanelets.emplace_back(road_lanelet);
216+
// convert convex_hull to a 2D bounding box for searching in the LaneletMap
217+
bg::model::box<bg::model::d2::point_xy<double>> bbox2d_convex_hull;
218+
bg::envelope(convex_hull, bbox2d_convex_hull);
219+
lanelet::BoundingBox2d bbox2d(
220+
lanelet::BasicPoint2d(
221+
bg::get<bg::min_corner, 0>(bbox2d_convex_hull),
222+
bg::get<bg::min_corner, 1>(bbox2d_convex_hull)),
223+
lanelet::BasicPoint2d(
224+
bg::get<bg::max_corner, 0>(bbox2d_convex_hull),
225+
bg::get<bg::max_corner, 1>(bbox2d_convex_hull)));
226+
227+
lanelet::Lanelets candidates_lanelets = lanelet_map_ptr_->laneletLayer.search(bbox2d);
228+
for (const auto & lanelet : candidates_lanelets) {
229+
// only check the road lanelets and road shoulder lanelets
230+
if (
231+
lanelet.hasAttribute(lanelet::AttributeName::Subtype) &&
232+
(lanelet.attribute(lanelet::AttributeName::Subtype).value() ==
233+
lanelet::AttributeValueString::Road ||
234+
lanelet.attribute(lanelet::AttributeName::Subtype).value() == "road_shoulder")) {
235+
if (boost::geometry::intersects(convex_hull, lanelet.polygon2d().basicPolygon())) {
236+
intersected_lanelets.emplace_back(lanelet);
237+
}
225238
}
226239
}
240+
227241
return intersected_lanelets;
228242
}
229243

0 commit comments

Comments
 (0)