@@ -49,6 +49,7 @@ namespace autoware::behavior_path_planner
49
49
using autoware::motion_utils::calcSignedArcLength;
50
50
using utils::lane_change::create_lanes_polygon;
51
51
namespace calculation = utils::lane_change::calculation;
52
+ using utils::path_safety_checker::filter::velocity_filter;
52
53
53
54
NormalLaneChange::NormalLaneChange (
54
55
const std::shared_ptr<LaneChangeParameters> & parameters, LaneChangeModuleType type,
@@ -568,7 +569,7 @@ void NormalLaneChange::insert_stop_point_on_current_lanes(PathWithLaneId & path)
568
569
// [ego]> | <--- stop margin ---> [obj]>
569
570
// ----------------------------------------------------------
570
571
const auto has_blocking_target_lane_obj = utils::lane_change::has_blocking_target_object (
571
- common_data_ptr_, filtered_objects_, stop_arc_length_behind_obj, path);
572
+ filtered_objects_. target_lane_leading , stop_arc_length_behind_obj, path);
572
573
573
574
if (has_blocking_target_lane_obj || stop_arc_length_behind_obj <= 0.0 ) {
574
575
set_stop_pose (dist_to_terminal_stop, path);
@@ -931,20 +932,21 @@ lane_change::TargetObjects NormalLaneChange::get_target_objects(
931
932
const FilteredByLanesExtendedObjects & filtered_objects,
932
933
[[maybe_unused]] const lanelet::ConstLanelets & current_lanes) const
933
934
{
934
- ExtendedPredictedObjects leading_objects = filtered_objects.target_lane_leading ;
935
+ ExtendedPredictedObjects leading_objects = filtered_objects.target_lane_leading . moving ;
935
936
auto insert_leading_objects = [&](const auto & objects) {
936
937
ranges::actions::insert (leading_objects, leading_objects.end (), objects);
937
938
};
938
939
939
- insert_leading_objects (filtered_objects.target_lane_expanded );
940
+ insert_leading_objects (filtered_objects.target_lane_leading .stopped );
941
+ insert_leading_objects (filtered_objects.target_lane_leading .expanded );
940
942
const auto chk_obj_in_curr_lanes = lane_change_parameters_->check_objects_on_current_lanes ;
941
943
if (chk_obj_in_curr_lanes || common_data_ptr_->transient_data .is_ego_stuck ) {
942
944
insert_leading_objects (filtered_objects.current_lane );
943
945
}
944
946
945
947
const auto chk_obj_in_other_lanes = lane_change_parameters_->check_objects_on_other_lanes ;
946
948
if (chk_obj_in_other_lanes) {
947
- insert_leading_objects (filtered_objects.other_lane );
949
+ insert_leading_objects (filtered_objects.others );
948
950
}
949
951
950
952
return {leading_objects, filtered_objects.target_lane_trailing };
@@ -996,7 +998,8 @@ void NormalLaneChange::filterOncomingObjects(PredictedObjects & objects) const
996
998
const auto is_stopped_object = [](const auto & object) -> bool {
997
999
constexpr double min_vel_th = -0.5 ;
998
1000
constexpr double max_vel_th = 0.5 ;
999
- return utils::path_safety_checker::filter::velocity_filter (object, min_vel_th, max_vel_th);
1001
+ return velocity_filter (
1002
+ object.kinematics .initial_twist_with_covariance .twist , min_vel_th, max_vel_th);
1000
1003
};
1001
1004
1002
1005
utils::path_safety_checker::filterObjects (objects, [&](const PredictedObject & object) {
@@ -1012,35 +1015,23 @@ void NormalLaneChange::filterOncomingObjects(PredictedObjects & objects) const
1012
1015
FilteredByLanesExtendedObjects NormalLaneChange::filterObjectsByLanelets (
1013
1016
const PredictedObjects & objects) const
1014
1017
{
1015
- FilteredByLanesExtendedObjects ext_objects;
1016
-
1017
1018
const auto & current_pose = common_data_ptr_->get_ego_pose ();
1018
1019
const auto & current_lanes = common_data_ptr_->lanes_ptr ->current ;
1019
1020
const auto & route_handler = getRouteHandler ();
1020
- const auto & common_parameters = planner_data_->parameters ;
1021
1021
1022
1022
const auto & current_lanes_ref_path = common_data_ptr_->current_lanes_path ;
1023
- const auto is_object_in_lanes = [](const auto & object_poly, const auto & polygon) {
1024
- return !polygon.empty () && !boost::geometry::disjoint (polygon, object_poly);
1025
- };
1026
-
1027
- const auto is_within_vel_th = [](
1028
- const ExtendedPredictedObject & object, const double min_th = 1.0 ,
1029
- const double max_th =
1030
- std::numeric_limits<double >::max ()) -> bool {
1031
- const auto v_norm = std::hypot (object.initial_twist .linear .x , object.initial_twist .linear .y );
1032
- return (min_th < v_norm && v_norm < max_th);
1033
- };
1034
1023
1035
1024
const auto & lanes_polygon = *common_data_ptr_->lanes_polygon_ptr ;
1036
1025
const auto dist_ego_to_current_lanes_center =
1037
1026
lanelet::utils::getLateralDistanceToClosestLanelet (current_lanes, current_pose);
1038
1027
1028
+ FilteredByLanesExtendedObjects ext_objects;
1039
1029
const auto reserve_size = objects.objects .size ();
1040
1030
ext_objects.current_lane .reserve (reserve_size);
1041
- ext_objects.target_lane_leading .stopped .reserve (reserve_size);
1042
- ext_objects.target_lane_leading .moving .reserve (reserve_size);
1043
- ext_objects.target_lane_leading .expanded .reserve (reserve_size);
1031
+ auto & target_lane_leading = ext_objects.target_lane_leading ;
1032
+ target_lane_leading.stopped .reserve (reserve_size);
1033
+ target_lane_leading.moving .reserve (reserve_size);
1034
+ target_lane_leading.expanded .reserve (reserve_size);
1044
1035
ext_objects.target_lane_trailing .reserve (reserve_size);
1045
1036
ext_objects.others .reserve (reserve_size);
1046
1037
@@ -1055,59 +1046,20 @@ FilteredByLanesExtendedObjects NormalLaneChange::filterObjectsByLanelets(
1055
1046
const auto is_before_terminal =
1056
1047
utils::lane_change::is_before_terminal (common_data_ptr_, current_lanes_ref_path, ext_object);
1057
1048
1058
- if (!is_before_terminal) {
1059
- ext_objects.others .push_back (ext_object);
1060
- continue ;
1061
- }
1062
-
1063
- const auto is_lateral_far = std::invoke ([&]() -> bool {
1064
- const auto dist_object_to_current_lanes_center =
1065
- lanelet::utils::getLateralDistanceToClosestLanelet (current_lanes, ext_object.initial_pose );
1066
- const auto lateral = dist_object_to_current_lanes_center - dist_ego_to_current_lanes_center;
1067
- return std::abs (lateral) > (common_parameters.vehicle_width / 2 );
1068
- });
1069
-
1070
1049
const auto ahead_of_ego =
1071
1050
utils::lane_change::is_ahead_of_ego (common_data_ptr_, current_lanes_ref_path, ext_object);
1072
1051
1073
- if (is_lateral_far) {
1074
- const auto is_stopped = is_within_vel_th (ext_object, -floating_err_th, stopped_obj_vel_th);
1075
- if (is_object_in_lanes (ext_object.initial_polygon , lanes_polygon.target )) {
1076
- if (ahead_of_ego) {
1077
- if (is_stopped) {
1078
- ext_objects.target_lane_leading .stopped .push_back (ext_object);
1079
- } else {
1080
- ext_objects.target_lane_leading .moving .push_back (ext_object);
1081
- }
1082
- } else {
1083
- ext_objects.target_lane_trailing .push_back (ext_object);
1084
- }
1085
- continue ;
1086
- }
1087
-
1088
- if (
1089
- is_object_in_lanes (ext_object.initial_polygon , lanes_polygon.expanded_target ) &&
1090
- is_stopped && ahead_of_ego) {
1091
- ext_objects.target_lane_leading .expanded .push_back (ext_object);
1092
- continue ;
1093
- }
1094
- }
1095
-
1096
- const auto is_overlap_target_backward =
1097
- ranges::any_of (lanes_polygon.preceding_target , [&](const auto & target_backward_polygon) {
1098
- return is_object_in_lanes (ext_object.initial_polygon , target_backward_polygon);
1099
- });
1100
-
1101
- // check if the object intersects with target backward lanes
1102
- if (is_overlap_target_backward) {
1103
- ext_objects.target_lane_trailing .push_back (ext_object);
1104
- continue ;
1105
- }
1052
+ utils::lane_change::filter_target_lane_objects (
1053
+ common_data_ptr_, ext_object, dist_ego_to_current_lanes_center, ahead_of_ego,
1054
+ is_before_terminal, target_lane_leading, ext_objects.target_lane_trailing );
1106
1055
1107
1056
// TODO(Azu): We have to think about how to remove is_within_vel_th without breaking AW behavior
1057
+ const auto is_moving = velocity_filter (
1058
+ ext_object.initial_twist , stopped_obj_vel_th, std::numeric_limits<double >::max ());
1059
+
1108
1060
if (
1109
- ahead_of_ego && is_within_vel_th (ext_object) &&
1110
- is_object_in_lanes (ext_object.initial_polygon , lanes_polygon.current )) {
1061
+ ahead_of_ego && is_moving && is_before_terminal &&
1062
+ ! boost::geometry::disjoint (ext_object.initial_polygon , lanes_polygon.current )) {
1111
1063
// check only the objects that are in front of the ego vehicle
1112
1064
ext_objects.current_lane .push_back (ext_object);
1113
1065
continue ;
@@ -1123,9 +1075,9 @@ FilteredByLanesExtendedObjects NormalLaneChange::filterObjectsByLanelets(
1123
1075
// There are no use cases for other lane objects yet, so to save some computation time, we dont
1124
1076
// have to sort them.
1125
1077
ranges::sort (ext_objects.current_lane , dist_comparator);
1126
- ranges::sort (ext_objects. target_lane_leading .expanded , dist_comparator);
1127
- ranges::sort (ext_objects. target_lane_leading .stopped , dist_comparator);
1128
- ranges::sort (ext_objects. target_lane_leading .moving , dist_comparator);
1078
+ ranges::sort (target_lane_leading.expanded , dist_comparator);
1079
+ ranges::sort (target_lane_leading.stopped , dist_comparator);
1080
+ ranges::sort (target_lane_leading.moving , dist_comparator);
1129
1081
ranges::sort (ext_objects.target_lane_trailing , [&](const auto & obj1, const auto & obj2) {
1130
1082
return !dist_comparator (obj1, obj2);
1131
1083
});
@@ -1388,7 +1340,7 @@ bool NormalLaneChange::check_candidate_path_safety(
1388
1340
1389
1341
if (
1390
1342
!is_stuck && !utils::lane_change::passed_parked_objects (
1391
- common_data_ptr_, candidate_path, filtered_objects_.target_lane_leading ,
1343
+ common_data_ptr_, candidate_path, filtered_objects_.target_lane_leading . stopped ,
1392
1344
lane_change_debug_.collision_check_objects )) {
1393
1345
throw std::logic_error (
1394
1346
" Ego is not stuck and parked vehicle exists in the target lane. Skip lane change." );
@@ -1569,7 +1521,7 @@ PathSafetyStatus NormalLaneChange::isApprovedPathSafe() const
1569
1521
}
1570
1522
1571
1523
const auto has_passed_parked_objects = utils::lane_change::passed_parked_objects (
1572
- common_data_ptr_, path, filtered_objects_.target_lane_leading , debug_data);
1524
+ common_data_ptr_, path, filtered_objects_.target_lane_leading . stopped , debug_data);
1573
1525
1574
1526
if (!has_passed_parked_objects) {
1575
1527
RCLCPP_DEBUG (logger_, " Lane change has been delayed." );
0 commit comments