@@ -259,9 +259,78 @@ std::vector<TrajectoryPoint> PlannerInterface::generateStopTrajectory(
259
259
rclcpp::get_logger (" ObstacleCruisePlanner::PIDBasedPlanner" ), enable_debug_info_,
260
260
" stop planning" );
261
261
262
- // Get Closest Stop Obstacle
263
- const auto closest_stop_obstacle = obstacle_cruise_utils::getClosestStopObstacle (stop_obstacles);
264
- if (!closest_stop_obstacle) {
262
+ std::optional<StopObstacle> determined_stop_obstacle{};
263
+ std::optional<double > determined_zero_vel_dist{};
264
+ std::optional<double > determined_desired_margin{};
265
+ // std::optional<bool> will_collide_with_obstacle{};
266
+ for (const auto & type_specified_param : stop_param_.type_specified_param_list ) {
267
+ // stop_obstacles had been sorted by dist_to_collide_on_decimated_traj
268
+ for (const auto & stop_obstacle : stop_obstacles) {
269
+ if (stop_param_.getParamType (stop_obstacle.classification ) != type_specified_param.first ) {
270
+ continue ;
271
+ }
272
+ const auto ego_segment_idx =
273
+ ego_nearest_param_.findSegmentIndex (planner_data.traj_points , planner_data.ego_pose );
274
+ const double dist_to_collide_on_ref_traj =
275
+ motion_utils::calcSignedArcLength (planner_data.traj_points , 0 , ego_segment_idx) +
276
+ stop_obstacle.dist_to_collide_on_decimated_traj ;
277
+
278
+ const double desired_margin = [&]() {
279
+ const double margin_from_obstacle =
280
+ calculateMarginFromObstacleOnCurve (planner_data, stop_obstacle);
281
+ // Use terminal margin (terminal_safe_distance_margin) for obstacle stop
282
+ const auto ref_traj_length = motion_utils::calcSignedArcLength (
283
+ planner_data.traj_points , 0 , planner_data.traj_points .size () - 1 );
284
+ if (dist_to_collide_on_ref_traj > ref_traj_length) {
285
+ return longitudinal_info_.terminal_safe_distance_margin ;
286
+ }
287
+
288
+ // If behavior stop point is ahead of the closest_obstacle_stop point within a certain
289
+ // margin we set closest_obstacle_stop_distance to closest_behavior_stop_distance
290
+ const auto closest_behavior_stop_idx =
291
+ motion_utils::searchZeroVelocityIndex (planner_data.traj_points , ego_segment_idx + 1 );
292
+ if (closest_behavior_stop_idx) {
293
+ const double closest_behavior_stop_dist_on_ref_traj = motion_utils::calcSignedArcLength (
294
+ planner_data.traj_points , 0 , *closest_behavior_stop_idx);
295
+ const double stop_dist_diff = closest_behavior_stop_dist_on_ref_traj -
296
+ (dist_to_collide_on_ref_traj - margin_from_obstacle);
297
+ if (0.0 < stop_dist_diff && stop_dist_diff < margin_from_obstacle) {
298
+ return min_behavior_stop_margin_;
299
+ }
300
+ }
301
+ return margin_from_obstacle;
302
+ }();
303
+
304
+ // calc stop point against the obstacle
305
+ double candidate_zero_vel_dist = std::max (0.0 , dist_to_collide_on_ref_traj - desired_margin);
306
+ if (suppress_sudden_obstacle_stop_) {
307
+ const double acceptable_stop_dist =
308
+ calcMinimumDistanceToStop (
309
+ planner_data.ego_vel , longitudinal_info_.limit_max_accel ,
310
+ type_specified_param.second .limit_min_acc ) +
311
+ motion_utils::calcSignedArcLength (
312
+ planner_data.traj_points , 0 , planner_data.ego_pose .position );
313
+
314
+ if (acceptable_stop_dist > candidate_zero_vel_dist) {
315
+ if (type_specified_param.second .abandon_to_stop && acceptable_stop_dist > dist_to_collide_on_ref_traj) {
316
+ RCLCPP_WARN (
317
+ rclcpp::get_logger (" ObstacleCruisePlanner::StopPlanner" ),
318
+ " [Cruise] abandon to stop against %s object" , type_specified_param.first .c_str ());
319
+ continue ;
320
+ }
321
+ candidate_zero_vel_dist = acceptable_stop_dist;
322
+ }
323
+ }
324
+ if (!determined_zero_vel_dist || candidate_zero_vel_dist < determined_zero_vel_dist) {
325
+ determined_zero_vel_dist = candidate_zero_vel_dist;
326
+ determined_stop_obstacle = stop_obstacle;
327
+ determined_desired_margin = desired_margin;
328
+ break ;
329
+ }
330
+ }
331
+ }
332
+
333
+ if (!determined_zero_vel_dist) {
265
334
// delete marker
266
335
const auto markers =
267
336
motion_utils::createDeletedStopVirtualWallMarker (planner_data.current_time , 0 );
@@ -271,117 +340,75 @@ std::vector<TrajectoryPoint> PlannerInterface::generateStopTrajectory(
271
340
return planner_data.traj_points ;
272
341
}
273
342
274
- const auto ego_segment_idx =
275
- ego_nearest_param_.findSegmentIndex (planner_data.traj_points , planner_data.ego_pose );
276
- const double dist_to_collide_on_ref_traj =
277
- motion_utils::calcSignedArcLength (planner_data.traj_points , 0 , ego_segment_idx) +
278
- closest_stop_obstacle->dist_to_collide_on_decimated_traj ;
279
-
280
- const double margin_from_obstacle_considering_behavior_module = [&]() {
281
- const double margin_from_obstacle =
282
- calculateMarginFromObstacleOnCurve (planner_data, *closest_stop_obstacle);
283
- // Use terminal margin (terminal_safe_distance_margin) for obstacle stop
284
- const auto ref_traj_length = motion_utils::calcSignedArcLength (
285
- planner_data.traj_points , 0 , planner_data.traj_points .size () - 1 );
286
- if (dist_to_collide_on_ref_traj > ref_traj_length) {
287
- return longitudinal_info_.terminal_safe_distance_margin ;
288
- }
289
-
290
- // If behavior stop point is ahead of the closest_obstacle_stop point within a certain margin
291
- // we set closest_obstacle_stop_distance to closest_behavior_stop_distance
292
- const auto closest_behavior_stop_idx =
293
- motion_utils::searchZeroVelocityIndex (planner_data.traj_points , ego_segment_idx + 1 );
294
- if (closest_behavior_stop_idx) {
295
- const double closest_behavior_stop_dist_on_ref_traj =
296
- motion_utils::calcSignedArcLength (planner_data.traj_points , 0 , *closest_behavior_stop_idx);
297
- const double stop_dist_diff = closest_behavior_stop_dist_on_ref_traj -
298
- (dist_to_collide_on_ref_traj - margin_from_obstacle);
299
- if (0.0 < stop_dist_diff && stop_dist_diff < margin_from_obstacle) {
300
- return min_behavior_stop_margin_;
301
- }
302
- }
303
- return margin_from_obstacle;
304
- }();
305
-
306
- // Generate Output Trajectory
307
- const auto [zero_vel_dist, will_collide_with_obstacle] = [&]() {
308
- double candidate_zero_vel_dist =
309
- std::max (0.0 , dist_to_collide_on_ref_traj - margin_from_obstacle_considering_behavior_module);
310
-
311
- // Check feasibility to stop
312
- if (suppress_sudden_obstacle_stop_) {
313
- // Calculate feasible stop margin (Check the feasibility)
314
- const double feasible_stop_dist =
315
- calcMinimumDistanceToStop (
316
- planner_data.ego_vel , longitudinal_info_.limit_max_accel ,
317
- longitudinal_info_.limit_min_accel ) +
318
- motion_utils::calcSignedArcLength (
319
- planner_data.traj_points , 0 , planner_data.ego_pose .position );
320
-
321
- if (candidate_zero_vel_dist < feasible_stop_dist) {
322
- candidate_zero_vel_dist = feasible_stop_dist;
323
- return std::make_pair (candidate_zero_vel_dist, true );
324
- }
325
- }
326
-
327
- // Hold previous stop distance if necessary
343
+ // Hold previous stop distance if necessary
344
+ if (
345
+ std::abs (planner_data.ego_vel ) < longitudinal_info_.hold_stop_velocity_threshold &&
346
+ prev_stop_distance_info_) {
347
+ // NOTE: We assume that the current trajectory's front point is ahead of the previous
348
+ // trajectory's front point.
349
+ const size_t traj_front_point_prev_seg_idx =
350
+ motion_utils::findFirstNearestSegmentIndexWithSoftConstraints (
351
+ prev_stop_distance_info_->first , planner_data.traj_points .front ().pose );
352
+ const double diff_dist_front_points = motion_utils::calcSignedArcLength (
353
+ prev_stop_distance_info_->first , 0 , planner_data.traj_points .front ().pose .position ,
354
+ traj_front_point_prev_seg_idx);
355
+
356
+ const double prev_zero_vel_dist = prev_stop_distance_info_->second - diff_dist_front_points;
328
357
if (
329
- std::abs (planner_data.ego_vel ) < longitudinal_info_.hold_stop_velocity_threshold &&
330
- prev_stop_distance_info_) {
331
- // NOTE: We assume that the current trajectory's front point is ahead of the previous
332
- // trajectory's front point.
333
- const size_t traj_front_point_prev_seg_idx =
334
- motion_utils::findFirstNearestSegmentIndexWithSoftConstraints (
335
- prev_stop_distance_info_->first , planner_data.traj_points .front ().pose );
336
- const double diff_dist_front_points = motion_utils::calcSignedArcLength (
337
- prev_stop_distance_info_->first , 0 , planner_data.traj_points .front ().pose .position ,
338
- traj_front_point_prev_seg_idx);
339
-
340
- const double prev_zero_vel_dist = prev_stop_distance_info_->second - diff_dist_front_points;
341
- if (
342
- std::abs (prev_zero_vel_dist - candidate_zero_vel_dist) <
343
- longitudinal_info_.hold_stop_distance_threshold ) {
344
- candidate_zero_vel_dist = prev_zero_vel_dist;
345
- }
358
+ std::abs (prev_zero_vel_dist - determined_zero_vel_dist.value ()) <
359
+ longitudinal_info_.hold_stop_distance_threshold ) {
360
+ determined_zero_vel_dist.value () = prev_zero_vel_dist;
346
361
}
347
- return std::make_pair (candidate_zero_vel_dist, false );
348
- }();
362
+ }
349
363
350
364
// Insert stop point
351
365
auto output_traj_points = planner_data.traj_points ;
352
- const auto zero_vel_idx = motion_utils::insertStopPoint (0 , zero_vel_dist, output_traj_points);
366
+ const auto zero_vel_idx =
367
+ motion_utils::insertStopPoint (0 , determined_zero_vel_dist.value (), output_traj_points);
353
368
if (zero_vel_idx) {
354
369
// virtual wall marker for stop obstacle
355
370
const auto markers = motion_utils::createStopVirtualWallMarker (
356
371
output_traj_points.at (*zero_vel_idx).pose , " obstacle stop" , planner_data.current_time , 0 ,
357
372
abs_ego_offset, " " , planner_data.is_driving_forward );
358
373
tier4_autoware_utils::appendMarkerArray (markers, &debug_data_ptr_->stop_wall_marker );
359
- debug_data_ptr_->obstacles_to_stop .push_back (*closest_stop_obstacle );
374
+ debug_data_ptr_->obstacles_to_stop .push_back (*determined_stop_obstacle );
360
375
361
376
// Publish Stop Reason
362
377
const auto stop_pose = output_traj_points.at (*zero_vel_idx).pose ;
363
378
const auto stop_reasons_msg =
364
- makeStopReasonArray (planner_data, stop_pose, *closest_stop_obstacle );
379
+ makeStopReasonArray (planner_data, stop_pose, *determined_stop_obstacle );
365
380
stop_reasons_pub_->publish (stop_reasons_msg);
366
381
velocity_factors_pub_->publish (makeVelocityFactorArray (planner_data.current_time , stop_pose));
367
382
368
- // Publish if ego vehicle collides with the obstacle with a limit acceleration
383
+ // Publish if ego vehicle will over run against the stop point with a limit acceleration
384
+ const bool will_over_run = determined_stop_obstacle->dist_to_collide_on_decimated_traj -
385
+ determined_zero_vel_dist.value () <
386
+ determined_desired_margin.value ();
369
387
const auto stop_speed_exceeded_msg =
370
- createStopSpeedExceededMsg (planner_data.current_time , will_collide_with_obstacle );
388
+ createStopSpeedExceededMsg (planner_data.current_time , will_over_run );
371
389
stop_speed_exceeded_pub_->publish (stop_speed_exceeded_msg);
372
390
373
- prev_stop_distance_info_ = std::make_pair (output_traj_points, zero_vel_dist );
391
+ prev_stop_distance_info_ = std::make_pair (output_traj_points, determined_zero_vel_dist. value () );
374
392
}
375
393
376
394
stop_planning_debug_info_.set (
377
395
StopPlanningDebugInfo::TYPE::STOP_CURRENT_OBSTACLE_DISTANCE,
378
- closest_stop_obstacle ->dist_to_collide_on_decimated_traj );
396
+ determined_stop_obstacle ->dist_to_collide_on_decimated_traj );
379
397
stop_planning_debug_info_.set (
380
- StopPlanningDebugInfo::TYPE::STOP_CURRENT_OBSTACLE_VELOCITY, closest_stop_obstacle->velocity );
398
+ StopPlanningDebugInfo::TYPE::STOP_CURRENT_OBSTACLE_VELOCITY,
399
+ determined_stop_obstacle->velocity );
381
400
401
+ // compatible implementation to the exsiting code is the choice 1, but should we change it to the
402
+ // choice2?
403
+ // choice 1
382
404
stop_planning_debug_info_.set (
383
- StopPlanningDebugInfo::TYPE::STOP_TARGET_OBSTACLE_DISTANCE,
384
- margin_from_obstacle_considering_behavior_module);
405
+ StopPlanningDebugInfo::TYPE::STOP_TARGET_OBSTACLE_DISTANCE, determined_desired_margin.value ());
406
+ // choice 2
407
+ // stop_planning_debug_info_.set(
408
+ // StopPlanningDebugInfo::TYPE::STOP_TARGET_OBSTACLE_DISTANCE,
409
+ // determined_stop_obstacle->dist_to_collide_on_decimated_traj -
410
+ // determined_zero_vel_dist.value());
411
+
385
412
stop_planning_debug_info_.set (StopPlanningDebugInfo::TYPE::STOP_TARGET_VELOCITY, 0.0 );
386
413
stop_planning_debug_info_.set (StopPlanningDebugInfo::TYPE::STOP_TARGET_ACCELERATION, 0.0 );
387
414
0 commit comments