@@ -301,27 +301,38 @@ std::vector<TrajectoryPoint> PlannerInterface::generateStopTrajectory(
301
301
// calc stop point against the obstacle
302
302
double candidate_zero_vel_dist = std::max (0.0 , dist_to_collide_on_ref_traj - desired_margin);
303
303
if (suppress_sudden_obstacle_stop_) {
304
- const double acceptable_stop_dist = std::min (
305
- calcMinimumDistanceToStop (
306
- planner_data.ego_vel , longitudinal_info_.limit_max_accel ,
307
- stop_param_.getParam (stop_obstacle.classification ).limit_min_acc ),
308
- stop_param_.getParam (stop_obstacle.classification ).limit_max_dist );
309
-
310
- const double acceptable_stop_pos =
311
- motion_utils::calcSignedArcLength (
312
- planner_data.traj_points , 0 , planner_data.ego_pose .position ) +
313
- acceptable_stop_dist;
314
-
315
- if (acceptable_stop_pos > candidate_zero_vel_dist) {
316
- if (
317
- stop_param_.getParam (stop_obstacle.classification ).abandon_to_stop &&
318
- acceptable_stop_pos > dist_to_collide_on_ref_traj) {
304
+ const auto acceptable_stop_acc = [&]() -> std::optional<double > {
305
+ if (stop_param_.getParamType (stop_obstacle.classification ) == " default" ) {
306
+ return longitudinal_info_.limit_min_accel ;
307
+ }
308
+ const double distance_to_judge_suddenness = std::min (
309
+ calcMinimumDistanceToStop (
310
+ planner_data.ego_vel , longitudinal_info_.limit_max_accel ,
311
+ stop_param_.getParam (stop_obstacle.classification ).sudden_acc ),
312
+ stop_param_.getParam (stop_obstacle.classification ).sudden_dist );
313
+ if (candidate_zero_vel_dist > distance_to_judge_suddenness) {
314
+ return longitudinal_info_.limit_min_accel ;
315
+ }
316
+ if (stop_param_.getParam (stop_obstacle.classification ).abandon_to_stop ) {
319
317
RCLCPP_WARN (
320
318
rclcpp::get_logger (" ObstacleCruisePlanner::StopPlanner" ),
321
319
" [Cruise] abandon to stop against %s object" ,
322
320
stop_param_.types_maps .at (stop_obstacle.classification .label ).c_str ());
323
- continue ;
321
+ return std::nullopt;
322
+ } else {
323
+ return stop_param_.getParam (stop_obstacle.classification ).limit_min_acc ;
324
324
}
325
+ }();
326
+ if (!acceptable_stop_acc) {
327
+ continue ;
328
+ }
329
+
330
+ const double acceptable_stop_pos =
331
+ motion_utils::calcSignedArcLength (
332
+ planner_data.traj_points , 0 , planner_data.ego_pose .position ) +
333
+ calcMinimumDistanceToStop (
334
+ planner_data.ego_vel , longitudinal_info_.limit_max_accel , acceptable_stop_acc.value ());
335
+ if (acceptable_stop_pos > candidate_zero_vel_dist) {
325
336
candidate_zero_vel_dist = acceptable_stop_pos;
326
337
}
327
338
}
0 commit comments