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

refactor(start_planner): refactor debug and safety check logic #5747

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 @@ -119,8 +119,7 @@
# EgoPredictedPath
ego_predicted_path:
min_velocity: 0.0
acceleration: 1.0
max_velocity: 1.0
min_acceleration: 1.0
time_horizon_for_front_object: 10.0
time_horizon_for_rear_object: 10.0
time_resolution: 0.5
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,13 @@
ros__parameters:
start_planner:

verbose: false

th_arrived_distance: 1.0
th_stopped_velocity: 0.01
th_stopped_time: 1.0
collision_check_margin: 1.0
collision_check_distance_from_end: 1.0
th_moving_object_velocity: 1.0
th_distance_to_middle_of_the_road: 0.1
th_distance_to_middle_of_the_road: 0.5
center_line_path_interval: 1.0
# shift pull out
enable_shift_pull_out: true
Expand All @@ -24,7 +22,7 @@
maximum_curvature: 0.07
# geometric pull out
enable_geometric_pull_out: true
divide_pull_out_path: false
divide_pull_out_path: true
kyoichi-sugahara marked this conversation as resolved.
Show resolved Hide resolved
geometric_pull_out_velocity: 1.0
arc_path_interval: 1.0
lane_departure_margin: 0.2
Expand Down Expand Up @@ -85,8 +83,7 @@
# EgoPredictedPath
ego_predicted_path:
min_velocity: 0.0
acceleration: 1.0
max_velocity: 1.0
min_acceleration: 1.0
time_horizon_for_front_object: 10.0
time_horizon_for_rear_object: 10.0
time_resolution: 0.5
Expand Down Expand Up @@ -140,3 +137,7 @@
# temporary
backward_path_length: 30.0
forward_path_length: 100.0

# debug
debug:
print_debug_info: false
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,14 @@ class StartPlannerModule : public SceneModuleInterface

bool canTransitIdleToRunningState() override;

/**
* @brief init member variables.
*/
void initVariables();

void initializeSafetyCheckParameters();

bool requiresDynamicObjectsCollisionDetection() const;
bool receivedNewRoute() const;

bool isModuleRunning() const;
Expand Down Expand Up @@ -200,7 +206,8 @@ class StartPlannerModule : public SceneModuleInterface
PredictedObjects filterStopObjectsInPullOutLanes(
const lanelet::ConstLanelets & pull_out_lanes, const double velocity_threshold) const;
bool hasFinishedPullOut() const;
bool isBackwardDrivingComplete() const;
bool hasFinishedBackwardDriving() const;
bool hasCollisionWithDynamicObjects() const;
bool isStopped();
bool isStuck();
bool hasFinishedCurrentPath();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,6 @@ struct StartPlannerParameters
double collision_check_distance_from_end{0.0};
double th_moving_object_velocity{0.0};
double center_line_path_interval{0.0};
bool verbose{false};

// shift pull out
bool enable_shift_pull_out{false};
Expand Down Expand Up @@ -93,6 +92,8 @@ struct StartPlannerParameters
utils::path_safety_checker::EgoPredictedPathParams ego_predicted_path_params{};
utils::path_safety_checker::ObjectsFilteringParams objects_filtering_params{};
utils::path_safety_checker::SafetyCheckParams safety_check_params{};

bool print_debug_info{false};
};

} // namespace behavior_path_planner
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,9 +255,7 @@
p.ego_predicted_path_params.min_velocity =
node->declare_parameter<double>(ego_path_ns + "min_velocity");
p.ego_predicted_path_params.acceleration =
node->declare_parameter<double>(ego_path_ns + "acceleration");
p.ego_predicted_path_params.max_velocity =
node->declare_parameter<double>(ego_path_ns + "max_velocity");
node->declare_parameter<double>(ego_path_ns + "min_acceleration");

Check notice on line 258 in planning/behavior_path_planner/src/scene_module/goal_planner/manager.cpp

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (main)

✅ Getting better: Large Method

GoalPlannerModuleManager::GoalPlannerModuleManager decreases from 322 to 320 lines of code, threshold = 70. Large functions with many lines of code are generally harder to understand and lower the code health. Avoid adding more lines to this function.
p.ego_predicted_path_params.time_horizon_for_front_object =
node->declare_parameter<double>(ego_path_ns + "time_horizon_for_front_object");
p.ego_predicted_path_params.time_horizon_for_rear_object =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,250 +32,253 @@
StartPlannerParameters p;

std::string ns = "start_planner.";

p.verbose = node->declare_parameter<bool>(ns + "verbose");
p.th_arrived_distance = node->declare_parameter<double>(ns + "th_arrived_distance");
p.th_stopped_velocity = node->declare_parameter<double>(ns + "th_stopped_velocity");
p.th_stopped_time = node->declare_parameter<double>(ns + "th_stopped_time");
p.th_turn_signal_on_lateral_offset =
node->declare_parameter<double>(ns + "th_turn_signal_on_lateral_offset");
p.th_distance_to_middle_of_the_road =
node->declare_parameter<double>(ns + "th_distance_to_middle_of_the_road");
p.intersection_search_length = node->declare_parameter<double>(ns + "intersection_search_length");
p.length_ratio_for_turn_signal_deactivation_near_intersection = node->declare_parameter<double>(
ns + "length_ratio_for_turn_signal_deactivation_near_intersection");
p.collision_check_margin = node->declare_parameter<double>(ns + "collision_check_margin");
p.collision_check_distance_from_end =
node->declare_parameter<double>(ns + "collision_check_distance_from_end");
p.th_moving_object_velocity = node->declare_parameter<double>(ns + "th_moving_object_velocity");
p.center_line_path_interval = node->declare_parameter<double>(ns + "center_line_path_interval");
// shift pull out
p.enable_shift_pull_out = node->declare_parameter<bool>(ns + "enable_shift_pull_out");
p.check_shift_path_lane_departure =
node->declare_parameter<bool>(ns + "check_shift_path_lane_departure");
p.minimum_shift_pull_out_distance =
node->declare_parameter<double>(ns + "minimum_shift_pull_out_distance");
p.lateral_acceleration_sampling_num =
node->declare_parameter<int>(ns + "lateral_acceleration_sampling_num");
p.lateral_jerk = node->declare_parameter<double>(ns + "lateral_jerk");
p.maximum_lateral_acc = node->declare_parameter<double>(ns + "maximum_lateral_acc");
p.minimum_lateral_acc = node->declare_parameter<double>(ns + "minimum_lateral_acc");
p.maximum_curvature = node->declare_parameter<double>(ns + "maximum_curvature");
p.deceleration_interval = node->declare_parameter<double>(ns + "deceleration_interval");
// geometric pull out
p.enable_geometric_pull_out = node->declare_parameter<bool>(ns + "enable_geometric_pull_out");
p.divide_pull_out_path = node->declare_parameter<bool>(ns + "divide_pull_out_path");
p.parallel_parking_parameters.pull_out_velocity =
node->declare_parameter<double>(ns + "geometric_pull_out_velocity");
p.parallel_parking_parameters.pull_out_path_interval =
node->declare_parameter<double>(ns + "arc_path_interval");
p.parallel_parking_parameters.pull_out_lane_departure_margin =
node->declare_parameter<double>(ns + "lane_departure_margin");
p.parallel_parking_parameters.pull_out_max_steer_angle =
node->declare_parameter<double>(ns + "pull_out_max_steer_angle"); // 15deg
p.parallel_parking_parameters.center_line_path_interval =
p.center_line_path_interval; // for geometric parallel parking
// search start pose backward
p.search_priority = node->declare_parameter<std::string>(
ns + "search_priority"); // "efficient_path" or "short_back_distance"
p.enable_back = node->declare_parameter<bool>(ns + "enable_back");
p.backward_velocity = node->declare_parameter<double>(ns + "backward_velocity");
p.max_back_distance = node->declare_parameter<double>(ns + "max_back_distance");
p.backward_search_resolution = node->declare_parameter<double>(ns + "backward_search_resolution");
p.backward_path_update_duration =
node->declare_parameter<double>(ns + "backward_path_update_duration");
p.ignore_distance_from_lane_end =
node->declare_parameter<double>(ns + "ignore_distance_from_lane_end");
// freespace planner general params
{
std::string ns = "start_planner.freespace_planner.";
p.enable_freespace_planner = node->declare_parameter<bool>(ns + "enable_freespace_planner");
p.freespace_planner_algorithm =
node->declare_parameter<std::string>(ns + "freespace_planner_algorithm");
p.end_pose_search_start_distance =
node->declare_parameter<double>(ns + "end_pose_search_start_distance");
p.end_pose_search_end_distance =
node->declare_parameter<double>(ns + "end_pose_search_end_distance");
p.end_pose_search_interval = node->declare_parameter<double>(ns + "end_pose_search_interval");
p.freespace_planner_velocity = node->declare_parameter<double>(ns + "velocity");
p.vehicle_shape_margin = node->declare_parameter<double>(ns + "vehicle_shape_margin");
p.freespace_planner_common_parameters.time_limit =
node->declare_parameter<double>(ns + "time_limit");
p.freespace_planner_common_parameters.minimum_turning_radius =
node->declare_parameter<double>(ns + "minimum_turning_radius");
p.freespace_planner_common_parameters.maximum_turning_radius =
node->declare_parameter<double>(ns + "maximum_turning_radius");
p.freespace_planner_common_parameters.turning_radius_size =
node->declare_parameter<int>(ns + "turning_radius_size");
p.freespace_planner_common_parameters.maximum_turning_radius = std::max(
p.freespace_planner_common_parameters.maximum_turning_radius,
p.freespace_planner_common_parameters.minimum_turning_radius);
p.freespace_planner_common_parameters.turning_radius_size =
std::max(p.freespace_planner_common_parameters.turning_radius_size, 1);
}
// freespace planner search config
{
std::string ns = "start_planner.freespace_planner.search_configs.";
p.freespace_planner_common_parameters.theta_size =
node->declare_parameter<int>(ns + "theta_size");
p.freespace_planner_common_parameters.angle_goal_range =
node->declare_parameter<double>(ns + "angle_goal_range");
p.freespace_planner_common_parameters.curve_weight =
node->declare_parameter<double>(ns + "curve_weight");
p.freespace_planner_common_parameters.reverse_weight =
node->declare_parameter<double>(ns + "reverse_weight");
p.freespace_planner_common_parameters.lateral_goal_range =
node->declare_parameter<double>(ns + "lateral_goal_range");
p.freespace_planner_common_parameters.longitudinal_goal_range =
node->declare_parameter<double>(ns + "longitudinal_goal_range");
}
// freespace planner costmap configs
{
std::string ns = "start_planner.freespace_planner.costmap_configs.";
p.freespace_planner_common_parameters.obstacle_threshold =
node->declare_parameter<int>(ns + "obstacle_threshold");
}
// freespace planner astar
{
std::string ns = "start_planner.freespace_planner.astar.";
p.astar_parameters.only_behind_solutions =
node->declare_parameter<bool>(ns + "only_behind_solutions");
p.astar_parameters.use_back = node->declare_parameter<bool>(ns + "use_back");
p.astar_parameters.distance_heuristic_weight =
node->declare_parameter<double>(ns + "distance_heuristic_weight");
}
// freespace planner rrtstar
{
std::string ns = "start_planner.freespace_planner.rrtstar.";
p.rrt_star_parameters.enable_update = node->declare_parameter<bool>(ns + "enable_update");
p.rrt_star_parameters.use_informed_sampling =
node->declare_parameter<bool>(ns + "use_informed_sampling");
p.rrt_star_parameters.max_planning_time =
node->declare_parameter<double>(ns + "max_planning_time");
p.rrt_star_parameters.neighbor_radius = node->declare_parameter<double>(ns + "neighbor_radius");
p.rrt_star_parameters.margin = node->declare_parameter<double>(ns + "margin");
}

// stop condition
{
p.maximum_deceleration_for_stop =
node->declare_parameter<double>(ns + "stop_condition.maximum_deceleration_for_stop");
p.maximum_jerk_for_stop =
node->declare_parameter<double>(ns + "stop_condition.maximum_jerk_for_stop");
}

std::string base_ns = "start_planner.path_safety_check.";

// EgoPredictedPath
std::string ego_path_ns = base_ns + "ego_predicted_path.";
{
p.ego_predicted_path_params.min_velocity =
node->declare_parameter<double>(ego_path_ns + "min_velocity");
p.ego_predicted_path_params.acceleration =
node->declare_parameter<double>(ego_path_ns + "acceleration");
p.ego_predicted_path_params.max_velocity =
node->declare_parameter<double>(ego_path_ns + "max_velocity");
node->declare_parameter<double>(ego_path_ns + "min_acceleration");
p.ego_predicted_path_params.time_horizon_for_front_object =
node->declare_parameter<double>(ego_path_ns + "time_horizon_for_front_object");
p.ego_predicted_path_params.time_horizon_for_rear_object =
node->declare_parameter<double>(ego_path_ns + "time_horizon_for_rear_object");
p.ego_predicted_path_params.time_resolution =
node->declare_parameter<double>(ego_path_ns + "time_resolution");
p.ego_predicted_path_params.delay_until_departure =
node->declare_parameter<double>(ego_path_ns + "delay_until_departure");
}

// ObjectFilteringParams
std::string obj_filter_ns = base_ns + "target_filtering.";
{
p.objects_filtering_params.safety_check_time_horizon =
node->declare_parameter<double>(obj_filter_ns + "safety_check_time_horizon");
p.objects_filtering_params.safety_check_time_resolution =
node->declare_parameter<double>(obj_filter_ns + "safety_check_time_resolution");
p.objects_filtering_params.object_check_forward_distance =
node->declare_parameter<double>(obj_filter_ns + "object_check_forward_distance");
p.objects_filtering_params.object_check_backward_distance =
node->declare_parameter<double>(obj_filter_ns + "object_check_backward_distance");
p.objects_filtering_params.ignore_object_velocity_threshold =
node->declare_parameter<double>(obj_filter_ns + "ignore_object_velocity_threshold");
p.objects_filtering_params.include_opposite_lane =
node->declare_parameter<bool>(obj_filter_ns + "include_opposite_lane");
p.objects_filtering_params.invert_opposite_lane =
node->declare_parameter<bool>(obj_filter_ns + "invert_opposite_lane");
p.objects_filtering_params.check_all_predicted_path =
node->declare_parameter<bool>(obj_filter_ns + "check_all_predicted_path");
p.objects_filtering_params.use_all_predicted_path =
node->declare_parameter<bool>(obj_filter_ns + "use_all_predicted_path");
p.objects_filtering_params.use_predicted_path_outside_lanelet =
node->declare_parameter<bool>(obj_filter_ns + "use_predicted_path_outside_lanelet");
}

// ObjectTypesToCheck
std::string obj_types_ns = obj_filter_ns + "object_types_to_check.";
{
p.objects_filtering_params.object_types_to_check.check_car =
node->declare_parameter<bool>(obj_types_ns + "check_car");
p.objects_filtering_params.object_types_to_check.check_truck =
node->declare_parameter<bool>(obj_types_ns + "check_truck");
p.objects_filtering_params.object_types_to_check.check_bus =
node->declare_parameter<bool>(obj_types_ns + "check_bus");
p.objects_filtering_params.object_types_to_check.check_trailer =
node->declare_parameter<bool>(obj_types_ns + "check_trailer");
p.objects_filtering_params.object_types_to_check.check_unknown =
node->declare_parameter<bool>(obj_types_ns + "check_unknown");
p.objects_filtering_params.object_types_to_check.check_bicycle =
node->declare_parameter<bool>(obj_types_ns + "check_bicycle");
p.objects_filtering_params.object_types_to_check.check_motorcycle =
node->declare_parameter<bool>(obj_types_ns + "check_motorcycle");
p.objects_filtering_params.object_types_to_check.check_pedestrian =
node->declare_parameter<bool>(obj_types_ns + "check_pedestrian");
}

// ObjectLaneConfiguration
std::string obj_lane_ns = obj_filter_ns + "object_lane_configuration.";
{
p.objects_filtering_params.object_lane_configuration.check_current_lane =
node->declare_parameter<bool>(obj_lane_ns + "check_current_lane");
p.objects_filtering_params.object_lane_configuration.check_right_lane =
node->declare_parameter<bool>(obj_lane_ns + "check_right_side_lane");
p.objects_filtering_params.object_lane_configuration.check_left_lane =
node->declare_parameter<bool>(obj_lane_ns + "check_left_side_lane");
p.objects_filtering_params.object_lane_configuration.check_shoulder_lane =
node->declare_parameter<bool>(obj_lane_ns + "check_shoulder_lane");
p.objects_filtering_params.object_lane_configuration.check_other_lane =
node->declare_parameter<bool>(obj_lane_ns + "check_other_lane");
}

// SafetyCheckParams
std::string safety_check_ns = base_ns + "safety_check_params.";
{
p.safety_check_params.enable_safety_check =
node->declare_parameter<bool>(safety_check_ns + "enable_safety_check");
p.safety_check_params.hysteresis_factor_expand_rate =
node->declare_parameter<double>(safety_check_ns + "hysteresis_factor_expand_rate");
p.safety_check_params.backward_path_length =
node->declare_parameter<double>(safety_check_ns + "backward_path_length");
p.safety_check_params.forward_path_length =
node->declare_parameter<double>(safety_check_ns + "forward_path_length");
p.safety_check_params.publish_debug_marker =
node->declare_parameter<bool>(safety_check_ns + "publish_debug_marker");
}

// RSSparams
std::string rss_ns = safety_check_ns + "rss_params.";
{
p.safety_check_params.rss_params.rear_vehicle_reaction_time =
node->declare_parameter<double>(rss_ns + "rear_vehicle_reaction_time");
p.safety_check_params.rss_params.rear_vehicle_safety_time_margin =
node->declare_parameter<double>(rss_ns + "rear_vehicle_safety_time_margin");
p.safety_check_params.rss_params.lateral_distance_max_threshold =
node->declare_parameter<double>(rss_ns + "lateral_distance_max_threshold");
p.safety_check_params.rss_params.longitudinal_distance_min_threshold =
node->declare_parameter<double>(rss_ns + "longitudinal_distance_min_threshold");
p.safety_check_params.rss_params.longitudinal_velocity_delta_time =
node->declare_parameter<double>(rss_ns + "longitudinal_velocity_delta_time");
}

// debug
std::string debug_ns = ns + "debug.";
{
p.print_debug_info = node->declare_parameter<bool>(debug_ns + "print_debug_info");
}

Check warning on line 281 in planning/behavior_path_planner/src/scene_module/start_planner/manager.cpp

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (main)

❌ Getting worse: Large Method

StartPlannerModuleManager::StartPlannerModuleManager increases from 234 to 235 lines of code, threshold = 70. Large functions with many lines of code are generally harder to understand and lower the code health. Avoid adding more lines to this function.
// validation of parameters
if (p.lateral_acceleration_sampling_num < 1) {
RCLCPP_FATAL_STREAM(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2022 TIER IV, Inc.

Check notice on line 1 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (main)

✅ Getting better: Lines of Code in a Single File

The lines of code decreases from 1017 to 1012, improve code health by reducing it to 1000. The number of Lines of Code in a single file. More Lines of Code lowers the code health.
//
// 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 @@ -36,9 +36,15 @@
#include <utility>
#include <vector>

using behavior_path_planner::utils::start_goal_planner_common::initializeCollisionCheckDebugMap;
using motion_utils::calcLongitudinalOffsetPose;
using tier4_autoware_utils::calcOffsetPose;

// set as macro so that calling function name will be printed.
// debug print is heavy. turn on only when debugging.
#define DEBUG_PRINT(...) \
RCLCPP_DEBUG_EXPRESSION(getLogger(), parameters_->print_debug_info, __VA_ARGS__)

namespace behavior_path_planner
{
StartPlannerModule::StartPlannerModule(
Expand Down Expand Up @@ -107,38 +113,59 @@

void StartPlannerModule::processOnEntry()
{
// Initialize safety checker
if (parameters_->safety_check_params.enable_safety_check) {
initializeSafetyCheckParameters();
utils::start_goal_planner_common::initializeCollisionCheckDebugMap(
start_planner_data_.collision_check);
}
initVariables();
}

void StartPlannerModule::processOnExit()
{
initVariables();
}

Check warning on line 122 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L121-L122

Added lines #L121 - L122 were not covered by tests

void StartPlannerModule::initVariables()
{
resetPathCandidate();
resetPathReference();
debug_marker_.markers.clear();
initializeSafetyCheckParameters();
initializeCollisionCheckDebugMap(start_planner_data_.collision_check);
}

void StartPlannerModule::updateData()
{
if (isBackwardDrivingComplete()) {
if (receivedNewRoute()) {
resetStatus();
DEBUG_PRINT("StartPlannerModule::updateData() received new route, reset status");
}

if (hasFinishedBackwardDriving()) {
updateStatusAfterBackwardDriving();
DEBUG_PRINT("StartPlannerModule::updateData() completed backward driving");
} else {
status_.backward_driving_complete = false;
}

if (receivedNewRoute()) {
status_ = PullOutStatus();
if (requiresDynamicObjectsCollisionDetection()) {
status_.is_safe_dynamic_objects = !hasCollisionWithDynamicObjects();

Check warning on line 148 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L148

Added line #L148 was not covered by tests
}
// check safety status when driving forward
if (parameters_->safety_check_params.enable_safety_check && status_.driving_forward) {
status_.is_safe_dynamic_objects = isSafePath();
} else {
status_.is_safe_dynamic_objects = true;
}

bool StartPlannerModule::hasFinishedBackwardDriving() const
kosuke55 marked this conversation as resolved.
Show resolved Hide resolved
{
// check ego car is close enough to pull out start pose and stopped
const auto current_pose = planner_data_->self_odometry->pose.pose;
const auto distance =
tier4_autoware_utils::calcDistance2d(current_pose, status_.pull_out_start_pose);

const bool is_near = distance < parameters_->th_arrived_distance;
const double ego_vel = utils::l2Norm(planner_data_->self_odometry->twist.twist.linear);
const bool is_stopped = ego_vel < parameters_->th_stopped_velocity;

const bool back_finished = !status_.driving_forward && is_near && is_stopped;
if (back_finished) {
RCLCPP_INFO(getLogger(), "back finished");
}

return back_finished;
}

bool StartPlannerModule::receivedNewRoute() const
Expand All @@ -147,6 +174,18 @@
*planner_data_->prev_route_id != planner_data_->route_handler->getRouteUuid();
}

bool StartPlannerModule::requiresDynamicObjectsCollisionDetection() const
{
return parameters_->safety_check_params.enable_safety_check && status_.driving_forward;
}

bool StartPlannerModule::hasCollisionWithDynamicObjects() const

Check warning on line 182 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L182

Added line #L182 was not covered by tests
{
// TODO(Sugahara): update path, params for predicted path and so on in this function to avoid
// mutable
return !isSafePath();

Check warning on line 186 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L186

Added line #L186 was not covered by tests
}

bool StartPlannerModule::isExecutionRequested() const
{
if (isModuleRunning()) {
Expand Down Expand Up @@ -211,33 +250,50 @@
parameters_->th_stopped_velocity;
}

bool StartPlannerModule::isStopped()
{
odometry_buffer_.push_back(planner_data_->self_odometry);
// Delete old data in buffer
while (rclcpp::ok()) {
const auto time_diff = rclcpp::Time(odometry_buffer_.back()->header.stamp) -
rclcpp::Time(odometry_buffer_.front()->header.stamp);
if (time_diff.seconds() < parameters_->th_stopped_time) {
break;
}
odometry_buffer_.pop_front();

Check warning on line 263 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L263

Added line #L263 was not covered by tests
}
return !std::any_of(
odometry_buffer_.begin(), odometry_buffer_.end(), [this](const auto & odometry) {
return utils::l2Norm(odometry->twist.twist.linear) > parameters_->th_stopped_velocity;
});
}

bool StartPlannerModule::isExecutionReady() const

Check warning on line 271 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L271

Added line #L271 was not covered by tests
{
// when found_pull_out_path is false,the path is not generated and approval shouldn't be
// allowed
bool is_safe = true;

// Evaluate safety. The situation is not safe if any of the following conditions are met:
// 1. pull out path has not been found
// 2. waiting for approval and there is a collision with dynamic objects
if (!status_.found_pull_out_path) {
RCLCPP_ERROR_THROTTLE(getLogger(), *clock_, 5000, "Pull over path is not found");
return false;
is_safe = false;
}

if (
parameters_->safety_check_params.enable_safety_check && status_.driving_forward &&
isWaitingApproval()) {
if (!isSafePath()) {
RCLCPP_ERROR_THROTTLE(getLogger(), *clock_, 5000, "Path is not safe against dynamic objects");
stop_pose_ = planner_data_->self_odometry->pose.pose;
return false;
}
if (requiresDynamicObjectsCollisionDetection()) {

Check notice on line 282 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (main)

✅ No longer an issue: Complex Conditional

StartPlannerModule::isExecutionReady no longer has a complex conditional. A complex conditional is an expression inside a branch (e.g. if, for, while) which consists of multiple, logical operators such as AND/OR. The more logical operators in an expression, the more severe the code smell.
is_safe = !hasCollisionWithDynamicObjects();

Check warning on line 283 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L283

Added line #L283 was not covered by tests
}
return true;

if (!is_safe) stop_pose_ = planner_data_->self_odometry->pose.pose;

return is_safe;

Check warning on line 288 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L288

Added line #L288 was not covered by tests
}

bool StartPlannerModule::canTransitSuccessState()

Check warning on line 291 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L291

Added line #L291 was not covered by tests
{
return hasFinishedPullOut();

Check warning on line 293 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L293

Added line #L293 was not covered by tests
}

bool StartPlannerModule::canTransitIdleToRunningState()

Check warning on line 296 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L296

Added line #L296 was not covered by tests
{
return isActivated() && !isWaitingApproval();
}
Expand Down Expand Up @@ -461,8 +517,7 @@

void StartPlannerModule::resetStatus()
{
PullOutStatus initial_status;
status_ = initial_status;
status_ = PullOutStatus{};
}

void StartPlannerModule::incrementPathIndex()
Expand Down Expand Up @@ -722,7 +777,7 @@
const auto pull_out_lanes = start_planner_utils::getPullOutLanes(
planner_data_, planner_data_->parameters.backward_path_length + parameters_->max_back_distance);

if (isBackwardDrivingComplete()) {
if (hasFinishedBackwardDriving()) {
updateStatusAfterBackwardDriving();
} else {
status_.backward_path = start_planner_utils::getBackwardPath(
Expand All @@ -746,7 +801,7 @@

PathWithLaneId StartPlannerModule::calcBackwardPathFromStartPose() const
{
const Pose start_pose = planner_data_->route_handler->getOriginalStartPose();

Check warning on line 804 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L804

Added line #L804 was not covered by tests
const auto pull_out_lanes = start_planner_utils::getPullOutLanes(
planner_data_, planner_data_->parameters.backward_path_length + parameters_->max_back_distance);

Expand Down Expand Up @@ -865,49 +920,7 @@

return has_finished;
}

Check notice on line 923 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (main)

✅ No longer an issue: Bumpy Road Ahead

StartPlannerModule::isStopped is no longer above the threshold for logical blocks with deeply nested code. The Bumpy Road code smell is a function that contains multiple chunks of nested conditional logic. The deeper the nesting and the more bumps, the lower the code health.
bool StartPlannerModule::isBackwardDrivingComplete() const
{
// check ego car is close enough to pull out start pose and stopped
const auto current_pose = planner_data_->self_odometry->pose.pose;
const auto distance =
tier4_autoware_utils::calcDistance2d(current_pose, status_.pull_out_start_pose);

const bool is_near = distance < parameters_->th_arrived_distance;
const double ego_vel = utils::l2Norm(planner_data_->self_odometry->twist.twist.linear);
const bool is_stopped = ego_vel < parameters_->th_stopped_velocity;

const bool back_finished = !status_.driving_forward && is_near && is_stopped;
if (back_finished) {
RCLCPP_INFO(getLogger(), "back finished");
}

return back_finished;
}

bool StartPlannerModule::isStopped()
{
odometry_buffer_.push_back(planner_data_->self_odometry);
// Delete old data in buffer
while (rclcpp::ok()) {
const auto time_diff = rclcpp::Time(odometry_buffer_.back()->header.stamp) -
rclcpp::Time(odometry_buffer_.front()->header.stamp);
if (time_diff.seconds() < parameters_->th_stopped_time) {
break;
}
odometry_buffer_.pop_front();
}
bool is_stopped = true;
for (const auto & odometry : odometry_buffer_) {
const double ego_vel = utils::l2Norm(odometry->twist.twist.linear);
if (ego_vel > parameters_->th_stopped_velocity) {
is_stopped = false;
break;
}
}
return is_stopped;
}

bool StartPlannerModule::isStuck()
{
if (!isStopped()) {
Expand Down Expand Up @@ -1091,14 +1104,14 @@
utils::start_goal_planner_common::updateSafetyCheckTargetObjectsData(
start_planner_data_, filtered_objects, target_objects_on_lane, ego_predicted_path);

return behavior_path_planner::utils::path_safety_checker::checkSafetyWithRSS(

Check warning on line 1107 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1107

Added line #L1107 was not covered by tests
pull_out_path, ego_predicted_path, target_objects_on_lane.on_current_lane,
start_planner_data_.collision_check, planner_data_->parameters,

Check warning on line 1109 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1109

Added line #L1109 was not covered by tests
safety_check_params_->rss_params, objects_filtering_params_->use_all_predicted_path,
hysteresis_factor);

Check warning on line 1111 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1111

Added line #L1111 was not covered by tests
}

bool StartPlannerModule::isGoalBehindOfEgoInSameRouteSegment() const

Check warning on line 1114 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1114

Added line #L1114 was not covered by tests
{
const auto & rh = planner_data_->route_handler;

Expand Down Expand Up @@ -1262,8 +1275,7 @@
add(showSafetyCheckInfo(start_planner_data_.collision_check, "object_debug_info"));
add(showPredictedPath(start_planner_data_.collision_check, "ego_predicted_path"));
add(showPolygon(start_planner_data_.collision_check, "ego_and_target_polygon_relation"));
utils::start_goal_planner_common::initializeCollisionCheckDebugMap(
start_planner_data_.collision_check);
initializeCollisionCheckDebugMap(start_planner_data_.collision_check);

Check warning on line 1278 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1278

Added line #L1278 was not covered by tests
}

// Visualize planner type text
Expand All @@ -1286,41 +1298,38 @@
planner_type_marker_array.markers.push_back(marker);
add(planner_type_marker_array);
}
if (parameters_->verbose) {
logPullOutStatus();
}
}

void StartPlannerModule::logPullOutStatus(rclcpp::Logger::Level log_level) const

Check warning on line 1303 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1303

Added line #L1303 was not covered by tests
{
const auto logger = getLogger();
auto logFunc = [&logger, log_level](const char * format, ...) {

Check warning on line 1306 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1306

Added line #L1306 was not covered by tests
char buffer[1024];
va_list args;
va_start(args, format);
vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);

Check warning on line 1311 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1311

Added line #L1311 was not covered by tests
switch (log_level) {
case rclcpp::Logger::Level::Debug:

Check warning on line 1313 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1313

Added line #L1313 was not covered by tests
RCLCPP_DEBUG(logger, "%s", buffer);
break;
case rclcpp::Logger::Level::Info:

Check warning on line 1316 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1316

Added line #L1316 was not covered by tests
RCLCPP_INFO(logger, "%s", buffer);
break;
case rclcpp::Logger::Level::Warn:

Check warning on line 1319 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1319

Added line #L1319 was not covered by tests
RCLCPP_WARN(logger, "%s", buffer);
break;
case rclcpp::Logger::Level::Error:

Check warning on line 1322 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1322

Added line #L1322 was not covered by tests
RCLCPP_ERROR(logger, "%s", buffer);
break;
case rclcpp::Logger::Level::Fatal:

Check warning on line 1325 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1325

Added line #L1325 was not covered by tests
RCLCPP_FATAL(logger, "%s", buffer);
break;
default:

Check warning on line 1328 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1328

Added line #L1328 was not covered by tests
RCLCPP_INFO(logger, "%s", buffer);
break;
}
};

Check warning on line 1332 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1332

Added line #L1332 was not covered by tests

logFunc("======== PullOutStatus Report ========");

Expand Down Expand Up @@ -1348,5 +1357,5 @@
logFunc(" ModuleStatus: %s", current_status.c_str());

logFunc("=======================================");
}

Check warning on line 1360 in planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp

View check run for this annotation

Codecov / codecov/patch

planning/behavior_path_planner/src/scene_module/start_planner/start_planner_module.cpp#L1360

Added line #L1360 was not covered by tests
} // namespace behavior_path_planner
Loading
Loading