Skip to content

Commit 872cbdd

Browse files
authored
fix(avoidance): don't slow down if avoidance is NOT definitely necessary during unsafe condition (#6355)
* fix(avoidance): don't slow down if avoidance is NOT definitely necessary during unsafe condition Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com> * fix(avoidance): don't insert stop point when the path is invalid Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com> * refactor(avoidance): update parameter namespace Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com> --------- Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com>
1 parent a8364b4 commit 872cbdd

File tree

5 files changed

+42
-39
lines changed

5 files changed

+42
-39
lines changed

planning/behavior_path_avoidance_module/config/avoidance.param.yaml

+2-3
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@
66
resample_interval_for_output: 4.0 # [m]
77
# avoidance module common setting
88
enable_bound_clipping: false
9-
enable_yield_maneuver: true
10-
enable_yield_maneuver_during_shifting: false
119
enable_cancel_maneuver: true
1210
disable_path_update: false
1311

@@ -247,7 +245,8 @@
247245

248246
# For yield maneuver
249247
yield:
250-
yield_velocity: 2.78 # [m/s]
248+
enable: true # [-]
249+
enable_during_shifting: false # [-]
251250

252251
# For stop maneuver
253252
stop:

planning/behavior_path_avoidance_module/include/behavior_path_avoidance_module/data_structs.hpp

-3
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,6 @@ struct AvoidanceParameters
216216
size_t hysteresis_factor_safe_count;
217217
double hysteresis_factor_expand_rate{0.0};
218218

219-
// keep target velocity in yield maneuver
220-
double yield_velocity{0.0};
221-
222219
// maximum stop distance
223220
double stop_max_distance{0.0};
224221

planning/behavior_path_avoidance_module/include/behavior_path_avoidance_module/parameter_helper.hpp

+3-4
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,6 @@ AvoidanceParameters getParameter(rclcpp::Node * node)
4141
getOrDeclareParameter<double>(*node, ns + "resample_interval_for_output");
4242
p.enable_bound_clipping = getOrDeclareParameter<bool>(*node, ns + "enable_bound_clipping");
4343
p.enable_cancel_maneuver = getOrDeclareParameter<bool>(*node, ns + "enable_cancel_maneuver");
44-
p.enable_yield_maneuver = getOrDeclareParameter<bool>(*node, ns + "enable_yield_maneuver");
45-
p.enable_yield_maneuver_during_shifting =
46-
getOrDeclareParameter<bool>(*node, ns + "enable_yield_maneuver_during_shifting");
4744
p.disable_path_update = getOrDeclareParameter<bool>(*node, ns + "disable_path_update");
4845
p.publish_debug_marker = getOrDeclareParameter<bool>(*node, ns + "publish_debug_marker");
4946
p.print_debug_info = getOrDeclareParameter<bool>(*node, ns + "print_debug_info");
@@ -295,7 +292,9 @@ AvoidanceParameters getParameter(rclcpp::Node * node)
295292
// yield
296293
{
297294
const std::string ns = "avoidance.yield.";
298-
p.yield_velocity = getOrDeclareParameter<double>(*node, ns + "yield_velocity");
295+
p.enable_yield_maneuver = getOrDeclareParameter<bool>(*node, ns + "enable");
296+
p.enable_yield_maneuver_during_shifting =
297+
getOrDeclareParameter<bool>(*node, ns + "enable_during_shifting");
299298
}
300299

301300
// stop

planning/behavior_path_avoidance_module/include/behavior_path_avoidance_module/scene.hpp

-7
Original file line numberDiff line numberDiff line change
@@ -233,13 +233,6 @@ class AvoidanceModule : public SceneModuleInterface
233233
*/
234234
void insertPrepareVelocity(ShiftedPath & shifted_path) const;
235235

236-
/**
237-
* @brief insert decel point in output path in order to yield. the ego decelerates within
238-
* accel/jerk constraints.
239-
* @param target path.
240-
*/
241-
void insertYieldVelocity(ShiftedPath & shifted_path) const;
242-
243236
/**
244237
* @brief calculate stop distance based on object's overhang.
245238
* @param stop distance.

planning/behavior_path_avoidance_module/src/scene.cpp

+37-22
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,6 @@ void AvoidanceModule::updateEgoBehavior(const AvoidancePlanningData & data, Shif
692692
break;
693693
}
694694
case AvoidanceState::YIELD: {
695-
insertYieldVelocity(path);
696695
insertWaitPoint(isBestEffort(parameters_->policy_deceleration), path);
697696
break;
698697
}
@@ -1525,6 +1524,11 @@ void AvoidanceModule::insertWaitPoint(
15251524
{
15261525
const auto & data = avoid_data_;
15271526

1527+
// If avoidance path is NOT valid, don't insert any stop points.
1528+
if (!data.valid) {
1529+
return;
1530+
}
1531+
15281532
if (!data.stop_target_object) {
15291533
return;
15301534
}
@@ -1611,28 +1615,20 @@ void AvoidanceModule::insertStopPoint(
16111615
getEgoPosition(), stop_distance - MARGIN, 0.0, shifted_path.path, stop_pose_);
16121616
}
16131617

1614-
void AvoidanceModule::insertYieldVelocity(ShiftedPath & shifted_path) const
1618+
void AvoidanceModule::insertPrepareVelocity(ShiftedPath & shifted_path) const
16151619
{
1616-
const auto & p = parameters_;
16171620
const auto & data = avoid_data_;
16181621

1619-
if (data.target_objects.empty()) {
1622+
// If avoidance path is NOT safe, don't insert any slow down sections.
1623+
if (!data.safe && !data.stop_target_object) {
16201624
return;
16211625
}
16221626

1623-
if (helper_->isShifted()) {
1627+
// If avoidance path is NOT safe, don't insert any slow down sections.
1628+
if (!data.valid) {
16241629
return;
16251630
}
16261631

1627-
const auto decel_distance = helper_->getFeasibleDecelDistance(p->yield_velocity, false);
1628-
utils::avoidance::insertDecelPoint(
1629-
getEgoPosition(), decel_distance, p->yield_velocity, shifted_path.path, slow_pose_);
1630-
}
1631-
1632-
void AvoidanceModule::insertPrepareVelocity(ShiftedPath & shifted_path) const
1633-
{
1634-
const auto & data = avoid_data_;
1635-
16361632
// do nothing if there is no avoidance target.
16371633
if (data.target_objects.empty()) {
16381634
return;
@@ -1648,34 +1644,53 @@ void AvoidanceModule::insertPrepareVelocity(ShiftedPath & shifted_path) const
16481644
return;
16491645
}
16501646

1651-
const auto object = data.target_objects.front();
1647+
const auto itr = std::find_if(
1648+
data.target_objects.begin(), data.target_objects.end(),
1649+
[](const auto & o) { return o.avoid_required; });
1650+
1651+
const auto object = [&]() -> std::optional<ObjectData> {
1652+
if (!data.yield_required) {
1653+
return data.target_objects.front();
1654+
}
1655+
1656+
if (itr == data.target_objects.end()) {
1657+
return std::nullopt;
1658+
}
1659+
1660+
return *itr;
1661+
}();
1662+
1663+
// do nothing if it can't avoid at the moment and avoidance is NOT definitely necessary.
1664+
if (!object.has_value()) {
1665+
return;
1666+
}
16521667

16531668
const auto enough_space =
1654-
object.is_avoidable || object.reason == AvoidanceDebugFactor::TOO_LARGE_JERK;
1669+
object.value().is_avoidable || object.value().reason == AvoidanceDebugFactor::TOO_LARGE_JERK;
16551670
if (!enough_space) {
16561671
return;
16571672
}
16581673

16591674
// calculate shift length for front object.
16601675
const auto & vehicle_width = planner_data_->parameters.vehicle_width;
1661-
const auto object_type = utils::getHighestProbLabel(object.object.classification);
1676+
const auto object_type = utils::getHighestProbLabel(object.value().object.classification);
16621677
const auto object_parameter = parameters_->object_parameters.at(object_type);
1663-
const auto avoid_margin = object_parameter.lateral_hard_margin * object.distance_factor +
1678+
const auto avoid_margin = object_parameter.lateral_hard_margin * object.value().distance_factor +
16641679
object_parameter.lateral_soft_margin + 0.5 * vehicle_width;
1665-
const auto shift_length =
1666-
helper_->getShiftLength(object, utils::avoidance::isOnRight(object), avoid_margin);
1680+
const auto shift_length = helper_->getShiftLength(
1681+
object.value(), utils::avoidance::isOnRight(object.value()), avoid_margin);
16671682

16681683
// check slow down feasibility
16691684
const auto min_avoid_distance = helper_->getMinAvoidanceDistance(shift_length);
1670-
const auto distance_to_object = object.longitudinal;
1685+
const auto distance_to_object = object.value().longitudinal;
16711686
const auto remaining_distance = distance_to_object - min_avoid_distance;
16721687
const auto decel_distance = helper_->getFeasibleDecelDistance(parameters_->velocity_map.front());
16731688
if (remaining_distance < decel_distance) {
16741689
return;
16751690
}
16761691

16771692
// decide slow down lower limit.
1678-
const auto lower_speed = object.avoid_required ? 0.0 : parameters_->min_slow_down_speed;
1693+
const auto lower_speed = object.value().avoid_required ? 0.0 : parameters_->min_slow_down_speed;
16791694

16801695
// insert slow down speed.
16811696
const double current_target_velocity = PathShifter::calcFeasibleVelocityFromJerk(

0 commit comments

Comments
 (0)