Skip to content

Commit 84b321e

Browse files
refactor(lane_change): move several functions from lane change utils to NormalLaneChange (#4273)
* refactor(lane_change): move getPrepareSegment to a class function Signed-off-by: yutaka <purewater0901@gmail.com> * move hasEnoughLength function to NormalLaneChange Signed-off-by: yutaka <purewater0901@gmail.com> * udpate Signed-off-by: yutaka <purewater0901@gmail.com> * update Signed-off-by: yutaka <purewater0901@gmail.com> --------- Signed-off-by: yutaka <purewater0901@gmail.com>
1 parent ba539b1 commit 84b321e

File tree

4 files changed

+159
-174
lines changed

4 files changed

+159
-174
lines changed

planning/behavior_path_planner/include/behavior_path_planner/scene_module/lane_change/normal.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,23 @@ class NormalLaneChange : public LaneChangeBase
9898

9999
int getNumToPreferredLane(const lanelet::ConstLanelet & lane) const override;
100100

101+
LaneChangeTargetObjects getTargetObjects(
102+
const lanelet::ConstLanelets & current_lanes,
103+
const lanelet::ConstLanelets & target_lanes) const;
104+
101105
PathWithLaneId getPrepareSegment(
102106
const lanelet::ConstLanelets & current_lanes, const double backward_path_length,
103107
const double prepare_length) const override;
104108

109+
PathWithLaneId getTargetSegment(
110+
const lanelet::ConstLanelets & target_lanelets, const Pose & lane_changing_start_pose,
111+
const double target_lane_length, const double lane_changing_length,
112+
const double lane_changing_velocity, const double buffer_for_next_lane_change) const;
113+
114+
bool hasEnoughLength(
115+
const LaneChangePath & path, const lanelet::ConstLanelets & current_lanes,
116+
const lanelet::ConstLanelets & target_lanes, const Direction direction = Direction::NONE) const;
117+
105118
bool getLaneChangePaths(
106119
const lanelet::ConstLanelets & original_lanelets,
107120
const lanelet::ConstLanelets & target_lanelets, Direction direction,

planning/behavior_path_planner/include/behavior_path_planner/utils/lane_change/utils.hpp

-20
Original file line numberDiff line numberDiff line change
@@ -98,13 +98,6 @@ std::optional<LaneChangePath> constructCandidatePath(
9898
const PathWithLaneId & target_segment, const PathWithLaneId & target_lane_reference_path,
9999
const std::vector<std::vector<int64_t>> & sorted_lane_ids);
100100

101-
bool hasEnoughLength(
102-
const LaneChangePath & path, const lanelet::ConstLanelets & current_lanes,
103-
const lanelet::ConstLanelets & target_lanes, const Pose & current_pose,
104-
const RouteHandler & route_handler, const double minimum_lane_changing_velocity,
105-
const BehaviorPathPlannerParameters & common_parameters,
106-
const Direction direction = Direction::NONE);
107-
108101
ShiftLine getLaneChangingShiftLine(
109102
const PathWithLaneId & prepare_segment, const PathWithLaneId & target_segment,
110103
const PathWithLaneId & reference_path, const double shift_length);
@@ -116,12 +109,6 @@ PathWithLaneId getReferencePathFromTargetLane(
116109
const double resample_interval, const bool is_goal_in_route,
117110
const double next_lane_change_buffer);
118111

119-
PathWithLaneId getTargetSegment(
120-
const RouteHandler & route_handler, const lanelet::ConstLanelets & target_lanelets,
121-
const double forward_path_length, const Pose & lane_changing_start_pose,
122-
const double target_lane_length, const double lane_changing_length,
123-
const double lane_changing_velocity, const double total_required_min_dist);
124-
125112
std::vector<DrivableLanes> generateDrivableLanes(
126113
const std::vector<DrivableLanes> original_drivable_lanes, const RouteHandler & route_handler,
127114
const lanelet::ConstLanelets & current_lanes, const lanelet::ConstLanelets & lane_change_lanes);
@@ -195,12 +182,5 @@ LaneChangeTargetObjectIndices filterObject(
195182
ExtendedPredictedObject transform(
196183
const PredictedObject & object, const BehaviorPathPlannerParameters & common_parameters,
197184
const LaneChangeParameters & lane_change_parameters);
198-
199-
LaneChangeTargetObjects getTargetObjects(
200-
const PredictedObjects & objects, const lanelet::ConstLanelets & current_lanes,
201-
const lanelet::ConstLanelets & target_lanes, const lanelet::ConstLanelets & target_backward_lanes,
202-
const Pose & current_pose, const RouteHandler & route_handler,
203-
const BehaviorPathPlannerParameters & common_parameters,
204-
const LaneChangeParameters & lane_change_parameters);
205185
} // namespace behavior_path_planner::utils::lane_change
206186
#endif // BEHAVIOR_PATH_PLANNER__UTILS__LANE_CHANGE__UTILS_HPP_

planning/behavior_path_planner/src/scene_module/lane_change/normal.cpp

+146-27
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,145 @@ PathWithLaneId NormalLaneChange::getPrepareSegment(
482482
return prepare_segment;
483483
}
484484

485+
LaneChangeTargetObjects NormalLaneChange::getTargetObjects(
486+
const lanelet::ConstLanelets & current_lanes, const lanelet::ConstLanelets & target_lanes) const
487+
{
488+
const auto current_pose = getEgoPose();
489+
const auto & route_handler = *getRouteHandler();
490+
const auto & common_parameters = planner_data_->parameters;
491+
const auto & objects = *planner_data_->dynamic_object;
492+
493+
// get backward lanes
494+
const auto backward_length = lane_change_parameters_->backward_lane_length;
495+
const auto target_backward_lanes = utils::lane_change::getBackwardLanelets(
496+
route_handler, target_lanes, current_pose, backward_length);
497+
498+
// filter objects to get target object index
499+
const auto target_obj_index = utils::lane_change::filterObject(
500+
objects, current_lanes, target_lanes, target_backward_lanes, current_pose, route_handler,
501+
*lane_change_parameters_);
502+
503+
LaneChangeTargetObjects target_objects;
504+
target_objects.current_lane.reserve(target_obj_index.current_lane.size());
505+
target_objects.target_lane.reserve(target_obj_index.target_lane.size());
506+
target_objects.other_lane.reserve(target_obj_index.other_lane.size());
507+
508+
// objects in current lane
509+
for (const auto & obj_idx : target_obj_index.current_lane) {
510+
const auto extended_object = utils::lane_change::transform(
511+
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_);
512+
target_objects.current_lane.push_back(extended_object);
513+
}
514+
515+
// objects in target lane
516+
for (const auto & obj_idx : target_obj_index.target_lane) {
517+
const auto extended_object = utils::lane_change::transform(
518+
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_);
519+
target_objects.target_lane.push_back(extended_object);
520+
}
521+
522+
// objects in other lane
523+
for (const auto & obj_idx : target_obj_index.other_lane) {
524+
const auto extended_object = utils::lane_change::transform(
525+
objects.objects.at(obj_idx), common_parameters, *lane_change_parameters_);
526+
target_objects.other_lane.push_back(extended_object);
527+
}
528+
529+
return target_objects;
530+
}
531+
532+
PathWithLaneId NormalLaneChange::getTargetSegment(
533+
const lanelet::ConstLanelets & target_lanelets, const Pose & lane_changing_start_pose,
534+
const double target_lane_length, const double lane_changing_length,
535+
const double lane_changing_velocity, const double buffer_for_next_lane_change) const
536+
{
537+
const auto & route_handler = *getRouteHandler();
538+
const auto forward_path_length = planner_data_->parameters.forward_path_length;
539+
540+
const double s_start = std::invoke([&lane_changing_start_pose, &target_lanelets,
541+
&lane_changing_length, &target_lane_length,
542+
&buffer_for_next_lane_change]() {
543+
const auto arc_to_start_pose =
544+
lanelet::utils::getArcCoordinates(target_lanelets, lane_changing_start_pose);
545+
const double dist_from_front_target_lanelet = arc_to_start_pose.length + lane_changing_length;
546+
const double end_of_lane_dist_without_buffer = target_lane_length - buffer_for_next_lane_change;
547+
return std::min(dist_from_front_target_lanelet, end_of_lane_dist_without_buffer);
548+
});
549+
550+
const double s_end = std::invoke(
551+
[&s_start, &forward_path_length, &target_lane_length, &buffer_for_next_lane_change]() {
552+
const double dist_from_start = s_start + forward_path_length;
553+
const double dist_from_end = target_lane_length - buffer_for_next_lane_change;
554+
return std::max(
555+
std::min(dist_from_start, dist_from_end), s_start + std::numeric_limits<double>::epsilon());
556+
});
557+
558+
RCLCPP_DEBUG(
559+
rclcpp::get_logger("behavior_path_planner")
560+
.get_child("lane_change")
561+
.get_child("util")
562+
.get_child("getTargetSegment"),
563+
"start: %f, end: %f", s_start, s_end);
564+
565+
PathWithLaneId target_segment = route_handler.getCenterLinePath(target_lanelets, s_start, s_end);
566+
for (auto & point : target_segment.points) {
567+
point.point.longitudinal_velocity_mps =
568+
std::min(point.point.longitudinal_velocity_mps, static_cast<float>(lane_changing_velocity));
569+
}
570+
571+
return target_segment;
572+
}
573+
574+
bool NormalLaneChange::hasEnoughLength(
575+
const LaneChangePath & path, const lanelet::ConstLanelets & current_lanes,
576+
const lanelet::ConstLanelets & target_lanes, const Direction direction) const
577+
{
578+
const auto current_pose = getEgoPose();
579+
const auto & route_handler = *getRouteHandler();
580+
const auto & common_parameters = planner_data_->parameters;
581+
const auto minimum_lane_changing_velocity = common_parameters.minimum_lane_changing_velocity;
582+
const auto lateral_jerk = common_parameters.lane_changing_lateral_jerk;
583+
const double lane_change_length = path.info.length.sum();
584+
const double max_lat_acc =
585+
common_parameters.lane_change_lat_acc_map.find(minimum_lane_changing_velocity).second;
586+
const auto shift_intervals =
587+
route_handler.getLateralIntervalsToPreferredLane(target_lanes.back(), direction);
588+
589+
double minimum_lane_change_length_to_preferred_lane = 0.0;
590+
for (const auto & shift_length : shift_intervals) {
591+
const auto lane_changing_time =
592+
PathShifter::calcShiftTimeFromJerk(shift_length, lateral_jerk, max_lat_acc);
593+
minimum_lane_change_length_to_preferred_lane +=
594+
minimum_lane_changing_velocity * lane_changing_time +
595+
common_parameters.minimum_prepare_length;
596+
}
597+
598+
if (lane_change_length > utils::getDistanceToEndOfLane(current_pose, current_lanes)) {
599+
return false;
600+
}
601+
602+
const auto goal_pose = route_handler.getGoalPose();
603+
if (
604+
route_handler.isInGoalRouteSection(current_lanes.back()) &&
605+
lane_change_length + minimum_lane_change_length_to_preferred_lane >
606+
utils::getSignedDistance(current_pose, goal_pose, current_lanes)) {
607+
return false;
608+
}
609+
610+
// return if there are no target lanes
611+
if (target_lanes.empty()) {
612+
return true;
613+
}
614+
615+
if (
616+
lane_change_length + minimum_lane_change_length_to_preferred_lane >
617+
utils::getDistanceToEndOfLane(current_pose, target_lanes)) {
618+
return false;
619+
}
620+
621+
return true;
622+
}
623+
485624
bool NormalLaneChange::getLaneChangePaths(
486625
const lanelet::ConstLanelets & original_lanelets, const lanelet::ConstLanelets & target_lanelets,
487626
Direction direction, LaneChangePaths * candidate_paths, const bool check_safety) const
@@ -491,9 +630,7 @@ bool NormalLaneChange::getLaneChangePaths(
491630
return false;
492631
}
493632
const auto & route_handler = *getRouteHandler();
494-
const auto & dynamic_objects = planner_data_->dynamic_object;
495633
const auto & common_parameter = planner_data_->parameters;
496-
const auto & current_pose = getEgoPose();
497634

498635
const auto backward_path_length = common_parameter.backward_path_length;
499636
const auto forward_path_length = common_parameter.forward_path_length;
@@ -554,13 +691,7 @@ bool NormalLaneChange::getLaneChangePaths(
554691
const auto target_neighbor_preferred_lane_poly_2d =
555692
lanelet::utils::to2D(target_neighbor_preferred_lane_poly).basicPolygon();
556693

557-
const auto backward_length = lane_change_parameters_->backward_lane_length;
558-
const auto backward_target_lanes_for_object_filtering = utils::lane_change::getBackwardLanelets(
559-
route_handler, target_lanelets, getEgoPose(), backward_length);
560-
const auto target_objects = utils::lane_change::getTargetObjects(
561-
*dynamic_objects, original_lanelets, target_lanelets,
562-
backward_target_lanes_for_object_filtering, current_pose, route_handler, common_parameter,
563-
*lane_change_parameters_);
694+
const auto target_objects = getTargetObjects(original_lanelets, target_lanelets);
564695

565696
candidate_paths->reserve(longitudinal_acc_sampling_values.size() * lateral_acc_sampling_num);
566697
for (const auto & sampled_longitudinal_acc : longitudinal_acc_sampling_values) {
@@ -653,10 +784,9 @@ bool NormalLaneChange::getLaneChangePaths(
653784
}
654785
}
655786

656-
const auto target_segment = utils::lane_change::getTargetSegment(
657-
route_handler, target_lanelets, forward_path_length, lane_changing_start_pose,
658-
target_lane_length, lane_changing_length, initial_lane_changing_velocity,
659-
next_lane_change_buffer);
787+
const auto target_segment = getTargetSegment(
788+
target_lanelets, lane_changing_start_pose, target_lane_length, lane_changing_length,
789+
initial_lane_changing_velocity, next_lane_change_buffer);
660790

661791
if (target_segment.points.empty()) {
662792
RCLCPP_DEBUG(logger_, "target segment is empty!! something wrong...");
@@ -708,9 +838,8 @@ bool NormalLaneChange::getLaneChangePaths(
708838
continue;
709839
}
710840

711-
const auto is_valid = utils::lane_change::hasEnoughLength(
712-
*candidate_path, original_lanelets, target_lanelets, getEgoPose(), route_handler,
713-
minimum_lane_changing_velocity, common_parameter, direction);
841+
const auto is_valid =
842+
hasEnoughLength(*candidate_path, original_lanelets, target_lanelets, direction);
714843

715844
if (!is_valid) {
716845
RCLCPP_DEBUG(logger_, "invalid candidate path!!");
@@ -743,22 +872,12 @@ bool NormalLaneChange::getLaneChangePaths(
743872

744873
PathSafetyStatus NormalLaneChange::isApprovedPathSafe() const
745874
{
746-
const auto current_pose = getEgoPose();
747-
const auto & dynamic_objects = planner_data_->dynamic_object;
748875
const auto & common_parameters = getCommonParam();
749-
const auto & lane_change_parameters = *lane_change_parameters_;
750-
const auto & route_handler = *getRouteHandler();
751876
const auto & path = status_.lane_change_path;
752877
const auto & current_lanes = status_.current_lanes;
753878
const auto & target_lanes = status_.lane_change_lanes;
754879

755-
// get lanes used for detection
756-
const auto backward_target_lanes_for_object_filtering = utils::lane_change::getBackwardLanelets(
757-
route_handler, target_lanes, current_pose, lane_change_parameters.backward_lane_length);
758-
759-
const auto target_objects = utils::lane_change::getTargetObjects(
760-
*dynamic_objects, current_lanes, target_lanes, backward_target_lanes_for_object_filtering,
761-
current_pose, route_handler, common_parameters, *lane_change_parameters_);
880+
const auto target_objects = getTargetObjects(current_lanes, target_lanes);
762881

763882
CollisionCheckDebugMap debug_data;
764883
const auto safety_status = isLaneChangePathSafe(

0 commit comments

Comments
 (0)