|
16 | 16 |
|
17 | 17 | #include "autoware/planning_validator/utils.hpp"
|
18 | 18 |
|
| 19 | +#include <autoware/motion_utils/trajectory/interpolation.hpp> |
19 | 20 | #include <autoware/motion_utils/trajectory/trajectory.hpp>
|
20 | 21 | #include <autoware_utils/geometry/geometry.hpp>
|
21 | 22 |
|
| 23 | +#include <angles/angles/angles.h> |
| 24 | +#include <tf2/utils.h> |
| 25 | + |
22 | 26 | #include <memory>
|
23 | 27 | #include <string>
|
24 | 28 | #include <utility>
|
@@ -81,6 +85,7 @@ void PlanningValidator::setupParameters()
|
81 | 85 | p.longitudinal_distance_deviation_threshold =
|
82 | 86 | declare_parameter<double>(t + "longitudinal_distance_deviation");
|
83 | 87 | p.nominal_latency_threshold = declare_parameter<double>(t + "nominal_latency");
|
| 88 | + p.yaw_deviation_threshold = declare_parameter<double>(t + "yaw_deviation"); |
84 | 89 |
|
85 | 90 | const std::string ps = "parameters.";
|
86 | 91 | p.forward_trajectory_length_acceleration =
|
@@ -172,6 +177,11 @@ void PlanningValidator::setupDiag()
|
172 | 177 | d->add(ns + "latency", [&](auto & stat) {
|
173 | 178 | setStatus(stat, validation_status_.is_valid_latency, "latency is larger than expected value.");
|
174 | 179 | });
|
| 180 | + d->add(ns + "yaw_deviation", [&](auto & stat) { |
| 181 | + setStatus( |
| 182 | + stat, validation_status_.is_valid_yaw_deviation, |
| 183 | + "difference between vehicle yaw and closest trajectory yaw is too large."); |
| 184 | + }); |
175 | 185 | }
|
176 | 186 |
|
177 | 187 | bool PlanningValidator::isDataReady()
|
@@ -324,6 +334,7 @@ void PlanningValidator::validate(const Trajectory & trajectory)
|
324 | 334 | s.is_valid_steering = checkValidSteering(resampled);
|
325 | 335 | s.is_valid_steering_rate = checkValidSteeringRate(resampled);
|
326 | 336 | s.is_valid_latency = checkValidLatency(trajectory);
|
| 337 | + s.is_valid_yaw_deviation = checkValidYawDeviation(trajectory); |
327 | 338 |
|
328 | 339 | s.invalid_count = isAllValid(s) ? 0 : s.invalid_count + 1;
|
329 | 340 | }
|
@@ -555,14 +566,24 @@ bool PlanningValidator::checkValidLatency(const Trajectory & trajectory)
|
555 | 566 | return validation_status_.latency < validation_params_.nominal_latency_threshold;
|
556 | 567 | }
|
557 | 568 |
|
| 569 | +bool PlanningValidator::checkValidYawDeviation(const Trajectory & trajectory) |
| 570 | +{ |
| 571 | + const auto interpolated_trajectory_point = |
| 572 | + motion_utils::calcInterpolatedPoint(trajectory, current_kinematics_->pose.pose); |
| 573 | + validation_status_.yaw_deviation = std::abs(angles::shortest_angular_distance( |
| 574 | + tf2::getYaw(interpolated_trajectory_point.pose.orientation), |
| 575 | + tf2::getYaw(current_kinematics_->pose.pose.orientation))); |
| 576 | + return validation_status_.yaw_deviation <= validation_params_.yaw_deviation_threshold; |
| 577 | +} |
| 578 | + |
558 | 579 | bool PlanningValidator::isAllValid(const PlanningValidatorStatus & s) const
|
559 | 580 | {
|
560 | 581 | return s.is_valid_size && s.is_valid_finite_value && s.is_valid_interval &&
|
561 | 582 | s.is_valid_relative_angle && s.is_valid_curvature && s.is_valid_lateral_acc &&
|
562 | 583 | s.is_valid_longitudinal_max_acc && s.is_valid_longitudinal_min_acc &&
|
563 | 584 | s.is_valid_steering && s.is_valid_steering_rate && s.is_valid_velocity_deviation &&
|
564 | 585 | s.is_valid_distance_deviation && s.is_valid_longitudinal_distance_deviation &&
|
565 |
| - s.is_valid_forward_trajectory_length && s.is_valid_latency; |
| 586 | + s.is_valid_forward_trajectory_length && s.is_valid_latency && s.is_valid_yaw_deviation; |
566 | 587 | }
|
567 | 588 |
|
568 | 589 | void PlanningValidator::displayStatus()
|
@@ -594,6 +615,7 @@ void PlanningValidator::displayStatus()
|
594 | 615 | "planning trajectory is too far from ego in longitudinal direction!!");
|
595 | 616 | warn(s.is_valid_forward_trajectory_length, "planning trajectory forward length is not enough!!");
|
596 | 617 | warn(s.is_valid_latency, "planning component latency is larger than threshold!!");
|
| 618 | + warn(s.is_valid_yaw_deviation, "planning trajectory yaw difference from ego yaw is too large!!"); |
597 | 619 | }
|
598 | 620 |
|
599 | 621 | } // namespace autoware::planning_validator
|
|
0 commit comments