Skip to content

Commit 8b0b9a7

Browse files
authoredJan 23, 2025
feat(autoware_control_evaluator): add new steering metrics (#10012)
1 parent 972f445 commit 8b0b9a7

File tree

5 files changed

+79
-2
lines changed

5 files changed

+79
-2
lines changed
 

‎evaluator/autoware_control_evaluator/include/autoware/control_evaluator/control_evaluator_node.hpp

+18-2
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <autoware_vehicle_info_utils/vehicle_info_utils.hpp>
2626
#include <rclcpp/rclcpp.hpp>
2727

28+
#include "autoware_vehicle_msgs/msg/steering_report.hpp"
2829
#include "geometry_msgs/msg/accel_with_covariance_stamped.hpp"
2930
#include <autoware_internal_debug_msgs/msg/float64_stamped.hpp>
3031
#include <autoware_planning_msgs/msg/lanelet_route.hpp>
@@ -45,6 +46,7 @@ using autoware::universe_utils::LineString2d;
4546
using autoware::universe_utils::Point2d;
4647
using autoware::vehicle_info_utils::VehicleInfo;
4748
using autoware_planning_msgs::msg::Trajectory;
49+
using autoware_vehicle_msgs::msg::SteeringReport;
4850
using geometry_msgs::msg::Point;
4951
using geometry_msgs::msg::Pose;
5052
using nav_msgs::msg::Odometry;
@@ -75,6 +77,7 @@ class ControlEvaluatorNode : public rclcpp::Node
7577
void AddLaneletInfoMsg(const Pose & ego_pose);
7678
void AddKinematicStateMetricMsg(
7779
const Odometry & odom, const AccelWithCovarianceStamped & accel_stamped);
80+
void AddSteeringMetricMsg(const SteeringReport & steering_report);
7881

7982
void onTimer();
8083

@@ -93,6 +96,8 @@ class ControlEvaluatorNode : public rclcpp::Node
9396
vector_map_subscriber_{this, "~/input/vector_map", rclcpp::QoS{1}.transient_local()};
9497
autoware::universe_utils::InterProcessPollingSubscriber<PathWithLaneId> behavior_path_subscriber_{
9598
this, "~/input/behavior_path"};
99+
autoware::universe_utils::InterProcessPollingSubscriber<SteeringReport> steering_sub_{
100+
this, "~/input/steering_status"};
96101

97102
rclcpp::Publisher<autoware_internal_debug_msgs::msg::Float64Stamped>::SharedPtr
98103
processing_time_pub_;
@@ -107,8 +112,16 @@ class ControlEvaluatorNode : public rclcpp::Node
107112
// Metric
108113
const std::vector<Metric> metrics_ = {
109114
// collect all metrics
110-
Metric::lateral_deviation, Metric::yaw_deviation, Metric::goal_longitudinal_deviation,
111-
Metric::goal_lateral_deviation, Metric::goal_yaw_deviation,
115+
Metric::lateral_deviation,
116+
Metric::yaw_deviation,
117+
Metric::goal_longitudinal_deviation,
118+
Metric::goal_lateral_deviation,
119+
Metric::goal_yaw_deviation,
120+
Metric::left_boundary_distance,
121+
Metric::right_boundary_distance,
122+
Metric::steering_angle,
123+
Metric::steering_rate,
124+
Metric::steering_acceleration,
112125
};
113126

114127
std::array<Accumulator<double>, static_cast<size_t>(Metric::SIZE)>
@@ -119,6 +132,9 @@ class ControlEvaluatorNode : public rclcpp::Node
119132
autoware::route_handler::RouteHandler route_handler_;
120133
rclcpp::TimerBase::SharedPtr timer_;
121134
std::optional<AccelWithCovarianceStamped> prev_acc_stamped_{std::nullopt};
135+
std::optional<double> prev_steering_angle_{std::nullopt};
136+
std::optional<double> prev_steering_rate_{std::nullopt};
137+
std::optional<double> prev_steering_angle_timestamp_{std::nullopt};
122138
};
123139
} // namespace control_diagnostics
124140

‎evaluator/autoware_control_evaluator/include/autoware/control_evaluator/metrics/metric.hpp

+12
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ enum class Metric {
3333
goal_yaw_deviation,
3434
left_boundary_distance,
3535
right_boundary_distance,
36+
steering_angle,
37+
steering_rate,
38+
steering_acceleration,
3639
SIZE,
3740
};
3841

@@ -44,6 +47,9 @@ static const std::unordered_map<std::string, Metric> str_to_metric = {
4447
{"goal_yaw_deviation", Metric::goal_yaw_deviation},
4548
{"left_boundary_distance", Metric::left_boundary_distance},
4649
{"right_boundary_distance", Metric::right_boundary_distance},
50+
{"steering_angle", Metric::steering_angle},
51+
{"steering_rate", Metric::steering_rate},
52+
{"steering_acceleration", Metric::steering_acceleration},
4753
};
4854

4955
static const std::unordered_map<Metric, std::string> metric_to_str = {
@@ -54,6 +60,9 @@ static const std::unordered_map<Metric, std::string> metric_to_str = {
5460
{Metric::goal_yaw_deviation, "goal_yaw_deviation"},
5561
{Metric::left_boundary_distance, "left_boundary_distance"},
5662
{Metric::right_boundary_distance, "right_boundary_distance"},
63+
{Metric::steering_angle, "steering_angle"},
64+
{Metric::steering_rate, "steering_rate"},
65+
{Metric::steering_acceleration, "steering_acceleration"},
5766
};
5867

5968
// Metrics descriptions
@@ -65,6 +74,9 @@ static const std::unordered_map<Metric, std::string> metric_descriptions = {
6574
{Metric::goal_yaw_deviation, "Yaw deviation from the goal point[rad]"},
6675
{Metric::left_boundary_distance, "Signed distance to the left boundary[m]"},
6776
{Metric::right_boundary_distance, "Signed distance to the right boundary[m]"},
77+
{Metric::steering_angle, "Steering angle[rad]"},
78+
{Metric::steering_rate, "Steering angle rate[rad/s]"},
79+
{Metric::steering_acceleration, "Steering angle acceleration[rad/s^2]"},
6880
};
6981

7082
namespace details

‎evaluator/autoware_control_evaluator/launch/control_evaluator.launch.xml

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<arg name="input/vector_map" default="/map/vector_map"/>
77
<arg name="input/route" default="/planning/mission_planning/route"/>
88
<arg name="input/behavior_path" default="/planning/scenario_planning/lane_driving/behavior_planning/path_with_lane_id"/>
9+
<arg name="input/steering_status" default="/vehicle/status/steering_status"/>
910

1011
<!-- control evaluator -->
1112
<group>
@@ -17,6 +18,7 @@
1718
<remap from="~/input/vector_map" to="$(var input/vector_map)"/>
1819
<remap from="~/input/route" to="$(var input/route)"/>
1920
<remap from="~/input/behavior_path" to="$(var input/behavior_path)"/>
21+
<remap from="~/input/steering_status" to="$(var input/steering_status)"/>
2022
</node>
2123
</group>
2224
</launch>

‎evaluator/autoware_control_evaluator/package.xml

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
<depend>autoware_test_utils</depend>
2323
<depend>autoware_universe_utils</depend>
2424
<depend>autoware_vehicle_info_utils</depend>
25+
<depend>autoware_vehicle_msgs</depend>
2526
<depend>nav_msgs</depend>
2627
<depend>nlohmann-json-dev</depend>
2728
<depend>pluginlib</depend>

‎evaluator/autoware_control_evaluator/src/control_evaluator_node.cpp

+46
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,47 @@ void ControlEvaluatorNode::AddKinematicStateMetricMsg(
244244
return;
245245
}
246246

247+
void ControlEvaluatorNode::AddSteeringMetricMsg(const SteeringReport & steering_status)
248+
{
249+
// steering angle
250+
double cur_steering_angle = steering_status.steering_tire_angle;
251+
const double cur_t = static_cast<double>(steering_status.stamp.sec) +
252+
static_cast<double>(steering_status.stamp.nanosec) * 1e-9;
253+
AddMetricMsg(Metric::steering_angle, cur_steering_angle);
254+
255+
if (!prev_steering_angle_timestamp_.has_value()) {
256+
prev_steering_angle_timestamp_ = cur_t;
257+
prev_steering_angle_ = cur_steering_angle;
258+
return;
259+
}
260+
261+
// d_t
262+
const double dt = cur_t - prev_steering_angle_timestamp_.value();
263+
if (dt < std::numeric_limits<double>::epsilon()) {
264+
prev_steering_angle_timestamp_ = cur_t;
265+
prev_steering_angle_ = cur_steering_angle;
266+
return;
267+
}
268+
269+
// steering rate
270+
const double steering_rate = (cur_steering_angle - prev_steering_angle_.value()) / dt;
271+
AddMetricMsg(Metric::steering_rate, steering_rate);
272+
273+
// steering acceleration
274+
if (!prev_steering_rate_.has_value()) {
275+
prev_steering_angle_timestamp_ = cur_t;
276+
prev_steering_angle_ = cur_steering_angle;
277+
prev_steering_rate_ = steering_rate;
278+
return;
279+
}
280+
const double steering_acceleration = (steering_rate - prev_steering_rate_.value()) / dt;
281+
AddMetricMsg(Metric::steering_acceleration, steering_acceleration);
282+
283+
prev_steering_angle_timestamp_ = cur_t;
284+
prev_steering_angle_ = cur_steering_angle;
285+
prev_steering_rate_ = steering_rate;
286+
}
287+
247288
void ControlEvaluatorNode::AddLateralDeviationMetricMsg(
248289
const Trajectory & traj, const Point & ego_point)
249290
{
@@ -294,6 +335,7 @@ void ControlEvaluatorNode::onTimer()
294335
const auto odom = odometry_sub_.takeData();
295336
const auto acc = accel_sub_.takeData();
296337
const auto behavior_path = behavior_path_subscriber_.takeData();
338+
const auto steering_status = steering_sub_.takeData();
297339

298340
// calculate deviation metrics
299341
if (odom && traj && !traj->points.empty()) {
@@ -320,6 +362,10 @@ void ControlEvaluatorNode::onTimer()
320362
AddBoundaryDistanceMetricMsg(*behavior_path, ego_pose);
321363
}
322364

365+
if (steering_status) {
366+
AddSteeringMetricMsg(*steering_status);
367+
}
368+
323369
// Publish metrics
324370
metrics_msg_.stamp = now();
325371
metrics_pub_->publish(metrics_msg_);

0 commit comments

Comments
 (0)