23
23
#include < boost/geometry/algorithms/disjoint.hpp>
24
24
#include < boost/geometry/algorithms/intersects.hpp>
25
25
26
+ #include < lanelet2_core/geometry/BoundingBox.h>
27
+ #include < lanelet2_core/geometry/LaneletMap.h>
26
28
#include < lanelet2_core/geometry/Polygon.h>
27
29
28
30
namespace object_lanelet_filter
@@ -74,9 +76,6 @@ void ObjectLaneletFilterNode::mapCallback(
74
76
lanelet_frame_id_ = map_msg->header .frame_id ;
75
77
lanelet_map_ptr_ = std::make_shared<lanelet::LaneletMap>();
76
78
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);
80
79
}
81
80
82
81
void ObjectLaneletFilterNode::objectCallback (
@@ -101,19 +100,15 @@ void ObjectLaneletFilterNode::objectCallback(
101
100
102
101
// calculate convex hull
103
102
const auto convex_hull = getConvexHull (transformed_objects);
103
+
104
104
// 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);
109
106
110
107
// filtering process
111
108
for (size_t index = 0 ; index < transformed_objects.objects .size (); ++index ) {
112
109
const auto & transformed_object = transformed_objects.objects .at (index );
113
110
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);
117
112
}
118
113
object_pub_->publish (output_object_msg);
119
114
published_time_publisher_->publish_if_subscribed (object_pub_, output_object_msg.header .stamp );
@@ -131,8 +126,7 @@ void ObjectLaneletFilterNode::objectCallback(
131
126
bool ObjectLaneletFilterNode::filterObject (
132
127
const autoware_perception_msgs::msg::DetectedObject & transformed_object,
133
128
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,
136
130
autoware_perception_msgs::msg::DetectedObjects & output_object_msg)
137
131
{
138
132
const auto & label = transformed_object.classification .front ().label ;
@@ -141,8 +135,7 @@ bool ObjectLaneletFilterNode::filterObject(
141
135
// 1. is polygon overlap with road lanelets or shoulder lanelets
142
136
if (filter_settings_.polygon_overlap_filter ) {
143
137
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);
146
139
filter_pass = filter_pass && is_polygon_overlap;
147
140
}
148
141
@@ -152,8 +145,7 @@ bool ObjectLaneletFilterNode::filterObject(
152
145
autoware_perception_msgs::msg::TrackedObjectKinematics::UNAVAILABLE;
153
146
if (filter_settings_.lanelet_direction_filter && !orientation_not_available) {
154
147
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);
157
149
filter_pass = filter_pass && is_same_direction;
158
150
}
159
151
@@ -212,18 +204,40 @@ LinearRing2d ObjectLaneletFilterNode::getConvexHull(
212
204
return convex_hull;
213
205
}
214
206
207
+ // fetch the intersected candidate lanelets with bounding box and then
208
+ // check the intersections among the lanelets and the convex hull
215
209
lanelet::ConstLanelets ObjectLaneletFilterNode::getIntersectedLanelets (
216
- const LinearRing2d & convex_hull, const lanelet::ConstLanelets & road_lanelets )
210
+ const LinearRing2d & convex_hull)
217
211
{
212
+ namespace bg = boost::geometry;
213
+
218
214
lanelet::ConstLanelets intersected_lanelets;
219
215
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
+ }
225
238
}
226
239
}
240
+
227
241
return intersected_lanelets;
228
242
}
229
243
0 commit comments