Skip to content

Commit 17a020d

Browse files
po
Signed-off-by: yuki-takagi-66 <yuki.takagi@tier4.jp>
1 parent dfde80e commit 17a020d

File tree

5 files changed

+97
-10
lines changed

5 files changed

+97
-10
lines changed

control/autoware_control_validator/include/autoware/control_validator/control_validator.hpp

+36-1
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222

2323
#include <autoware/signal_processing/lowpass_filter_1d.hpp>
2424
#include <autoware_control_validator/msg/control_validator_status.hpp>
25+
#include <autoware_utils/ros/parameter.hpp>
2526
#include <autoware_utils/system/stop_watch.hpp>
2627
#include <rclcpp/rclcpp.hpp>
2728

2829
#include <autoware_control_msgs/msg/control.hpp>
2930
#include <autoware_internal_debug_msgs/msg/float64_stamped.hpp>
3031
#include <autoware_planning_msgs/msg/trajectory.hpp>
3132
#include <diagnostic_msgs/msg/diagnostic_array.hpp>
33+
#include <geometry_msgs/msg/accel_with_covariance_stamped.hpp>
3234
#include <nav_msgs/msg/odometry.hpp>
3335

3436
#include <cstdint>
@@ -45,6 +47,7 @@ using autoware_planning_msgs::msg::Trajectory;
4547
using autoware_planning_msgs::msg::TrajectoryPoint;
4648
using diagnostic_updater::DiagnosticStatusWrapper;
4749
using diagnostic_updater::Updater;
50+
using geometry_msgs::msg::AccelWithCovarianceStamped;
4851
using nav_msgs::msg::Odometry;
4952

5053
struct ValidationParams
@@ -130,7 +133,8 @@ class ControlValidator : public rclcpp::Node
130133
*/
131134
void validate(
132135
const Trajectory & predicted_trajectory, const Trajectory & reference_trajectory,
133-
const Odometry & kinematics);
136+
const Odometry & kinematics, const Control & control_cmd,
137+
const AccelWithCovarianceStamped & measured_acc);
134138

135139
/**
136140
* @brief Publish debug information
@@ -142,6 +146,32 @@ class ControlValidator : public rclcpp::Node
142146
*/
143147
void display_status();
144148

149+
class AccelerationValidator
150+
{
151+
public:
152+
void setup_parameters(rclcpp::Node & node)
153+
{
154+
e_offset =
155+
autoware_utils::get_or_declare_parameter<double>(node, "thresholds.acc_error_offset");
156+
e_scale =
157+
autoware_utils::get_or_declare_parameter<double>(node, "thresholds.acc_error_scale");
158+
const auto acc_lpf_gain =
159+
autoware_utils::get_or_declare_parameter<double>(node, "acc_lpf_gain");
160+
desired_acc_lpf.setGain(acc_lpf_gain);
161+
measured_acc_lpf.setGain(acc_lpf_gain);
162+
};
163+
164+
bool validate(
165+
const Odometry & kinematic_state, const Control & control_cmd,
166+
const AccelWithCovarianceStamped & loc_acc);
167+
168+
private:
169+
double e_offset;
170+
double e_scale;
171+
autoware::signal_processing::LowpassFilter1d desired_acc_lpf{0.0};
172+
autoware::signal_processing::LowpassFilter1d measured_acc_lpf{0.0};
173+
} acceleration_validator;
174+
145175
/**
146176
* @brief Set the diagnostic status
147177
* @param stat Diagnostic status wrapper
@@ -156,6 +186,8 @@ class ControlValidator : public rclcpp::Node
156186
rclcpp::Subscription<Trajectory>::SharedPtr sub_predicted_traj_;
157187
autoware_utils::InterProcessPollingSubscriber<Odometry>::SharedPtr sub_kinematics_;
158188
autoware_utils::InterProcessPollingSubscriber<Trajectory>::SharedPtr sub_reference_traj_;
189+
autoware_utils::InterProcessPollingSubscriber<AccelWithCovarianceStamped>::SharedPtr
190+
sub_measured_acc_;
159191
rclcpp::Publisher<ControlValidatorStatus>::SharedPtr pub_status_;
160192
rclcpp::Publisher<visualization_msgs::msg::MarkerArray>::SharedPtr pub_markers_;
161193
rclcpp::Publisher<autoware_internal_debug_msgs::msg::Float64Stamped>::SharedPtr
@@ -171,6 +203,7 @@ class ControlValidator : public rclcpp::Node
171203
ValidationParams validation_params_; // for thresholds
172204
autoware::signal_processing::LowpassFilter1d vehicle_vel_{0.0};
173205
autoware::signal_processing::LowpassFilter1d target_vel_{0.0};
206+
174207
bool hold_velocity_error_until_stop_{false};
175208

176209
vehicle_info_utils::VehicleInfo vehicle_info_;
@@ -186,6 +219,8 @@ class ControlValidator : public rclcpp::Node
186219
Trajectory::ConstSharedPtr current_predicted_trajectory_;
187220

188221
Odometry::ConstSharedPtr current_kinematics_;
222+
AccelWithCovarianceStamped::ConstSharedPtr acceleration_msg_;
223+
Control::ConstSharedPtr control_cmd_msg_;
189224

190225
autoware_utils::StopWatch<std::chrono::milliseconds> stop_watch;
191226

control/autoware_control_validator/launch/control_validator.launch.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88
<param from="$(var control_validator_param_path)"/>
99

1010
<!-- remap topic name -->
11+
<remap from="~/input/control_cmd" to="/control/command/control_cmd"/>
12+
<remap from="~/input/kinematics" to="/localization/kinematic_state"/>
13+
<remap from="~/input/measured_acceleration" to="/localization/acceleration"/>
1114
<remap from="~/input/reference_trajectory" to="$(var input_reference_trajectory)"/>
1215
<remap from="~/input/predicted_trajectory" to="$(var input_predicted_trajectory)"/>
13-
<remap from="~/input/kinematics" to="/localization/kinematic_state"/>
1416
<remap from="~/output/validation_status" to="~/validation_status"/>
1517
</node>
1618
</launch>

control/autoware_control_validator/msg/ControlValidatorStatus.msg

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ builtin_interfaces/Time stamp
22

33
# states
44
bool is_valid_max_distance_deviation
5+
bool is_valid_acc
56
bool is_rolling_back
67
bool is_over_velocity
78
bool has_overrun_stop_point

control/autoware_control_validator/src/control_validator.cpp

+56-8
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
#include "autoware/motion_utils/trajectory/trajectory.hpp"
2020
#include "autoware_vehicle_info_utils/vehicle_info_utils.hpp"
2121

22-
#include <nav_msgs/msg/odometry.hpp>
22+
// #include <nav_msgs/msg/odometry.hpp>
2323

2424
#include <algorithm>
2525
#include <cstdint>
@@ -47,6 +47,9 @@ ControlValidator::ControlValidator(const rclcpp::NodeOptions & options)
4747
sub_reference_traj_ =
4848
autoware_utils::InterProcessPollingSubscriber<Trajectory>::create_subscription(
4949
this, "~/input/reference_trajectory", 1);
50+
sub_measured_acc_ =
51+
autoware_utils::InterProcessPollingSubscriber<AccelWithCovarianceStamped>::create_subscription(
52+
this, "~/input/measured_acceleration", 1);
5053

5154
pub_status_ = create_publisher<ControlValidatorStatus>("~/output/validation_status", 1);
5255

@@ -77,9 +80,11 @@ void ControlValidator::setup_parameters()
7780
p.overrun_stop_point_dist = declare_parameter<double>(t + "overrun_stop_point_dist");
7881
p.nominal_latency_threshold = declare_parameter<double>(t + "nominal_latency");
7982
}
80-
const auto lpf_gain = declare_parameter<double>("vel_lpf_gain");
81-
vehicle_vel_.setGain(lpf_gain);
82-
target_vel_.setGain(lpf_gain);
83+
acceleration_validator.setup_parameters(*this);
84+
85+
const auto vel_lpf_gain = declare_parameter<double>("vel_lpf_gain");
86+
vehicle_vel_.setGain(vel_lpf_gain);
87+
target_vel_.setGain(vel_lpf_gain);
8388

8489
hold_velocity_error_until_stop_ = declare_parameter<bool>("hold_velocity_error_until_stop");
8590

@@ -122,6 +127,11 @@ void ControlValidator::setup_diag()
122127
stat, validation_status_.is_valid_max_distance_deviation,
123128
"control output is deviated from trajectory");
124129
});
130+
d.add(ns + "acceleration_error", [&](auto & stat) {
131+
set_status(
132+
stat, validation_status_.is_valid_acc,
133+
"Measured acceleration and desired acceleration is deviated");
134+
});
125135
d.add(ns + "rolling_back", [&](auto & stat) {
126136
set_status(
127137
stat, !validation_status_.is_rolling_back,
@@ -159,11 +169,18 @@ bool ControlValidator::is_data_ready()
159169
if (!current_predicted_trajectory_) {
160170
return waiting(sub_predicted_traj_->get_topic_name());
161171
}
172+
if (!acceleration_msg_) {
173+
return waiting(sub_measured_acc_->subscriber()->get_topic_name());
174+
}
175+
if (!control_cmd_msg_) {
176+
return waiting(sub_control_cmd_->get_topic_name());
177+
}
162178
return true;
163179
}
164180

165181
void ControlValidator::on_control_cmd(const Control::ConstSharedPtr msg)
166182
{
183+
control_cmd_msg_ = msg;
167184
validation_status_.latency = (this->now() - msg->stamp).seconds();
168185
validation_status_.is_valid_latency =
169186
validation_status_.latency < validation_params_.nominal_latency_threshold;
@@ -178,12 +195,15 @@ void ControlValidator::on_predicted_trajectory(const Trajectory::ConstSharedPtr
178195
current_predicted_trajectory_ = msg;
179196
current_reference_trajectory_ = sub_reference_traj_->take_data();
180197
current_kinematics_ = sub_kinematics_->take_data();
198+
acceleration_msg_ = sub_measured_acc_->take_data();
181199

182200
if (!is_data_ready()) return;
183201

184202
debug_pose_publisher_->clear_markers();
185203

186-
validate(*current_predicted_trajectory_, *current_reference_trajectory_, *current_kinematics_);
204+
validate(
205+
*current_predicted_trajectory_, *current_reference_trajectory_, *current_kinematics_,
206+
*control_cmd_msg_, *acceleration_msg_);
187207

188208
diag_updater_.force_update();
189209

@@ -213,7 +233,8 @@ void ControlValidator::publish_debug_info()
213233

214234
void ControlValidator::validate(
215235
const Trajectory & predicted_trajectory, const Trajectory & reference_trajectory,
216-
const Odometry & kinematics)
236+
const Odometry & kinematics, const Control & control_cmd,
237+
const AccelWithCovarianceStamped & measured_acc)
217238
{
218239
if (predicted_trajectory.points.size() < 2) {
219240
RCLCPP_DEBUG(get_logger(), "predicted_trajectory size is less than 2. Cannot validate.");
@@ -235,6 +256,9 @@ void ControlValidator::validate(
235256

236257
calc_velocity_deviation_status(*current_reference_trajectory_, kinematics);
237258
calc_stop_point_overrun_status(*current_reference_trajectory_, kinematics);
259+
validation_status_.is_valid_acc =
260+
acceleration_validator.validate(kinematics, control_cmd, measured_acc);
261+
calc_stop_point_overrun_status(*current_reference_trajectory_, kinematics);
238262

239263
validation_status_.invalid_count =
240264
is_all_valid(validation_status_) ? 0 : validation_status_.invalid_count + 1;
@@ -250,6 +274,30 @@ std::pair<double, bool> ControlValidator::calc_lateral_deviation_status(
250274
max_distance_deviation <= validation_params_.max_distance_deviation_threshold};
251275
}
252276

277+
bool ControlValidator::AccelerationValidator::validate(
278+
const Odometry & kinematic_state, const Control & control_cmd,
279+
const AccelWithCovarianceStamped & loc_acc)
280+
{
281+
if (std::abs(kinematic_state.twist.twist.linear.x) < 1e-3) {
282+
desired_acc_lpf.reset();
283+
measured_acc_lpf.reset();
284+
return true;
285+
}
286+
287+
const double des = desired_acc_lpf.filter(
288+
control_cmd.longitudinal.acceleration + autoware_utils::get_rpy(kinematic_state.pose.pose).y);
289+
const int8_t des_sign = std::signbit(des) ? 1 : -1;
290+
const double mes = measured_acc_lpf.filter(loc_acc.accel.accel.linear.x);
291+
292+
if (
293+
mes < des * (1 + des_sign * e_scale) + e_offset &&
294+
mes > des * (1 - des_sign * e_scale) - e_offset) {
295+
return true;
296+
}
297+
298+
return false;
299+
}
300+
253301
void ControlValidator::calc_velocity_deviation_status(
254302
const Trajectory & reference_trajectory, const Odometry & kinematics)
255303
{
@@ -310,8 +358,8 @@ void ControlValidator::calc_stop_point_overrun_status(
310358

311359
bool ControlValidator::is_all_valid(const ControlValidatorStatus & s)
312360
{
313-
return s.is_valid_max_distance_deviation && !s.is_rolling_back && !s.is_over_velocity &&
314-
!s.has_overrun_stop_point;
361+
return s.is_valid_max_distance_deviation && s.is_valid_acc && !s.is_rolling_back &&
362+
!s.is_over_velocity && !s.has_overrun_stop_point;
315363
}
316364

317365
void ControlValidator::display_status()

launch/tier4_control_launch/launch/control.launch.xml

+1
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@
203203
<composable_node pkg="autoware_control_validator" plugin="autoware::control_validator::ControlValidator" name="control_validator">
204204
<remap from="~/input/control_cmd" to="/control/command/control_cmd"/>
205205
<remap from="~/input/kinematics" to="/localization/kinematic_state"/>
206+
<remap from="~/input/measured_acceleration" to="/localization/acceleration"/>
206207
<remap from="~/input/reference_trajectory" to="/planning/scenario_planning/trajectory"/>
207208
<remap from="~/input/predicted_trajectory" to="/control/trajectory_follower/lateral/predicted_trajectory"/>
208209
<remap from="~/output/validation_status" to="~/validation_status"/>

0 commit comments

Comments
 (0)