Skip to content

Commit 6e0d338

Browse files
feat: add IMU subscriber to control evaluator node
Signed-off-by: Kyoichi Sugahara <kyoichi.sugahara@tier4.jp>
1 parent 011bde4 commit 6e0d338

File tree

2 files changed

+23
-17
lines changed

2 files changed

+23
-17
lines changed

control/autoware_control_evaluator/include/autoware/control_evaluator/control_evaluator_node.hpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
#include <autoware_auto_planning_msgs/msg/route.hpp>
2626
#include <diagnostic_msgs/msg/diagnostic_array.hpp>
2727
#include <nav_msgs/msg/odometry.hpp>
28+
#include <sensor_msgs/msg/imu.hpp>
2829

2930
#include <deque>
3031
#include <optional>
@@ -44,6 +45,8 @@ using nav_msgs::msg::Odometry;
4445
using LaneletMapBin = autoware_auto_mapping_msgs::msg::HADMapBin;
4546
using LaneletRoute = autoware_auto_planning_msgs::msg::HADMapRoute;
4647
using geometry_msgs::msg::AccelWithCovarianceStamped;
48+
using sensor_msgs::msg::Imu;
49+
4750

4851
/**
4952
* @brief Node for control evaluation
@@ -62,7 +65,7 @@ class ControlEvaluatorNode : public rclcpp::Node
6265
DiagnosticStatus generateAEBDiagnosticStatus(const DiagnosticStatus & diag);
6366
DiagnosticStatus generateLaneletDiagnosticStatus(const Pose & ego_pose) const;
6467
DiagnosticStatus generateKinematicStateDiagnosticStatus(
65-
const Odometry & odom, const AccelWithCovarianceStamped & accel_stamped);
68+
const Odometry & odom, const Imu & imu);
6669

6770
void onDiagnostics(const DiagnosticArray::ConstSharedPtr diag_msg);
6871
void onTimer();
@@ -75,8 +78,10 @@ class ControlEvaluatorNode : public rclcpp::Node
7578

7679
autoware::universe_utils::InterProcessPollingSubscriber<Odometry> odometry_sub_{
7780
this, "~/input/odometry"};
78-
autoware::universe_utils::InterProcessPollingSubscriber<AccelWithCovarianceStamped> accel_sub_{
79-
this, "~/input/acceleration"};
81+
// autoware::universe_utils::InterProcessPollingSubscriber<AccelWithCovarianceStamped> accel_sub_{
82+
// this, "~/input/acceleration"};
83+
autoware::universe_utils::InterProcessPollingSubscriber<Imu> imu_sub_{
84+
this, "~/input/imu"};
8085
autoware::universe_utils::InterProcessPollingSubscriber<Trajectory> traj_sub_{
8186
this, "~/input/trajectory"};
8287
autoware::universe_utils::InterProcessPollingSubscriber<
@@ -101,7 +106,7 @@ class ControlEvaluatorNode : public rclcpp::Node
101106

102107
route_handler::RouteHandler route_handler_;
103108
rclcpp::TimerBase::SharedPtr timer_;
104-
std::optional<AccelWithCovarianceStamped> prev_acc_stamped_{std::nullopt};
109+
std::optional<Imu> prev_imu_{std::nullopt};
105110
};
106111
} // namespace control_diagnostics
107112

control/autoware_control_evaluator/src/control_evaluator_node.cpp

+14-13
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ DiagnosticStatus ControlEvaluatorNode::generateLaneletDiagnosticStatus(const Pos
119119
}
120120

121121
DiagnosticStatus ControlEvaluatorNode::generateKinematicStateDiagnosticStatus(
122-
const Odometry & odom, const AccelWithCovarianceStamped & accel_stamped)
122+
const Odometry & odom, const Imu & imu)
123123
{
124124
DiagnosticStatus status;
125125
status.name = "kinematic_state";
@@ -129,24 +129,24 @@ DiagnosticStatus ControlEvaluatorNode::generateKinematicStateDiagnosticStatus(
129129
key_value.value = std::to_string(odom.twist.twist.linear.x);
130130
status.values.push_back(key_value);
131131
key_value.key = "acc";
132-
const auto & acc = accel_stamped.accel.accel.linear.x;
132+
const auto & acc = imu.linear_acceleration.x;
133133
key_value.value = std::to_string(acc);
134134
status.values.push_back(key_value);
135135
key_value.key = "jerk";
136136
const auto jerk = [&]() {
137-
if (!prev_acc_stamped_.has_value()) {
138-
prev_acc_stamped_ = accel_stamped;
137+
if (!prev_imu_.has_value()) {
138+
prev_imu_ = imu;
139139
return 0.0;
140140
}
141-
const auto t = static_cast<double>(accel_stamped.header.stamp.sec) +
142-
static_cast<double>(accel_stamped.header.stamp.nanosec) * 1e-9;
143-
const auto prev_t = static_cast<double>(prev_acc_stamped_.value().header.stamp.sec) +
144-
static_cast<double>(prev_acc_stamped_.value().header.stamp.nanosec) * 1e-9;
141+
const auto t = static_cast<double>(imu.header.stamp.sec) +
142+
static_cast<double>(imu.header.stamp.nanosec) * 1e-9;
143+
const auto prev_t = static_cast<double>(prev_imu_.value().header.stamp.sec) +
144+
static_cast<double>(prev_imu_.value().header.stamp.nanosec) * 1e-9;
145145
const auto dt = t - prev_t;
146146
if (dt < std::numeric_limits<double>::epsilon()) return 0.0;
147147

148-
const auto prev_acc = prev_acc_stamped_.value().accel.accel.linear.x;
149-
prev_acc_stamped_ = accel_stamped;
148+
const auto prev_acc = prev_imu_.value().linear_acceleration.x;
149+
prev_imu_ = imu;
150150
return (acc - prev_acc) / dt;
151151
}();
152152
key_value.value = std::to_string(jerk);
@@ -191,7 +191,8 @@ void ControlEvaluatorNode::onTimer()
191191
DiagnosticArray metrics_msg;
192192
const auto traj = traj_sub_.takeData();
193193
const auto odom = odometry_sub_.takeData();
194-
const auto acc = accel_sub_.takeData();
194+
// const auto acc = accel_sub_.takeData();
195+
const auto imu = imu_sub_.takeData();
195196

196197
// generate decision diagnostics from input diagnostics
197198
for (const auto & function : target_functions_) {
@@ -224,8 +225,8 @@ void ControlEvaluatorNode::onTimer()
224225
metrics_msg.status.push_back(generateLaneletDiagnosticStatus(ego_pose));
225226
}
226227

227-
if (odom && acc) {
228-
metrics_msg.status.push_back(generateKinematicStateDiagnosticStatus(*odom, *acc));
228+
if (odom && imu) {
229+
metrics_msg.status.push_back(generateKinematicStateDiagnosticStatus(*odom, *imu));
229230
}
230231

231232
metrics_msg.header.stamp = now();

0 commit comments

Comments
 (0)