Skip to content

Commit

Permalink
fix(avoidance): don't output new candidate path if there is huge offs…
Browse files Browse the repository at this point in the history
…et between the ego and previous output path (#4150)

* fix(avoidance): don't output new candidate path if there is huge offset between the ego and previous output path

Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com>

* docs(avoidance): add parameter description

Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com>

---------

Signed-off-by: satoshi-ota <satoshi.ota928@gmail.com>
  • Loading branch information
satoshi-ota authored Jul 5, 2023
1 parent e95909d commit c9280db
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@
safety_check_idling_time: 1.5 # [s]
safety_check_accel_for_rss: 2.5 # [m/ss]
safety_check_hysteresis_factor: 2.0 # [-]
safety_check_ego_offset: 1.0 # [m]

# For avoidance maneuver
avoidance:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -655,13 +655,14 @@ namespace: `avoidance.target_filtering.`

namespace: `avoidance.safety_check.`

| Name | Unit | Type | Description | Default value |
| :----------------------------- | ------ | ------ | --------------------------------------------------------------------------------- | ------------- |
| safety_check_backward_distance | [m] | double | Backward distance to search the dynamic objects. | 50.0 |
| safety_check_time_horizon | [s] | double | Time horizon to check lateral/longitudinal margin is enough or not. | 10.0 |
| safety_check_idling_time | [t] | double | Time delay constant that be use for longitudinal margin calculation based on RSS. | 1.5 |
| safety_check_accel_for_rss | [m/ss] | double | Accel constant that be used for longitudinal margin calculation based on RSS. | 2.5 |
| safety_check_hysteresis_factor | [-] | double | Hysteresis factor that be used for chattering prevention. | 2.0 |
| Name | Unit | Type | Description | Default value |
| :----------------------------- | ------ | ------ | ---------------------------------------------------------------------------------------------------------- | ------------- |
| safety_check_backward_distance | [m] | double | Backward distance to search the dynamic objects. | 50.0 |
| safety_check_time_horizon | [s] | double | Time horizon to check lateral/longitudinal margin is enough or not. | 10.0 |
| safety_check_idling_time | [t] | double | Time delay constant that be use for longitudinal margin calculation based on RSS. | 1.5 |
| safety_check_accel_for_rss | [m/ss] | double | Accel constant that be used for longitudinal margin calculation based on RSS. | 2.5 |
| safety_check_hysteresis_factor | [-] | double | Hysteresis factor that be used for chattering prevention. | 2.0 |
| safety_check_ego_offset | [m] | double | Output new avoidance path **only when** the offset between ego and previous output path is less than this. | 1.0 |

### Avoidance maneuver parameters

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,9 @@ struct AvoidanceParameters
// transit hysteresis (unsafe to safe)
double safety_check_hysteresis_factor;

// don't output new candidate path if the offset between ego and path is larger than this.
double safety_check_ego_offset;

// keep target velocity in yield maneuver
double yield_velocity;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -494,6 +494,21 @@ void AvoidanceModule::fillEgoStatus(

const auto can_yield_maneuver = canYieldManeuver(data);

const size_t ego_seg_idx =
planner_data_->findEgoSegmentIndex(helper_.getPreviousSplineShiftPath().path.points);
const auto offset = std::abs(motion_utils::calcLateralOffset(
helper_.getPreviousSplineShiftPath().path.points, getEgoPosition(), ego_seg_idx));

// don't output new candidate path if the offset between the ego and previous output path is
// larger than threshold.
// TODO(Satoshi OTA): remove this workaround
if (offset > parameters_->safety_check_ego_offset) {
data.safe_new_sl.clear();
data.candidate_path = helper_.getPreviousSplineShiftPath();
RCLCPP_WARN_THROTTLE(getLogger(), *clock_, 500, "unsafe. canceling candidate path...");
return;
}

/**
* If the avoidance path is safe, use unapproved_new_sl for avoidance path generation.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,7 @@ AvoidanceModuleManager::AvoidanceModuleManager(
p.safety_check_accel_for_rss = get_parameter<double>(node, ns + "safety_check_accel_for_rss");
p.safety_check_hysteresis_factor =
get_parameter<double>(node, ns + "safety_check_hysteresis_factor");
p.safety_check_ego_offset = get_parameter<double>(node, ns + "safety_check_ego_offset");
}

// avoidance maneuver (lateral)
Expand Down

0 comments on commit c9280db

Please sign in to comment.