Skip to content

Commit 281dd8a

Browse files
RT1-8532 separate target lane leading based on behavior
Signed-off-by: Zulfaqar Azmi <zulfaqar.azmi@tier4.jp>
1 parent edff19d commit 281dd8a

File tree

9 files changed

+140
-126
lines changed

9 files changed

+140
-126
lines changed

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/data_structs.hpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -267,14 +267,16 @@ struct TargetLaneLeadingObjects
267267
ExtendedPredictedObjects moving;
268268
ExtendedPredictedObjects stopped;
269269
ExtendedPredictedObjects expanded;
270+
271+
[[nodiscard]] size_t size() const { return moving.size() + stopped.size() + expanded.size(); }
270272
};
271273

272274
struct LanesObjects
273275
{
274-
ExtendedPredictedObjects others{};
275-
ExtendedPredictedObjects current_lane{};
276-
ExtendedPredictedObjects target_lane_trailing{};
277-
TargetLaneLeadingObjects target_lane_leading{};
276+
ExtendedPredictedObjects others;
277+
ExtendedPredictedObjects current_lane;
278+
ExtendedPredictedObjects target_lane_trailing;
279+
TargetLaneLeadingObjects target_lane_leading;
278280
};
279281

280282
struct TargetObjects
@@ -414,8 +416,7 @@ using LaneChangeStates = lane_change::States;
414416
using LaneChangePhaseInfo = lane_change::PhaseInfo;
415417
using LaneChangePhaseMetrics = lane_change::PhaseMetrics;
416418
using LaneChangeInfo = lane_change::Info;
417-
using FilteredByLanesObjects = lane_change::LanesObjects<std::vector<PredictedObject>>;
418-
using FilteredByLanesExtendedObjects = lane_change::LanesObjects<ExtendedPredictedObjects>;
419+
using FilteredByLanesExtendedObjects = lane_change::LanesObjects;
419420
using LateralAccelerationMap = lane_change::LateralAccelerationMap;
420421
} // namespace autoware::behavior_path_planner
421422

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/debug_structs.hpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,11 @@ struct Debug
5555
collision_check_objects.clear();
5656
collision_check_objects_after_approval.clear();
5757
filtered_objects.current_lane.clear();
58-
filtered_objects.target_lane_leading.clear();
5958
filtered_objects.target_lane_trailing.clear();
60-
filtered_objects.other_lane.clear();
59+
filtered_objects.target_lane_leading.moving.clear();
60+
filtered_objects.target_lane_leading.stopped.clear();
61+
filtered_objects.target_lane_leading.expanded.clear();
62+
filtered_objects.others.clear();
6163
execution_area.points.clear();
6264
current_lanes.clear();
6365
target_lanes.clear();

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/include/autoware/behavior_path_lane_change_module/utils/utils.hpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ using behavior_path_planner::lane_change::CommonDataPtr;
5454
using behavior_path_planner::lane_change::LanesPolygon;
5555
using behavior_path_planner::lane_change::ModuleType;
5656
using behavior_path_planner::lane_change::PathSafetyStatus;
57+
using behavior_path_planner::lane_change::TargetLaneLeadingObjects;
5758
using geometry_msgs::msg::Point;
5859
using geometry_msgs::msg::Pose;
5960
using geometry_msgs::msg::Twist;
@@ -290,8 +291,8 @@ double get_min_dist_to_current_lanes_obj(
290291
* otherwise, false.
291292
*/
292293
bool has_blocking_target_object(
293-
const CommonDataPtr & common_data_ptr, const FilteredByLanesExtendedObjects & filtered_objects,
294-
const double stop_arc_length, const PathWithLaneId & path);
294+
const TargetLaneLeadingObjects & target_leading_objects, const double stop_arc_length,
295+
const PathWithLaneId & path);
295296

296297
/**
297298
* @brief Checks if the ego vehicle has passed any turn direction within an intersection.
@@ -338,5 +339,11 @@ std::vector<LineString2d> get_line_string_paths(const ExtendedPredictedObject &
338339
*/
339340
bool has_overtaking_turn_lane_object(
340341
const CommonDataPtr & common_data_ptr, const ExtendedPredictedObjects & trailing_objects);
342+
343+
void filter_target_lane_objects(
344+
const CommonDataPtr & common_data_ptr, const ExtendedPredictedObject & object,
345+
const double dist_ego_to_current_lanes_center, const bool ahead_of_ego,
346+
const bool before_terminal, TargetLaneLeadingObjects & leading_objects,
347+
ExtendedPredictedObjects & trailing_objects);
341348
} // namespace autoware::behavior_path_planner::utils::lane_change
342349
#endif // AUTOWARE__BEHAVIOR_PATH_LANE_CHANGE_MODULE__UTILS__UTILS_HPP_

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/scene.cpp

+26-74
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ namespace autoware::behavior_path_planner
4949
using autoware::motion_utils::calcSignedArcLength;
5050
using utils::lane_change::create_lanes_polygon;
5151
namespace calculation = utils::lane_change::calculation;
52+
using utils::path_safety_checker::filter::velocity_filter;
5253

5354
NormalLaneChange::NormalLaneChange(
5455
const std::shared_ptr<LaneChangeParameters> & parameters, LaneChangeModuleType type,
@@ -568,7 +569,7 @@ void NormalLaneChange::insert_stop_point_on_current_lanes(PathWithLaneId & path)
568569
// [ego]> | <--- stop margin ---> [obj]>
569570
// ----------------------------------------------------------
570571
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);
572573

573574
if (has_blocking_target_lane_obj || stop_arc_length_behind_obj <= 0.0) {
574575
set_stop_pose(dist_to_terminal_stop, path);
@@ -931,20 +932,21 @@ lane_change::TargetObjects NormalLaneChange::get_target_objects(
931932
const FilteredByLanesExtendedObjects & filtered_objects,
932933
[[maybe_unused]] const lanelet::ConstLanelets & current_lanes) const
933934
{
934-
ExtendedPredictedObjects leading_objects = filtered_objects.target_lane_leading;
935+
ExtendedPredictedObjects leading_objects = filtered_objects.target_lane_leading.moving;
935936
auto insert_leading_objects = [&](const auto & objects) {
936937
ranges::actions::insert(leading_objects, leading_objects.end(), objects);
937938
};
938939

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);
940942
const auto chk_obj_in_curr_lanes = lane_change_parameters_->check_objects_on_current_lanes;
941943
if (chk_obj_in_curr_lanes || common_data_ptr_->transient_data.is_ego_stuck) {
942944
insert_leading_objects(filtered_objects.current_lane);
943945
}
944946

945947
const auto chk_obj_in_other_lanes = lane_change_parameters_->check_objects_on_other_lanes;
946948
if (chk_obj_in_other_lanes) {
947-
insert_leading_objects(filtered_objects.other_lane);
949+
insert_leading_objects(filtered_objects.others);
948950
}
949951

950952
return {leading_objects, filtered_objects.target_lane_trailing};
@@ -996,7 +998,8 @@ void NormalLaneChange::filterOncomingObjects(PredictedObjects & objects) const
996998
const auto is_stopped_object = [](const auto & object) -> bool {
997999
constexpr double min_vel_th = -0.5;
9981000
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);
10001003
};
10011004

10021005
utils::path_safety_checker::filterObjects(objects, [&](const PredictedObject & object) {
@@ -1012,35 +1015,23 @@ void NormalLaneChange::filterOncomingObjects(PredictedObjects & objects) const
10121015
FilteredByLanesExtendedObjects NormalLaneChange::filterObjectsByLanelets(
10131016
const PredictedObjects & objects) const
10141017
{
1015-
FilteredByLanesExtendedObjects ext_objects;
1016-
10171018
const auto & current_pose = common_data_ptr_->get_ego_pose();
10181019
const auto & current_lanes = common_data_ptr_->lanes_ptr->current;
10191020
const auto & route_handler = getRouteHandler();
1020-
const auto & common_parameters = planner_data_->parameters;
10211021

10221022
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-
};
10341023

10351024
const auto & lanes_polygon = *common_data_ptr_->lanes_polygon_ptr;
10361025
const auto dist_ego_to_current_lanes_center =
10371026
lanelet::utils::getLateralDistanceToClosestLanelet(current_lanes, current_pose);
10381027

1028+
FilteredByLanesExtendedObjects ext_objects;
10391029
const auto reserve_size = objects.objects.size();
10401030
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);
10441035
ext_objects.target_lane_trailing.reserve(reserve_size);
10451036
ext_objects.others.reserve(reserve_size);
10461037

@@ -1055,59 +1046,20 @@ FilteredByLanesExtendedObjects NormalLaneChange::filterObjectsByLanelets(
10551046
const auto is_before_terminal =
10561047
utils::lane_change::is_before_terminal(common_data_ptr_, current_lanes_ref_path, ext_object);
10571048

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-
10701049
const auto ahead_of_ego =
10711050
utils::lane_change::is_ahead_of_ego(common_data_ptr_, current_lanes_ref_path, ext_object);
10721051

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);
11061055

11071056
// 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+
11081060
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)) {
11111063
// check only the objects that are in front of the ego vehicle
11121064
ext_objects.current_lane.push_back(ext_object);
11131065
continue;
@@ -1123,9 +1075,9 @@ FilteredByLanesExtendedObjects NormalLaneChange::filterObjectsByLanelets(
11231075
// There are no use cases for other lane objects yet, so to save some computation time, we dont
11241076
// have to sort them.
11251077
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);
11291081
ranges::sort(ext_objects.target_lane_trailing, [&](const auto & obj1, const auto & obj2) {
11301082
return !dist_comparator(obj1, obj2);
11311083
});
@@ -1388,7 +1340,7 @@ bool NormalLaneChange::check_candidate_path_safety(
13881340

13891341
if (
13901342
!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,
13921344
lane_change_debug_.collision_check_objects)) {
13931345
throw std::logic_error(
13941346
"Ego is not stuck and parked vehicle exists in the target lane. Skip lane change.");
@@ -1569,7 +1521,7 @@ PathSafetyStatus NormalLaneChange::isApprovedPathSafe() const
15691521
}
15701522

15711523
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);
15731525

15741526
if (!has_passed_parked_objects) {
15751527
RCLCPP_DEBUG(logger_, "Lane change has been delayed.");

planning/behavior_path_planner/autoware_behavior_path_lane_change_module/src/utils/markers.cpp

+8-6
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@ MarkerArray showFilteredObjects(
105105
{
106106
int32_t update_id = 0;
107107
MarkerArray marker_array;
108-
auto reserve_size = filtered_objects.current_lane.size() + filtered_objects.other_lane.size() +
109-
filtered_objects.target_lane_expanded.size() +
108+
auto reserve_size = filtered_objects.current_lane.size() + filtered_objects.others.size() +
110109
filtered_objects.target_lane_leading.size() +
111110
filtered_objects.target_lane_trailing.size();
112111
marker_array.markers.reserve(2 * reserve_size);
@@ -119,10 +118,11 @@ MarkerArray showFilteredObjects(
119118
};
120119

121120
add_objects_to_marker(filtered_objects.current_lane, colors::yellow());
122-
add_objects_to_marker(filtered_objects.target_lane_leading, colors::aqua());
121+
add_objects_to_marker(filtered_objects.target_lane_leading.moving, colors::aqua());
122+
add_objects_to_marker(filtered_objects.target_lane_leading.stopped, colors::light_steel_blue());
123123
add_objects_to_marker(filtered_objects.target_lane_trailing, colors::blue());
124-
add_objects_to_marker(filtered_objects.target_lane_expanded, colors::light_pink());
125-
add_objects_to_marker(filtered_objects.other_lane, colors::medium_orchid());
124+
add_objects_to_marker(filtered_objects.target_lane_leading.expanded, colors::light_pink());
125+
add_objects_to_marker(filtered_objects.others, colors::medium_orchid());
126126

127127
auto add_text = [&](const ExtendedPredictedObjects & objects) {
128128
for (const auto & target_lead_obj : objects) {
@@ -142,7 +142,9 @@ MarkerArray showFilteredObjects(
142142
};
143143

144144
add_text(filtered_objects.current_lane);
145-
add_text(filtered_objects.target_lane_leading);
145+
add_text(filtered_objects.target_lane_leading.moving);
146+
add_text(filtered_objects.target_lane_leading.expanded);
147+
add_text(filtered_objects.target_lane_leading.stopped);
146148
add_text(filtered_objects.target_lane_trailing);
147149

148150
return marker_array;

0 commit comments

Comments
 (0)