@@ -83,8 +83,11 @@ void NormalLaneChange::update_lanes(const bool is_approved)
83
83
common_data_ptr_->lanes_ptr ->current = current_lanes;
84
84
common_data_ptr_->lanes_ptr ->target = target_lanes;
85
85
86
+ const auto & route_handler_ptr = common_data_ptr_->route_handler_ptr ;
87
+ common_data_ptr_->lanes_ptr ->current_lane_in_goal_section =
88
+ route_handler_ptr->isInGoalRouteSection (current_lanes.back ());
86
89
common_data_ptr_->lanes_ptr ->preceding_target = utils::getPrecedingLanelets (
87
- *common_data_ptr_-> route_handler_ptr , get_target_lanes (), common_data_ptr_->get_ego_pose (),
90
+ *route_handler_ptr, get_target_lanes (), common_data_ptr_->get_ego_pose (),
88
91
common_data_ptr_->lc_param_ptr ->backward_lane_length );
89
92
90
93
*common_data_ptr_->lanes_polygon_ptr = create_lanes_polygon (common_data_ptr_);
@@ -983,7 +986,6 @@ ExtendedPredictedObjects NormalLaneChange::getTargetObjects(
983
986
984
987
LaneChangeLanesFilteredObjects NormalLaneChange::filterObjects () const
985
988
{
986
- const auto & current_pose = getEgoPose ();
987
989
const auto & route_handler = getRouteHandler ();
988
990
const auto & common_parameters = planner_data_->parameters ;
989
991
auto objects = *planner_data_->dynamic_object ;
@@ -1006,12 +1008,6 @@ LaneChangeLanesFilteredObjects NormalLaneChange::filterObjects() const
1006
1008
return {};
1007
1009
}
1008
1010
1009
- filterAheadTerminalObjects (objects, current_lanes);
1010
-
1011
- if (objects.objects .empty ()) {
1012
- return {};
1013
- }
1014
-
1015
1011
std::vector<PredictedObject> target_lane_objects;
1016
1012
std::vector<PredictedObject> current_lane_objects;
1017
1013
std::vector<PredictedObject> other_lane_objects;
@@ -1022,48 +1018,37 @@ LaneChangeLanesFilteredObjects NormalLaneChange::filterObjects() const
1022
1018
return {};
1023
1019
}
1024
1020
1021
+ const auto path =
1022
+ route_handler->getCenterLinePath (current_lanes, 0.0 , std::numeric_limits<double >::max ());
1023
+
1025
1024
filterObjectsByLanelets (
1026
- objects, current_lanes, target_lanes, current_lane_objects, target_lane_objects,
1027
- other_lane_objects);
1025
+ objects, path, current_lane_objects, target_lane_objects, other_lane_objects);
1028
1026
1029
1027
const auto is_within_vel_th = [](const auto & object) -> bool {
1030
1028
constexpr double min_vel_th = 1.0 ;
1031
1029
constexpr double max_vel_th = std::numeric_limits<double >::max ();
1032
1030
return utils::path_safety_checker::filter::velocity_filter (object, min_vel_th, max_vel_th);
1033
1031
};
1034
1032
1035
- const auto path =
1036
- route_handler->getCenterLinePath (current_lanes, 0.0 , std::numeric_limits<double >::max ());
1037
-
1038
- if (path.points .empty ()) {
1039
- return {};
1040
- }
1041
-
1042
- const auto is_ahead_of_ego = [&path, ¤t_pose](const auto & object) {
1043
- const auto obj_polygon = autoware::universe_utils::toPolygon2d (object).outer ();
1044
-
1045
- double max_dist_ego_to_obj = std::numeric_limits<double >::lowest ();
1046
- for (const auto & polygon_p : obj_polygon) {
1047
- const auto obj_p = autoware::universe_utils::createPoint (polygon_p.x (), polygon_p.y (), 0.0 );
1048
- const auto dist_ego_to_obj = calcSignedArcLength (path.points , current_pose.position , obj_p);
1049
- max_dist_ego_to_obj = std::max (dist_ego_to_obj, max_dist_ego_to_obj);
1050
- }
1051
- return max_dist_ego_to_obj >= 0.0 ;
1052
- };
1053
-
1054
1033
utils::path_safety_checker::filterObjects (
1055
1034
target_lane_objects, [&](const PredictedObject & object) {
1056
- return (is_within_vel_th (object) || is_ahead_of_ego (object));
1035
+ const auto ahead_of_ego = utils::lane_change::is_ahead_of_ego (common_data_ptr_, path, object);
1036
+ return is_within_vel_th (object) || ahead_of_ego;
1057
1037
});
1058
1038
1059
- utils::path_safety_checker::filterObjects (
1060
- other_lane_objects, [&](const PredictedObject & object) {
1061
- return is_within_vel_th (object) && is_ahead_of_ego (object);
1062
- });
1039
+ if (lane_change_parameters_->check_objects_on_other_lanes ) {
1040
+ utils::path_safety_checker::filterObjects (
1041
+ other_lane_objects, [&](const PredictedObject & object) {
1042
+ const auto ahead_of_ego =
1043
+ utils::lane_change::is_ahead_of_ego (common_data_ptr_, path, object);
1044
+ return is_within_vel_th (object) && ahead_of_ego;
1045
+ });
1046
+ }
1063
1047
1064
1048
utils::path_safety_checker::filterObjects (
1065
1049
current_lane_objects, [&](const PredictedObject & object) {
1066
- return is_within_vel_th (object) && is_ahead_of_ego (object);
1050
+ const auto ahead_of_ego = utils::lane_change::is_ahead_of_ego (common_data_ptr_, path, object);
1051
+ return is_within_vel_th (object) && ahead_of_ego;
1067
1052
});
1068
1053
1069
1054
LaneChangeLanesFilteredObjects lane_change_target_objects;
@@ -1119,42 +1104,15 @@ void NormalLaneChange::filterOncomingObjects(PredictedObjects & objects) const
1119
1104
});
1120
1105
}
1121
1106
1122
- void NormalLaneChange::filterAheadTerminalObjects (
1123
- PredictedObjects & objects, const lanelet::ConstLanelets & current_lanes) const
1124
- {
1125
- const auto & current_pose = getEgoPose ();
1126
- const auto & route_handler = getRouteHandler ();
1127
- const auto minimum_lane_change_length = utils::lane_change::calcMinimumLaneChangeLength (
1128
- route_handler, current_lanes.back (), *lane_change_parameters_, direction_);
1129
-
1130
- const auto dist_ego_to_current_lanes_center =
1131
- lanelet::utils::getLateralDistanceToClosestLanelet (current_lanes, current_pose);
1132
-
1133
- // ignore object that are ahead of terminal lane change start
1134
- utils::path_safety_checker::filterObjects (objects, [&](const PredictedObject & object) {
1135
- const auto obj_polygon = autoware::universe_utils::toPolygon2d (object).outer ();
1136
- // ignore object that are ahead of terminal lane change start
1137
- auto distance_to_terminal_from_object = std::numeric_limits<double >::max ();
1138
- for (const auto & polygon_p : obj_polygon) {
1139
- const auto obj_p = autoware::universe_utils::createPoint (polygon_p.x (), polygon_p.y (), 0.0 );
1140
- Pose polygon_pose;
1141
- polygon_pose.position = obj_p;
1142
- polygon_pose.orientation = object.kinematics .initial_pose_with_covariance .pose .orientation ;
1143
- const auto dist = utils::getDistanceToEndOfLane (polygon_pose, current_lanes);
1144
- distance_to_terminal_from_object = std::min (dist_ego_to_current_lanes_center, dist);
1145
- }
1146
-
1147
- return (minimum_lane_change_length > distance_to_terminal_from_object);
1148
- });
1149
- }
1150
-
1151
1107
void NormalLaneChange::filterObjectsByLanelets (
1152
- const PredictedObjects & objects, const lanelet::ConstLanelets & current_lanes ,
1153
- const lanelet::ConstLanelets & target_lanes, std::vector<PredictedObject> & current_lane_objects,
1108
+ const PredictedObjects & objects, const PathWithLaneId & current_lanes_ref_path ,
1109
+ std::vector<PredictedObject> & current_lane_objects,
1154
1110
std::vector<PredictedObject> & target_lane_objects,
1155
1111
std::vector<PredictedObject> & other_lane_objects) const
1156
1112
{
1157
1113
const auto & current_pose = getEgoPose ();
1114
+ const auto & current_lanes = common_data_ptr_->lanes_ptr ->current ;
1115
+ const auto & target_lanes = common_data_ptr_->lanes_ptr ->target ;
1158
1116
const auto & route_handler = getRouteHandler ();
1159
1117
const auto & common_parameters = planner_data_->parameters ;
1160
1118
const auto check_optional_polygon = [](const auto & object, const auto & polygon) {
@@ -1199,7 +1157,14 @@ void NormalLaneChange::filterObjectsByLanelets(
1199
1157
return std::abs (lateral) > (common_parameters.vehicle_width / 2 );
1200
1158
});
1201
1159
1202
- if (check_optional_polygon (object, lanes_polygon.expanded_target ) && is_lateral_far) {
1160
+ const auto is_before_terminal = [&]() {
1161
+ return utils::lane_change::is_before_terminal (
1162
+ common_data_ptr_, current_lanes_ref_path, object);
1163
+ };
1164
+
1165
+ if (
1166
+ check_optional_polygon (object, lanes_polygon.expanded_target ) && is_lateral_far &&
1167
+ is_before_terminal ()) {
1203
1168
target_lane_objects.push_back (object);
1204
1169
continue ;
1205
1170
}
0 commit comments