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(planning_validator): add diag to check planning component latency #10241

Merged
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 @@ -27,6 +27,7 @@
velocity_deviation: 100.0
distance_deviation: 100.0
longitudinal_distance_deviation: 1.0
nominal_latency: 1.0

parameters:
# The required trajectory length is calculated as the distance needed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ struct ValidationParams
double velocity_deviation_threshold;
double distance_deviation_threshold;
double longitudinal_distance_deviation_threshold;
double nominal_latency_threshold;

// parameters
double forward_trajectory_length_acceleration;
Expand Down Expand Up @@ -86,6 +87,7 @@ class PlanningValidator : public rclcpp::Node
bool checkValidDistanceDeviation(const Trajectory & trajectory);
bool checkValidLongitudinalDistanceDeviation(const Trajectory & trajectory);
bool checkValidForwardTrajectoryLength(const Trajectory & trajectory);
bool checkValidLatency(const Trajectory & trajectory);

private:
void setupDiag();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ bool is_valid_velocity_deviation
bool is_valid_distance_deviation
bool is_valid_longitudinal_distance_deviation
bool is_valid_forward_trajectory_length
bool is_valid_latency

# values
int64 trajectory_size
Expand All @@ -31,5 +32,6 @@ float64 distance_deviation
float64 longitudinal_distance_deviation
float64 forward_trajectory_length_required
float64 forward_trajectory_length_measured
float64 latency

int64 invalid_count
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@
p.distance_deviation_threshold = declare_parameter<double>(t + "distance_deviation");
p.longitudinal_distance_deviation_threshold =
declare_parameter<double>(t + "longitudinal_distance_deviation");
p.nominal_latency_threshold = declare_parameter<double>(t + "nominal_latency");

const std::string ps = "parameters.";
p.forward_trajectory_length_acceleration =
Expand Down Expand Up @@ -168,6 +169,9 @@
stat, validation_status_.is_valid_forward_trajectory_length,
"trajectory length is too short");
});
d->add(ns + "latency", [&](auto & stat) {
setStatus(stat, validation_status_.is_valid_latency, "latency is larger than expected value.");
});
}

bool PlanningValidator::isDataReady()
Expand Down Expand Up @@ -319,6 +323,7 @@
s.is_valid_lateral_acc = checkValidLateralAcceleration(resampled);
s.is_valid_steering = checkValidSteering(resampled);
s.is_valid_steering_rate = checkValidSteeringRate(resampled);
s.is_valid_latency = checkValidLatency(trajectory);

s.invalid_count = isAllValid(s) ? 0 : s.invalid_count + 1;
}
Expand Down Expand Up @@ -544,14 +549,20 @@
return forward_length > forward_length_required;
}

bool PlanningValidator::checkValidLatency(const Trajectory & trajectory)
{
validation_status_.latency = (this->now() - trajectory.header.stamp).seconds();
return validation_status_.latency < validation_params_.nominal_latency_threshold;
}

bool PlanningValidator::isAllValid(const PlanningValidatorStatus & s) const
{
return s.is_valid_size && s.is_valid_finite_value && s.is_valid_interval &&
s.is_valid_relative_angle && s.is_valid_curvature && s.is_valid_lateral_acc &&
s.is_valid_longitudinal_max_acc && s.is_valid_longitudinal_min_acc &&
s.is_valid_steering && s.is_valid_steering_rate && s.is_valid_velocity_deviation &&
s.is_valid_distance_deviation && s.is_valid_longitudinal_distance_deviation &&
s.is_valid_forward_trajectory_length;
s.is_valid_forward_trajectory_length && s.is_valid_latency;

Check warning on line 565 in planning/autoware_planning_validator/src/planning_validator.cpp

View check run for this annotation

CodeScene Delta Analysis / CodeScene Cloud Delta Analysis (main)

❌ Getting worse: Complex Method

PlanningValidator::isAllValid increases in cyclomatic complexity from 14 to 15, 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.
}

void PlanningValidator::displayStatus()
Expand Down Expand Up @@ -582,6 +593,7 @@
s.is_valid_longitudinal_distance_deviation,
"planning trajectory is too far from ego in longitudinal direction!!");
warn(s.is_valid_forward_trajectory_length, "planning trajectory forward length is not enough!!");
warn(s.is_valid_latency, "planning component latency is larger than threshold!!");
}

} // namespace autoware::planning_validator
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ constexpr double THRESHOLD_STEERING_RATE = 7.0 * deg2rad;
constexpr double THRESHOLD_VELOCITY_DEVIATION = 15.0 * kmph2mps;
constexpr double THRESHOLD_DISTANCE_DEVIATION = 3.0;
constexpr double THRESHOLD_LONGITUDINAL_DISTANCE_DEVIATION = 2.0;
constexpr double THRESHOLD_NOMINAL_LATENCY = 1.0;
constexpr double PARAMETER_FORWARD_TRAJECTORY_LENGTH_ACCELERATION = -5.0;
constexpr double PARAMETER_FORWARD_TRAJECTORY_LENGTH_MARGIN = 2.0;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ Trajectory generateTrajectoryWithConstantAcceleration(
const double acceleration)
{
Trajectory trajectory;
trajectory.header.stamp = rclcpp::Clock{RCL_ROS_TIME}.now();
double s = 0.0, v = speed, a = acceleration;
constexpr auto MAX_DT = 10.0;
for (size_t i = 0; i < size; ++i) {
Expand Down Expand Up @@ -71,6 +72,7 @@ Trajectory generateTrajectoryWithConstantCurvature(
const auto radius = 1.0 / curvature;

Trajectory trajectory;
trajectory.header.stamp = rclcpp::Clock{RCL_ROS_TIME}.now();
double x = 0.0, y = 0.0, yaw = 0.0;

for (size_t i = 0; i <= size; ++i) {
Expand Down Expand Up @@ -106,6 +108,7 @@ Trajectory generateTrajectoryWithConstantSteeringRate(
const double wheelbase)
{
Trajectory trajectory;
trajectory.header.stamp = rclcpp::Clock{RCL_ROS_TIME}.now();
double x = 0.0, y = 0.0, yaw = 0.0, steering_angle_rad = 0.0;

constexpr double MAX_STEERING_ANGLE_RAD = M_PI / 3.0;
Expand Down Expand Up @@ -158,6 +161,7 @@ Trajectory generateInfTrajectory()
Trajectory generateBadCurvatureTrajectory()
{
Trajectory trajectory;
trajectory.header.stamp = rclcpp::Clock{RCL_ROS_TIME}.now();

double y = 1.5;
for (double s = 0.0; s <= 10.0; s += 1.0) {
Expand Down Expand Up @@ -206,6 +210,7 @@ rclcpp::NodeOptions getNodeOptionsWithDefaultParams()
"thresholds.distance_deviation", THRESHOLD_DISTANCE_DEVIATION);
node_options.append_parameter_override(
"thresholds.longitudinal_distance_deviation", THRESHOLD_LONGITUDINAL_DISTANCE_DEVIATION);
node_options.append_parameter_override("thresholds.nominal_latency", THRESHOLD_NOMINAL_LATENCY);
node_options.append_parameter_override(
"parameters.forward_trajectory_length_acceleration",
PARAMETER_FORWARD_TRAJECTORY_LENGTH_ACCELERATION);
Expand Down
Loading