@@ -184,6 +184,88 @@ Polygon2d createExtendedPolygon(
184
184
: tier4_autoware_utils::inverseClockwise (polygon);
185
185
}
186
186
187
+ Polygon2d createExtendedPolygonAlongPath (
188
+ const PathWithLaneId & planned_path, const Pose & base_link_pose,
189
+ const vehicle_info_util::VehicleInfo & vehicle_info, const double lon_length,
190
+ const double lat_margin, const double is_stopped_obj, CollisionCheckDebug & debug)
191
+ {
192
+ const double & base_to_front = vehicle_info.max_longitudinal_offset_m ;
193
+ const double & width = vehicle_info.vehicle_width_m ;
194
+ const double & base_to_rear = vehicle_info.rear_overhang_m ;
195
+
196
+ // if stationary object, extend forward and backward by the half of lon length
197
+ const double forward_lon_offset = base_to_front + (is_stopped_obj ? lon_length / 2 : lon_length);
198
+ const double backward_lon_offset =
199
+ -base_to_rear - (is_stopped_obj ? lon_length / 2 : 0 ); // minus value
200
+ const double lat_offset = width / 2.0 + lat_margin;
201
+
202
+ {
203
+ debug.forward_lon_offset = forward_lon_offset;
204
+ debug.backward_lon_offset = backward_lon_offset;
205
+ debug.lat_offset = lat_offset;
206
+ }
207
+
208
+ const auto lon_offset_pose = motion_utils::calcLongitudinalOffsetPose (
209
+ planned_path.points , base_link_pose.position , lon_length);
210
+ if (!lon_offset_pose.has_value ()) {
211
+ return createExtendedPolygon (
212
+ base_link_pose, vehicle_info, lon_length, lat_margin, is_stopped_obj, debug);
213
+ }
214
+
215
+ const size_t start_idx =
216
+ motion_utils::findNearestSegmentIndex (planned_path.points , base_link_pose.position );
217
+ const size_t end_idx =
218
+ motion_utils::findNearestSegmentIndex (planned_path.points , lon_offset_pose.value ().position );
219
+
220
+ Polygon2d polygon;
221
+
222
+ {
223
+ const auto p_offset =
224
+ tier4_autoware_utils::calcOffsetPose (base_link_pose, backward_lon_offset, lat_offset, 0.0 );
225
+ appendPointToPolygon (polygon, p_offset.position );
226
+ }
227
+
228
+ for (size_t i = start_idx + 1 ; i < end_idx + 1 ; ++i) {
229
+ const auto p = tier4_autoware_utils::getPose (planned_path.points .at (i));
230
+ const auto p_offset = tier4_autoware_utils::calcOffsetPose (p, 0.0 , lat_offset, 0.0 );
231
+ appendPointToPolygon (polygon, p_offset.position );
232
+ }
233
+
234
+ {
235
+ const auto p_offset =
236
+ tier4_autoware_utils::calcOffsetPose (lon_offset_pose.value (), base_to_front, lat_offset, 0.0 );
237
+ appendPointToPolygon (polygon, p_offset.position );
238
+ }
239
+
240
+ {
241
+ const auto p_offset = tier4_autoware_utils::calcOffsetPose (
242
+ lon_offset_pose.value (), base_to_front, -lat_offset, 0.0 );
243
+ appendPointToPolygon (polygon, p_offset.position );
244
+ }
245
+
246
+ for (size_t i = end_idx; i > start_idx; --i) {
247
+ const auto p = tier4_autoware_utils::getPose (planned_path.points .at (i));
248
+ const auto p_offset = tier4_autoware_utils::calcOffsetPose (p, 0.0 , -lat_offset, 0.0 );
249
+ appendPointToPolygon (polygon, p_offset.position );
250
+ }
251
+
252
+ {
253
+ const auto p_offset =
254
+ tier4_autoware_utils::calcOffsetPose (base_link_pose, backward_lon_offset, -lat_offset, 0.0 );
255
+ appendPointToPolygon (polygon, p_offset.position );
256
+ }
257
+
258
+ {
259
+ const auto p_offset =
260
+ tier4_autoware_utils::calcOffsetPose (base_link_pose, backward_lon_offset, lat_offset, 0.0 );
261
+ appendPointToPolygon (polygon, p_offset.position );
262
+ }
263
+
264
+ return tier4_autoware_utils::isClockwise (polygon)
265
+ ? polygon
266
+ : tier4_autoware_utils::inverseClockwise (polygon);
267
+ }
268
+
187
269
std::vector<Polygon2d> createExtendedPolygonsFromPoseWithVelocityStamped (
188
270
const std::vector<PoseWithVelocityStamped> & predicted_path, const VehicleInfo & vehicle_info,
189
271
const double forward_margin, const double backward_margin, const double lat_margin)
@@ -552,10 +634,24 @@ std::vector<Polygon2d> getCollidedPolygons(
552
634
const auto & lat_margin = rss_parameters.lateral_distance_max_threshold * hysteresis_factor;
553
635
// TODO(watanabe) fix hard coding value
554
636
const bool is_stopped_object = object_velocity < 0.3 ;
555
- const auto & extended_ego_polygon = is_object_front ? createExtendedPolygon (
556
- ego_pose, ego_vehicle_info, lon_offset,
557
- lat_margin, is_stopped_object, debug)
558
- : ego_polygon;
637
+ const auto extended_ego_polygon = [&]() {
638
+ if (!is_object_front) {
639
+ return ego_polygon;
640
+ }
641
+
642
+ if (rss_parameters.extended_polygon_policy == " rectangle" ) {
643
+ return createExtendedPolygon (
644
+ ego_pose, ego_vehicle_info, lon_offset, lat_margin, is_stopped_object, debug);
645
+ }
646
+
647
+ if (rss_parameters.extended_polygon_policy == " along_path" ) {
648
+ return createExtendedPolygonAlongPath (
649
+ planned_path, ego_pose, ego_vehicle_info, lon_offset, lat_margin, is_stopped_object,
650
+ debug);
651
+ }
652
+
653
+ throw std::domain_error (" invalid rss parameter. please select 'rectangle' or 'along_path'." );
654
+ }();
559
655
const auto & extended_obj_polygon =
560
656
is_object_front
561
657
? obj_polygon
0 commit comments