19
19
#include " autoware/motion_utils/trajectory/trajectory.hpp"
20
20
#include " autoware_vehicle_info_utils/vehicle_info_utils.hpp"
21
21
22
- #include < nav_msgs/msg/odometry.hpp>
22
+ // #include <nav_msgs/msg/odometry.hpp>
23
23
24
24
#include < algorithm>
25
25
#include < cstdint>
@@ -47,6 +47,9 @@ ControlValidator::ControlValidator(const rclcpp::NodeOptions & options)
47
47
sub_reference_traj_ =
48
48
autoware_utils::InterProcessPollingSubscriber<Trajectory>::create_subscription (
49
49
this , " ~/input/reference_trajectory" , 1 );
50
+ sub_measured_acc_ =
51
+ autoware_utils::InterProcessPollingSubscriber<AccelWithCovarianceStamped>::create_subscription (
52
+ this , " ~/input/measured_acceleration" , 1 );
50
53
51
54
pub_status_ = create_publisher<ControlValidatorStatus>(" ~/output/validation_status" , 1 );
52
55
@@ -77,9 +80,11 @@ void ControlValidator::setup_parameters()
77
80
p.overrun_stop_point_dist = declare_parameter<double >(t + " overrun_stop_point_dist" );
78
81
p.nominal_latency_threshold = declare_parameter<double >(t + " nominal_latency" );
79
82
}
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);
83
88
84
89
hold_velocity_error_until_stop_ = declare_parameter<bool >(" hold_velocity_error_until_stop" );
85
90
@@ -122,6 +127,11 @@ void ControlValidator::setup_diag()
122
127
stat, validation_status_.is_valid_max_distance_deviation ,
123
128
" control output is deviated from trajectory" );
124
129
});
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
+ });
125
135
d.add (ns + " rolling_back" , [&](auto & stat) {
126
136
set_status (
127
137
stat, !validation_status_.is_rolling_back ,
@@ -159,11 +169,18 @@ bool ControlValidator::is_data_ready()
159
169
if (!current_predicted_trajectory_) {
160
170
return waiting (sub_predicted_traj_->get_topic_name ());
161
171
}
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
+ }
162
178
return true ;
163
179
}
164
180
165
181
void ControlValidator::on_control_cmd (const Control::ConstSharedPtr msg)
166
182
{
183
+ control_cmd_msg_ = msg;
167
184
validation_status_.latency = (this ->now () - msg->stamp ).seconds ();
168
185
validation_status_.is_valid_latency =
169
186
validation_status_.latency < validation_params_.nominal_latency_threshold ;
@@ -178,12 +195,15 @@ void ControlValidator::on_predicted_trajectory(const Trajectory::ConstSharedPtr
178
195
current_predicted_trajectory_ = msg;
179
196
current_reference_trajectory_ = sub_reference_traj_->take_data ();
180
197
current_kinematics_ = sub_kinematics_->take_data ();
198
+ acceleration_msg_ = sub_measured_acc_->take_data ();
181
199
182
200
if (!is_data_ready ()) return ;
183
201
184
202
debug_pose_publisher_->clear_markers ();
185
203
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_);
187
207
188
208
diag_updater_.force_update ();
189
209
@@ -213,7 +233,8 @@ void ControlValidator::publish_debug_info()
213
233
214
234
void ControlValidator::validate (
215
235
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)
217
238
{
218
239
if (predicted_trajectory.points .size () < 2 ) {
219
240
RCLCPP_DEBUG (get_logger (), " predicted_trajectory size is less than 2. Cannot validate." );
@@ -235,6 +256,9 @@ void ControlValidator::validate(
235
256
236
257
calc_velocity_deviation_status (*current_reference_trajectory_, kinematics);
237
258
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);
238
262
239
263
validation_status_.invalid_count =
240
264
is_all_valid (validation_status_) ? 0 : validation_status_.invalid_count + 1 ;
@@ -250,6 +274,30 @@ std::pair<double, bool> ControlValidator::calc_lateral_deviation_status(
250
274
max_distance_deviation <= validation_params_.max_distance_deviation_threshold };
251
275
}
252
276
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
+
253
301
void ControlValidator::calc_velocity_deviation_status (
254
302
const Trajectory & reference_trajectory, const Odometry & kinematics)
255
303
{
@@ -310,8 +358,8 @@ void ControlValidator::calc_stop_point_overrun_status(
310
358
311
359
bool ControlValidator::is_all_valid (const ControlValidatorStatus & s)
312
360
{
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 ;
315
363
}
316
364
317
365
void ControlValidator::display_status ()
0 commit comments