@@ -870,23 +870,27 @@ LaneChangeTargetObjects NormalLaneChange::getTargetObjects(
870
870
target_objects.other_lane .reserve (target_obj_index.other_lane .size ());
871
871
872
872
// objects in current lane
873
+ const auto is_check_prepare_phase = check_prepare_phase ();
873
874
for (const auto & obj_idx : target_obj_index.current_lane ) {
874
875
const auto extended_object = utils::lane_change::transform (
875
- objects.objects .at (obj_idx), common_parameters, *lane_change_parameters_);
876
+ objects.objects .at (obj_idx), common_parameters, *lane_change_parameters_,
877
+ is_check_prepare_phase);
876
878
target_objects.current_lane .push_back (extended_object);
877
879
}
878
880
879
881
// objects in target lane
880
882
for (const auto & obj_idx : target_obj_index.target_lane ) {
881
883
const auto extended_object = utils::lane_change::transform (
882
- objects.objects .at (obj_idx), common_parameters, *lane_change_parameters_);
884
+ objects.objects .at (obj_idx), common_parameters, *lane_change_parameters_,
885
+ is_check_prepare_phase);
883
886
target_objects.target_lane .push_back (extended_object);
884
887
}
885
888
886
889
// objects in other lane
887
890
for (const auto & obj_idx : target_obj_index.other_lane ) {
888
891
const auto extended_object = utils::lane_change::transform (
889
- objects.objects .at (obj_idx), common_parameters, *lane_change_parameters_);
892
+ objects.objects .at (obj_idx), common_parameters, *lane_change_parameters_,
893
+ is_check_prepare_phase);
890
894
target_objects.other_lane .push_back (extended_object);
891
895
}
892
896
@@ -950,8 +954,8 @@ LaneChangeTargetObjectIndices NormalLaneChange::filterObject(
950
954
const auto obj_velocity_norm = std::hypot (
951
955
object.kinematics .initial_twist_with_covariance .twist .linear .x ,
952
956
object.kinematics .initial_twist_with_covariance .twist .linear .y );
953
- const auto extended_object =
954
- utils::lane_change::transform ( object, common_parameters, *lane_change_parameters_);
957
+ const auto extended_object = utils::lane_change::transform (
958
+ object, common_parameters, *lane_change_parameters_, check_prepare_phase () );
955
959
956
960
const auto obj_polygon = tier4_autoware_utils::toPolygon2d (object);
957
961
@@ -1270,9 +1274,8 @@ bool NormalLaneChange::getLaneChangePaths(
1270
1274
(prepare_duration < 1e-3 ) ? 0.0
1271
1275
: ((prepare_velocity - current_velocity) / prepare_duration);
1272
1276
1273
- const double prepare_length =
1274
- current_velocity * prepare_duration +
1275
- 0.5 * longitudinal_acc_on_prepare * std::pow (prepare_duration, 2 );
1277
+ const auto prepare_length = utils::lane_change::calcPhaseLength (
1278
+ current_velocity, getCommonParam ().max_vel , longitudinal_acc_on_prepare, prepare_duration);
1276
1279
1277
1280
auto prepare_segment = getPrepareSegment (current_lanes, backward_path_length, prepare_length);
1278
1281
@@ -1324,9 +1327,9 @@ bool NormalLaneChange::getLaneChangePaths(
1324
1327
utils::lane_change::calcLaneChangingAcceleration (
1325
1328
initial_lane_changing_velocity, max_path_velocity, lane_changing_time,
1326
1329
sampled_longitudinal_acc);
1327
- const auto lane_changing_length =
1328
- initial_lane_changing_velocity * lane_changing_time +
1329
- 0.5 * longitudinal_acc_on_lane_changing * lane_changing_time * lane_changing_time ;
1330
+ const auto lane_changing_length = utils::lane_change::calcPhaseLength (
1331
+ initial_lane_changing_velocity, getCommonParam (). max_vel ,
1332
+ longitudinal_acc_on_lane_changing, lane_changing_time) ;
1330
1333
const auto terminal_lane_changing_velocity = std::min (
1331
1334
initial_lane_changing_velocity + longitudinal_acc_on_lane_changing * lane_changing_time,
1332
1335
getCommonParam ().max_vel );
@@ -2118,4 +2121,33 @@ void NormalLaneChange::updateStopTime()
2118
2121
stop_watch_.tic (" stop_time" );
2119
2122
}
2120
2123
2124
+ bool NormalLaneChange::check_prepare_phase () const
2125
+ {
2126
+ const auto & route_handler = getRouteHandler ();
2127
+ const auto & vehicle_info = getCommonParam ().vehicle_info ;
2128
+
2129
+ const auto check_in_general_lanes =
2130
+ lane_change_parameters_->enable_collision_check_for_prepare_phase_in_general_lanes ;
2131
+
2132
+ lanelet::ConstLanelet current_lane;
2133
+ if (!route_handler->getClosestLaneletWithinRoute (getEgoPose (), ¤t_lane)) {
2134
+ RCLCPP_DEBUG (
2135
+ logger_, " Unable to get current lane. Default to %s." ,
2136
+ (check_in_general_lanes ? " true" : " false" ));
2137
+ return check_in_general_lanes;
2138
+ }
2139
+
2140
+ const auto ego_footprint = utils::lane_change::getEgoCurrentFootprint (getEgoPose (), vehicle_info);
2141
+
2142
+ const auto check_in_intersection = std::invoke ([&]() {
2143
+ if (!lane_change_parameters_->enable_collision_check_for_prepare_phase_in_intersection ) {
2144
+ return false ;
2145
+ }
2146
+
2147
+ return utils::lane_change::isWithinIntersection (route_handler, current_lane, ego_footprint);
2148
+ });
2149
+
2150
+ return check_in_intersection || check_in_general_lanes;
2151
+ }
2152
+
2121
2153
} // namespace behavior_path_planner
0 commit comments