@@ -482,6 +482,145 @@ PathWithLaneId NormalLaneChange::getPrepareSegment(
482
482
return prepare_segment;
483
483
}
484
484
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
+
485
624
bool NormalLaneChange::getLaneChangePaths (
486
625
const lanelet::ConstLanelets & original_lanelets, const lanelet::ConstLanelets & target_lanelets,
487
626
Direction direction, LaneChangePaths * candidate_paths, const bool check_safety) const
@@ -491,9 +630,7 @@ bool NormalLaneChange::getLaneChangePaths(
491
630
return false ;
492
631
}
493
632
const auto & route_handler = *getRouteHandler ();
494
- const auto & dynamic_objects = planner_data_->dynamic_object ;
495
633
const auto & common_parameter = planner_data_->parameters ;
496
- const auto & current_pose = getEgoPose ();
497
634
498
635
const auto backward_path_length = common_parameter.backward_path_length ;
499
636
const auto forward_path_length = common_parameter.forward_path_length ;
@@ -554,13 +691,7 @@ bool NormalLaneChange::getLaneChangePaths(
554
691
const auto target_neighbor_preferred_lane_poly_2d =
555
692
lanelet::utils::to2D (target_neighbor_preferred_lane_poly).basicPolygon ();
556
693
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);
564
695
565
696
candidate_paths->reserve (longitudinal_acc_sampling_values.size () * lateral_acc_sampling_num);
566
697
for (const auto & sampled_longitudinal_acc : longitudinal_acc_sampling_values) {
@@ -653,10 +784,9 @@ bool NormalLaneChange::getLaneChangePaths(
653
784
}
654
785
}
655
786
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);
660
790
661
791
if (target_segment.points .empty ()) {
662
792
RCLCPP_DEBUG (logger_, " target segment is empty!! something wrong..." );
@@ -708,9 +838,8 @@ bool NormalLaneChange::getLaneChangePaths(
708
838
continue ;
709
839
}
710
840
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);
714
843
715
844
if (!is_valid) {
716
845
RCLCPP_DEBUG (logger_, " invalid candidate path!!" );
@@ -743,22 +872,12 @@ bool NormalLaneChange::getLaneChangePaths(
743
872
744
873
PathSafetyStatus NormalLaneChange::isApprovedPathSafe () const
745
874
{
746
- const auto current_pose = getEgoPose ();
747
- const auto & dynamic_objects = planner_data_->dynamic_object ;
748
875
const auto & common_parameters = getCommonParam ();
749
- const auto & lane_change_parameters = *lane_change_parameters_;
750
- const auto & route_handler = *getRouteHandler ();
751
876
const auto & path = status_.lane_change_path ;
752
877
const auto & current_lanes = status_.current_lanes ;
753
878
const auto & target_lanes = status_.lane_change_lanes ;
754
879
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);
762
881
763
882
CollisionCheckDebugMap debug_data;
764
883
const auto safety_status = isLaneChangePathSafe (
0 commit comments