Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(crosswalk)!: improve stuck prevention on crosswalk #6150

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
enable_stuck_check_in_intersection: false # [-] flag to enable stuck vehicle checking for crosswalk which is in intersection
stuck_vehicle_velocity: 1.0 # [m/s] threshold velocity whether other vehicles are assumed to be stuck or not.
max_stuck_vehicle_lateral_offset: 2.0 # [m] The feature does not handle the vehicles farther than this value to the ego's path.
stuck_vehicle_attention_range: 10.0 # [m] Ego does not enter the crosswalk area if a stuck vehicle exists within this distance from the end of the crosswalk on the ego's path.
required_clearance: 6.0 # [m] clearance to be secured between the ego and the ahead vehicle
min_acc: -1.0 # min acceleration [m/ss]
min_jerk: -1.0 # min jerk [m/sss]
max_jerk: 1.0 # max jerk [m/sss]
Expand Down
4 changes: 2 additions & 2 deletions planning/behavior_velocity_crosswalk_module/src/manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ CrosswalkModuleManager::CrosswalkModuleManager(rclcpp::Node & node)
getOrDeclareParameter<double>(node, ns + ".stuck_vehicle.stuck_vehicle_velocity");
cp.max_stuck_vehicle_lateral_offset =
getOrDeclareParameter<double>(node, ns + ".stuck_vehicle.max_stuck_vehicle_lateral_offset");
cp.stuck_vehicle_attention_range =
getOrDeclareParameter<double>(node, ns + ".stuck_vehicle.stuck_vehicle_attention_range");
cp.required_clearance =
getOrDeclareParameter<double>(node, ns + ".stuck_vehicle.required_clearance");
cp.min_acc_for_stuck_vehicle = getOrDeclareParameter<double>(node, ns + ".stuck_vehicle.min_acc");
cp.max_jerk_for_stuck_vehicle =
getOrDeclareParameter<double>(node, ns + ".stuck_vehicle.max_jerk");
Expand Down
54 changes: 27 additions & 27 deletions planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2020 Tier IV, Inc.

Check notice on line 1 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (main)

✅ Getting better: Overall Code Complexity

The mean cyclomatic complexity decreases from 6.03 to 5.97, threshold = 4. This file has many conditional statements (e.g. if, for, while) across its implementation, leading to lower code health. Avoid adding more conditionals.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -906,48 +906,48 @@
continue;
}

const auto & obj_pos = object.kinematics.initial_pose_with_covariance.pose.position;
const auto lateral_offset = calcLateralOffset(ego_path.points, obj_pos);
const auto & obj_pose = object.kinematics.initial_pose_with_covariance.pose;
const auto lateral_offset = calcLateralOffset(ego_path.points, obj_pose.position);

Check warning on line 910 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp#L909-L910

Added lines #L909 - L910 were not covered by tests
if (p.max_stuck_vehicle_lateral_offset < std::abs(lateral_offset)) {
continue;
}

const auto & ego_pos = planner_data_->current_odometry->pose.position;
const auto ego_vel = planner_data_->current_velocity->twist.linear.x;
const auto ego_acc = planner_data_->current_acceleration->accel.accel.linear.x;

const double near_attention_range =
calcSignedArcLength(ego_path.points, ego_pos, path_intersects.back());
const double far_attention_range = near_attention_range + p.stuck_vehicle_attention_range;

const auto dist_ego2obj = calcSignedArcLength(ego_path.points, ego_pos, obj_pos);

if (near_attention_range < dist_ego2obj && dist_ego2obj < far_attention_range) {
// Plan STOP considering min_acc, max_jerk and min_jerk.
const auto min_feasible_dist_ego2stop = calcDecelDistWithJerkAndAccConstraints(
ego_vel, 0.0, ego_acc, p.min_acc_for_stuck_vehicle, p.max_jerk_for_stuck_vehicle,
p.min_jerk_for_stuck_vehicle);
if (!min_feasible_dist_ego2stop) {
continue;
// check if STOP is required
const double crosswalk_front_to_obj_rear =
calcSignedArcLength(ego_path.points, path_intersects.front(), obj_pose.position) -
object.shape.dimensions.x / 2.0;

Check warning on line 918 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp#L917-L918

Added lines #L917 - L918 were not covered by tests
const double crosswalk_back_to_obj_rear =
calcSignedArcLength(ego_path.points, path_intersects.back(), obj_pose.position) -

Check warning on line 920 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp#L920

Added line #L920 was not covered by tests
object.shape.dimensions.x / 2.0;
const double required_space_length =
planner_data_->vehicle_info_.vehicle_length_m + planner_param_.required_clearance;

Check warning on line 923 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp#L923

Added line #L923 was not covered by tests

if (crosswalk_front_to_obj_rear > 0.0 && crosswalk_back_to_obj_rear < required_space_length) {
// If there exists at least one vehicle ahead, plan STOP considering min_acc, max_jerk and
// min_jerk. Note that nearest search is not required because the stop pose independents to
// the vehicles.
const auto braking_distance = calcDecelDistWithJerkAndAccConstraints(
planner_data_->current_velocity->twist.linear.x, 0.0,
planner_data_->current_acceleration->accel.accel.linear.x, p.min_acc_for_stuck_vehicle,
p.max_jerk_for_stuck_vehicle, p.min_jerk_for_stuck_vehicle);

Check warning on line 932 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp#L929-L932

Added lines #L929 - L932 were not covered by tests
if (!braking_distance) {
return {};
}

const auto & ego_pos = planner_data_->current_odometry->pose.position;

Check warning on line 937 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp#L937

Added line #L937 was not covered by tests
const double dist_ego2stop =
calcSignedArcLength(ego_path.points, ego_pos, stop_pose->position);
const double feasible_dist_ego2stop = std::max(*min_feasible_dist_ego2stop, dist_ego2stop);
const double feasible_dist_ego2stop = std::max(*braking_distance, dist_ego2stop);

Check warning on line 940 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp#L940

Added line #L940 was not covered by tests
const double dist_to_ego =
calcSignedArcLength(ego_path.points, ego_path.points.front().point.pose.position, ego_pos);

const auto feasible_stop_pose =
calcLongitudinalOffsetPose(ego_path.points, 0, dist_to_ego + feasible_dist_ego2stop);
if (!feasible_stop_pose) {
continue;
return {};
}

setObjectsOfInterestData(
object.kinematics.initial_pose_with_covariance.pose, object.shape, ColorName::RED);

// early return may not appropriate because the nearest in range object should be handled
return createStopFactor(*feasible_stop_pose, {obj_pos});
setObjectsOfInterestData(obj_pose, object.shape, ColorName::RED);

Check warning on line 949 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp#L949

Added line #L949 was not covered by tests
return createStopFactor(*feasible_stop_pose, {obj_pose.position});

Check notice on line 950 in planning/behavior_velocity_crosswalk_module/src/scene_crosswalk.cpp

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (main)

✅ Getting better: Complex Method

CrosswalkModule::checkStopForStuckVehicles decreases in cyclomatic complexity from 21 to 19, threshold = 9. This function has many conditional statements (e.g. if, for, while), leading to lower code health. Avoid adding more conditionals and code to it without refactoring.
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ class CrosswalkModule : public SceneModuleInterface
bool enable_stuck_check_in_intersection{false};
double stuck_vehicle_velocity;
double max_stuck_vehicle_lateral_offset;
double stuck_vehicle_attention_range;
double required_clearance;
double min_acc_for_stuck_vehicle;
double max_jerk_for_stuck_vehicle;
double min_jerk_for_stuck_vehicle;
Expand Down
Loading