@@ -815,12 +815,6 @@ ObstacleCruisePlannerNode::determineEgoBehaviorAgainstObstacles(
815
815
}
816
816
slow_down_condition_counter_.removeCounterUnlessUpdated ();
817
817
818
- std::sort (
819
- stop_obstacles.begin (), stop_obstacles.end (),
820
- [](const StopObstacle & o1, const StopObstacle & o2) {
821
- return o1.dist_to_collide_on_decimated_traj < o2.dist_to_collide_on_decimated_traj ;
822
- });
823
-
824
818
// Check target obstacles' consistency
825
819
checkConsistency (objects.header .stamp , objects, stop_obstacles);
826
820
@@ -1381,50 +1375,53 @@ void ObstacleCruisePlannerNode::checkConsistency(
1381
1375
const rclcpp::Time & current_time, const PredictedObjects & predicted_objects,
1382
1376
std::vector<StopObstacle> & stop_obstacles)
1383
1377
{
1384
- const auto current_closest_stop_obstacle =
1385
- obstacle_cruise_utils::getClosestStopObstacle (stop_obstacles);
1386
-
1387
- if (!prev_closest_stop_obstacle_ptr_) {
1388
- if (current_closest_stop_obstacle) {
1389
- prev_closest_stop_obstacle_ptr_ =
1390
- std::make_shared<StopObstacle>(*current_closest_stop_obstacle);
1378
+ std::vector<StopObstacle> current_closest_stop_obstacles{};
1379
+ std::sort (
1380
+ stop_obstacles.begin (), stop_obstacles.end (),
1381
+ [](const StopObstacle & o1, const StopObstacle & o2) {
1382
+ return o1.dist_to_collide_on_decimated_traj < o2.dist_to_collide_on_decimated_traj ;
1383
+ });
1384
+ for (const auto & stop_obstacle : stop_obstacles) {
1385
+ if (std::none_of (
1386
+ current_closest_stop_obstacles.begin (), current_closest_stop_obstacles.end (),
1387
+ [&stop_obstacle](StopObstacle & cco) {
1388
+ return cco.classification .label == stop_obstacle.classification .label ;
1389
+ })) {
1390
+ current_closest_stop_obstacles.push_back (stop_obstacle);
1391
1391
}
1392
- return ;
1393
1392
}
1394
1393
1395
- const auto predicted_object_itr = std::find_if (
1396
- predicted_objects.objects .begin (), predicted_objects.objects .end (),
1397
- [&](PredictedObject predicted_object) {
1398
- return tier4_autoware_utils::toHexString (predicted_object.object_id ) ==
1399
- prev_closest_stop_obstacle_ptr_->uuid ;
1400
- });
1401
- // If previous closest obstacle disappear from the perception result, do nothing anymore.
1402
- if (predicted_object_itr == predicted_objects.objects .end ()) {
1403
- return ;
1404
- }
1394
+ static std::vector<StopObstacle> prev_closest_stop_obstacles{};
1395
+ for (const auto & prev_closest_stop_obstacle : prev_closest_stop_obstacles) {
1396
+ const auto predicted_object_itr = std::find_if (
1397
+ predicted_objects.objects .begin (), predicted_objects.objects .end (),
1398
+ [&](PredictedObject predicted_object) {
1399
+ return tier4_autoware_utils::toHexString (predicted_object.object_id ) ==
1400
+ prev_closest_stop_obstacle_ptr_->uuid ;
1401
+ });
1402
+ // If previous closest obstacle disappear from the perception result, do nothing anymore.
1403
+ if (predicted_object_itr == predicted_objects.objects .end ()) {
1404
+ continue ;
1405
+ }
1405
1406
1406
- const auto is_disappeared_from_stop_obstacle = std::none_of (
1407
- stop_obstacles.begin (), stop_obstacles.end (),
1408
- [&](const auto & obstacle) { return obstacle.uuid == prev_closest_stop_obstacle_ptr_->uuid ; });
1409
- if (is_disappeared_from_stop_obstacle) {
1410
- // re-evaluate as a stop candidate, and overwrite the current decision if "maintain stop"
1411
- // condition is satisfied
1412
- const double elapsed_time = (current_time - prev_closest_stop_obstacle_ptr_->stamp ).seconds ();
1413
- if (
1414
- predicted_object_itr->kinematics .initial_twist_with_covariance .twist .linear .x <
1415
- behavior_determination_param_.obstacle_velocity_threshold_from_stop_to_cruise &&
1416
- elapsed_time < behavior_determination_param_.stop_obstacle_hold_time_threshold ) {
1417
- stop_obstacles.push_back (*prev_closest_stop_obstacle_ptr_);
1418
- return ;
1407
+ const auto is_disappeared_from_stop_obstacle = std::none_of (
1408
+ stop_obstacles.begin (), stop_obstacles.end (),
1409
+ [&](const auto & obstacle) { return obstacle.uuid == prev_closest_stop_obstacle.uuid ; });
1410
+ if (is_disappeared_from_stop_obstacle) {
1411
+ // re-evaluate as a stop candidate, and overwrite the current decision if "maintain stop"
1412
+ // condition is satisfied
1413
+ const double elapsed_time = (current_time - prev_closest_stop_obstacle.stamp ).seconds ();
1414
+ if (
1415
+ predicted_object_itr->kinematics .initial_twist_with_covariance .twist .linear .x <
1416
+ behavior_determination_param_.obstacle_velocity_threshold_from_stop_to_cruise &&
1417
+ elapsed_time < behavior_determination_param_.stop_obstacle_hold_time_threshold ) {
1418
+ stop_obstacles.push_back (prev_closest_stop_obstacle);
1419
+ current_closest_stop_obstacles.push_back (prev_closest_stop_obstacle);
1420
+ }
1419
1421
}
1420
1422
}
1421
1423
1422
- if (current_closest_stop_obstacle) {
1423
- prev_closest_stop_obstacle_ptr_ =
1424
- std::make_shared<StopObstacle>(*current_closest_stop_obstacle);
1425
- } else {
1426
- prev_closest_stop_obstacle_ptr_ = nullptr ;
1427
- }
1424
+ prev_closest_stop_obstacles = std::move (current_closest_stop_obstacles);
1428
1425
}
1429
1426
1430
1427
bool ObstacleCruisePlannerNode::isObstacleCrossing (
0 commit comments