Skip to content

Commit 686ec6a

Browse files
authored
Merge branch 'autowarefoundation:main' into feat/distortion_correction_node_update_azimuth_and_distance
2 parents a7ccf4a + 6c84559 commit 686ec6a

File tree

18 files changed

+354
-139
lines changed

18 files changed

+354
-139
lines changed

Diff for: launch/tier4_perception_launch/launch/perception.launch.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@
104104
<!-- Radar long range integration methods -->
105105
<arg
106106
name="use_radar_tracking_fusion"
107-
default="false"
107+
default="true"
108108
description="if use_radar_tracking_fusion:=true, radar information is merged in tracking launch. Otherwise, radar information is merged in detection launch."
109109
/>
110110

Diff for: planning/behavior_path_planner/config/avoidance/avoidance.param.yaml

+2-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,8 @@
190190
max_deviation_from_lane: 0.5 # [m]
191191
# avoidance distance parameters
192192
longitudinal:
193-
prepare_time: 2.0 # [s]
193+
min_prepare_time: 1.0 # [s]
194+
max_prepare_time: 2.0 # [s]
194195
min_prepare_distance: 1.0 # [m]
195196
min_slow_down_speed: 1.38 # [m/s]
196197
buf_slow_down_speed: 0.56 # [m/s]

Diff for: planning/behavior_path_planner/include/behavior_path_planner/utils/avoidance/avoidance_module_data.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,8 @@ struct AvoidanceParameters
211211
double stop_buffer{0.0};
212212

213213
// start avoidance after this time to avoid sudden path change
214-
double prepare_time{0.0};
214+
double min_prepare_time{0.0};
215+
double max_prepare_time{0.0};
215216

216217
// Even if the vehicle speed is zero, avoidance will start after a distance of this much.
217218
double min_prepare_distance{0.0};

Diff for: planning/behavior_path_planner/include/behavior_path_planner/utils/avoidance/helper.hpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,16 @@ class AvoidanceHelper
9191
return std::max(getEgoSpeed(), values.at(idx));
9292
}
9393

94+
double getMinimumPrepareDistance() const
95+
{
96+
const auto & p = parameters_;
97+
return std::max(getEgoSpeed() * p->min_prepare_time, p->min_prepare_distance);
98+
}
99+
94100
double getNominalPrepareDistance() const
95101
{
96102
const auto & p = parameters_;
97-
return std::max(getEgoSpeed() * p->prepare_time, p->min_prepare_distance);
103+
return std::max(getEgoSpeed() * p->max_prepare_time, p->min_prepare_distance);
98104
}
99105

100106
double getNominalAvoidanceDistance(const double shift_length) const
@@ -185,7 +191,8 @@ class AvoidanceHelper
185191
max_shift_length, getLateralMinJerkLimit(), getEgoSpeed());
186192

187193
return std::clamp(
188-
1.5 * dynamic_distance, parameters_->object_check_min_forward_distance,
194+
1.5 * dynamic_distance + getNominalPrepareDistance(),
195+
parameters_->object_check_min_forward_distance,
189196
parameters_->object_check_max_forward_distance);
190197
}
191198

Diff for: planning/behavior_path_planner/src/scene_module/avoidance/avoidance_module.cpp

+63-41
Original file line numberDiff line numberDiff line change
@@ -437,10 +437,27 @@ bool AvoidanceModule::canYieldManeuver(const AvoidancePlanningData & data) const
437437
{
438438
// transit yield maneuver only when the avoidance maneuver is not initiated.
439439
if (helper_.isShifted()) {
440+
RCLCPP_DEBUG(getLogger(), "avoidance maneuver already initiated.");
440441
return false;
441442
}
442443

444+
// prevent sudden steering.
445+
const auto registered_lines = path_shifter_.getShiftLines();
446+
if (!registered_lines.empty()) {
447+
const size_t idx = planner_data_->findEgoIndex(path_shifter_.getReferencePath().points);
448+
const auto to_shift_start_point = calcSignedArcLength(
449+
path_shifter_.getReferencePath().points, idx, registered_lines.front().start_idx);
450+
if (to_shift_start_point < helper_.getMinimumPrepareDistance()) {
451+
RCLCPP_DEBUG(
452+
getLogger(),
453+
"Distance to shift start point is less than minimum prepare distance. The distance is not "
454+
"enough.");
455+
return false;
456+
}
457+
}
458+
443459
if (!data.stop_target_object) {
460+
RCLCPP_DEBUG(getLogger(), "can pass by the object safely without avoidance maneuver.");
444461
return true;
445462
}
446463

@@ -920,8 +937,9 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
920937
const auto & base_link2rear = planner_data_->parameters.base_link2rear;
921938

922939
// Calculate feasible shift length
923-
const auto get_shift_length =
924-
[&](auto & object, const auto & desire_shift_length) -> boost::optional<double> {
940+
const auto get_shift_profile =
941+
[&](
942+
auto & object, const auto & desire_shift_length) -> std::optional<std::pair<double, double>> {
925943
// use each object param
926944
const auto object_type = utils::getHighestProbLabel(object.object.classification);
927945
const auto object_parameter = parameters_->object_parameters.at(object_type);
@@ -931,55 +949,57 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
931949
const auto avoiding_shift = desire_shift_length - current_ego_shift;
932950
const auto nominal_avoid_distance = helper_.getMaxAvoidanceDistance(avoiding_shift);
933951

952+
// calculate remaining distance.
953+
const auto prepare_distance = helper_.getNominalPrepareDistance();
954+
const auto & additional_buffer_longitudinal =
955+
object_parameter.use_conservative_buffer_longitudinal
956+
? planner_data_->parameters.base_link2front
957+
: 0.0;
958+
const auto constant = object_parameter.safety_buffer_longitudinal +
959+
additional_buffer_longitudinal + prepare_distance;
960+
const auto has_enough_distance = object.longitudinal > constant + nominal_avoid_distance;
961+
const auto remaining_distance = object.longitudinal - constant;
962+
const auto avoidance_distance =
963+
has_enough_distance ? nominal_avoid_distance : remaining_distance;
964+
965+
// nominal case. avoidable.
966+
if (has_enough_distance) {
967+
return std::make_pair(desire_shift_length, avoidance_distance);
968+
}
969+
934970
if (!isBestEffort(parameters_->policy_lateral_margin)) {
935-
return desire_shift_length;
971+
return std::make_pair(desire_shift_length, avoidance_distance);
936972
}
937973

938974
// ego already has enough positive shift.
939975
const auto has_enough_positive_shift = avoiding_shift < -1e-3 && desire_shift_length > 1e-3;
940976
if (is_object_on_right && has_enough_positive_shift) {
941-
return desire_shift_length;
977+
return std::make_pair(desire_shift_length, avoidance_distance);
942978
}
943979

944980
// ego already has enough negative shift.
945981
const auto has_enough_negative_shift = avoiding_shift > 1e-3 && desire_shift_length < -1e-3;
946982
if (!is_object_on_right && has_enough_negative_shift) {
947-
return desire_shift_length;
983+
return std::make_pair(desire_shift_length, avoidance_distance);
948984
}
949985

950986
// don't relax shift length since it can stop in front of the object.
951987
if (object.is_stoppable && !parameters_->use_shorten_margin_immediately) {
952-
return desire_shift_length;
988+
return std::make_pair(desire_shift_length, avoidance_distance);
953989
}
954990

955-
// calculate remaining distance.
956-
const auto prepare_distance = helper_.getNominalPrepareDistance();
957-
const auto & additional_buffer_longitudinal =
958-
object_parameter.use_conservative_buffer_longitudinal
959-
? planner_data_->parameters.base_link2front
960-
: 0.0;
961-
const auto constant = object_parameter.safety_buffer_longitudinal +
962-
additional_buffer_longitudinal + prepare_distance;
963-
const auto has_enough_distance = object.longitudinal > constant + nominal_avoid_distance;
964-
const auto remaining_distance = object.longitudinal - constant;
965-
966991
// the avoidance path is already approved
967992
const auto & object_pos = object.object.kinematics.initial_pose_with_covariance.pose.position;
968993
const auto is_approved = (helper_.getShift(object_pos) > 0.0 && is_object_on_right) ||
969994
(helper_.getShift(object_pos) < 0.0 && !is_object_on_right);
970995
if (is_approved) {
971-
return desire_shift_length;
996+
return std::make_pair(desire_shift_length, avoidance_distance);
972997
}
973998

974999
// prepare distance is not enough. unavoidable.
9751000
if (remaining_distance < 1e-3) {
9761001
object.reason = AvoidanceDebugFactor::REMAINING_DISTANCE_LESS_THAN_ZERO;
977-
return boost::none;
978-
}
979-
980-
// nominal case. avoidable.
981-
if (has_enough_distance) {
982-
return desire_shift_length;
1002+
return std::nullopt;
9831003
}
9841004

9851005
// calculate lateral jerk.
@@ -988,13 +1008,13 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
9881008

9891009
// relax lateral jerk limit. avoidable.
9901010
if (required_jerk < helper_.getLateralMaxJerkLimit()) {
991-
return desire_shift_length;
1011+
return std::make_pair(desire_shift_length, avoidance_distance);
9921012
}
9931013

9941014
// avoidance distance is not enough. unavoidable.
9951015
if (!isBestEffort(parameters_->policy_deceleration)) {
9961016
object.reason = AvoidanceDebugFactor::TOO_LARGE_JERK;
997-
return boost::none;
1017+
return std::nullopt;
9981018
}
9991019

10001020
// output avoidance path under lateral jerk constraints.
@@ -1003,7 +1023,7 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
10031023

10041024
if (std::abs(feasible_relative_shift_length) < parameters_->lateral_execution_threshold) {
10051025
object.reason = "LessThanExecutionThreshold";
1006-
return boost::none;
1026+
return std::nullopt;
10071027
}
10081028

10091029
const auto feasible_shift_length =
@@ -1017,7 +1037,7 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
10171037
RCLCPP_WARN_THROTTLE(
10181038
getLogger(), *clock_, 1000, "feasible shift length is not enough to avoid. ");
10191039
object.reason = AvoidanceDebugFactor::TOO_LARGE_JERK;
1020-
return boost::none;
1040+
return std::nullopt;
10211041
}
10221042

10231043
{
@@ -1026,7 +1046,7 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
10261046
std::abs(avoiding_shift), feasible_relative_shift_length);
10271047
}
10281048

1029-
return feasible_shift_length;
1049+
return std::make_pair(feasible_shift_length, avoidance_distance);
10301050
};
10311051

10321052
const auto is_forward_object = [](const auto & object) { return object.longitudinal > 0.0; };
@@ -1061,9 +1081,9 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
10611081
// use each object param
10621082
const auto object_type = utils::getHighestProbLabel(o.object.classification);
10631083
const auto object_parameter = parameters_->object_parameters.at(object_type);
1064-
const auto feasible_shift_length = get_shift_length(o, desire_shift_length);
1084+
const auto feasible_shift_profile = get_shift_profile(o, desire_shift_length);
10651085

1066-
if (!feasible_shift_length) {
1086+
if (!feasible_shift_profile.has_value()) {
10671087
if (o.avoid_required && is_forward_object(o)) {
10681088
break;
10691089
} else {
@@ -1072,10 +1092,8 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
10721092
}
10731093

10741094
// use absolute dist for return-to-center, relative dist from current for avoiding.
1075-
const auto feasible_avoid_distance =
1076-
helper_.getMaxAvoidanceDistance(feasible_shift_length.get() - current_ego_shift);
10771095
const auto feasible_return_distance =
1078-
helper_.getMaxAvoidanceDistance(feasible_shift_length.get());
1096+
helper_.getMaxAvoidanceDistance(feasible_shift_profile.value().first);
10791097

10801098
AvoidLine al_avoid;
10811099
{
@@ -1091,14 +1109,15 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
10911109

10921110
// start point (use previous linear shift length as start shift length.)
10931111
al_avoid.start_longitudinal = [&]() {
1094-
const auto nearest_avoid_distance = std::max(to_shift_end - feasible_avoid_distance, 1e-3);
1112+
const auto nearest_avoid_distance =
1113+
std::max(to_shift_end - feasible_shift_profile.value().second, 1e-3);
10951114

10961115
if (data.to_start_point > to_shift_end) {
10971116
return nearest_avoid_distance;
10981117
}
10991118

11001119
const auto minimum_avoid_distance =
1101-
helper_.getMinAvoidanceDistance(feasible_shift_length.get() - current_ego_shift);
1120+
helper_.getMinAvoidanceDistance(feasible_shift_profile.value().first - current_ego_shift);
11021121
const auto furthest_avoid_distance = std::max(to_shift_end - minimum_avoid_distance, 1e-3);
11031122

11041123
return std::clamp(data.to_start_point, nearest_avoid_distance, furthest_avoid_distance);
@@ -1110,7 +1129,7 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
11101129
al_avoid.start_shift_length = helper_.getLinearShift(al_avoid.start.position);
11111130

11121131
// end point
1113-
al_avoid.end_shift_length = feasible_shift_length.get();
1132+
al_avoid.end_shift_length = feasible_shift_profile.value().first;
11141133
al_avoid.end_longitudinal = to_shift_end;
11151134

11161135
// misc
@@ -1125,7 +1144,7 @@ AvoidOutlines AvoidanceModule::generateAvoidOutline(
11251144
const auto to_shift_start = o.longitudinal + offset;
11261145

11271146
// start point
1128-
al_return.start_shift_length = feasible_shift_length.get();
1147+
al_return.start_shift_length = feasible_shift_profile.value().first;
11291148
al_return.start_longitudinal = to_shift_start;
11301149

11311150
// end point
@@ -1652,6 +1671,10 @@ void AvoidanceModule::applySmallShiftFilter(
16521671
continue;
16531672
}
16541673

1674+
if (s.start_longitudinal < helper_.getMinimumPrepareDistance()) {
1675+
continue;
1676+
}
1677+
16551678
shift_lines.push_back(s);
16561679
}
16571680
}
@@ -2405,9 +2428,8 @@ AvoidLineArray AvoidanceModule::findNewShiftLine(
24052428
for (size_t i = 0; i < shift_lines.size(); ++i) {
24062429
const auto & candidate = shift_lines.at(i);
24072430

2408-
// new shift points must exist in front of Ego
2409-
// this value should be larger than -eps consider path shifter calculation error.
2410-
if (candidate.start_idx < avoid_data_.ego_closest_path_index) {
2431+
// prevent sudden steering.
2432+
if (candidate.start_longitudinal < helper_.getMinimumPrepareDistance()) {
24112433
break;
24122434
}
24132435

Diff for: planning/behavior_path_planner/src/scene_module/avoidance/manager.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,8 @@ AvoidanceModuleManager::AvoidanceModuleManager(
221221
// avoidance maneuver (longitudinal)
222222
{
223223
std::string ns = "avoidance.avoidance.longitudinal.";
224-
p.prepare_time = getOrDeclareParameter<double>(*node, ns + "prepare_time");
224+
p.min_prepare_time = getOrDeclareParameter<double>(*node, ns + "min_prepare_time");
225+
p.max_prepare_time = getOrDeclareParameter<double>(*node, ns + "max_prepare_time");
225226
p.min_prepare_distance = getOrDeclareParameter<double>(*node, ns + "min_prepare_distance");
226227
p.min_slow_down_speed = getOrDeclareParameter<double>(*node, ns + "min_slow_down_speed");
227228
p.buf_slow_down_speed = getOrDeclareParameter<double>(*node, ns + "buf_slow_down_speed");
@@ -390,7 +391,8 @@ void AvoidanceModuleManager::updateModuleParams(const std::vector<rclcpp::Parame
390391

391392
{
392393
const std::string ns = "avoidance.avoidance.longitudinal.";
393-
updateParam<double>(parameters, ns + "prepare_time", p->prepare_time);
394+
updateParam<double>(parameters, ns + "min_prepare_time", p->min_prepare_time);
395+
updateParam<double>(parameters, ns + "max_prepare_time", p->max_prepare_time);
394396
updateParam<double>(parameters, ns + "min_slow_down_speed", p->min_slow_down_speed);
395397
updateParam<double>(parameters, ns + "buf_slow_down_speed", p->buf_slow_down_speed);
396398
}

Diff for: planning/behavior_velocity_out_of_lane_module/config/out_of_lane.param.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use_predicted_paths: true # if true, use the predicted paths to estimate future positions.
1818
# if false, assume the object moves at constant velocity along *all* lanelets it currently is located in.
1919
predicted_path_min_confidence : 0.1 # when using predicted paths, ignore the ones whose confidence is lower than this value.
20+
distance_buffer: 1.0 # [m] distance buffer used to determine if a collision will occur in the other lane
2021

2122
overlap:
2223
minimum_distance: 0.0 # [m] minimum distance inside a lanelet for an overlap to be considered
@@ -26,6 +27,7 @@
2627
skip_if_over_max_decel: true # if true, do not take an action that would cause more deceleration than the maximum allowed
2728
precision: 0.1 # [m] precision when inserting a stop pose in the path
2829
distance_buffer: 1.5 # [m] buffer distance to try to keep between the ego footprint and lane
30+
min_duration: 1.0 # [s] minimum duration needed before a decision can be canceled
2931
slowdown:
3032
distance_threshold: 30.0 # [m] insert a slowdown when closer than this distance from an overlap
3133
velocity: 2.0 # [m/s] slowdown velocity

0 commit comments

Comments
 (0)