@@ -26,10 +26,9 @@ EmergencyHandler::EmergencyHandler() : Node("emergency_handler")
26
26
param_.use_parking_after_stopped = declare_parameter<bool >(" use_parking_after_stopped" );
27
27
param_.use_comfortable_stop = declare_parameter<bool >(" use_comfortable_stop" );
28
28
param_.turning_hazard_on .emergency = declare_parameter<bool >(" turning_hazard_on.emergency" );
29
-
30
29
using std::placeholders::_1;
31
30
32
- // Subscriber
31
+ // Subscriber with callback
33
32
sub_hazard_status_stamped_ =
34
33
create_subscription<autoware_auto_system_msgs::msg::HazardStatusStamped>(
35
34
" ~/input/hazard_status" , rclcpp::QoS{1 },
@@ -38,17 +37,41 @@ EmergencyHandler::EmergencyHandler() : Node("emergency_handler")
38
37
create_subscription<autoware_auto_control_msgs::msg::AckermannControlCommand>(
39
38
" ~/input/prev_control_command" , rclcpp::QoS{1 },
40
39
std::bind (&EmergencyHandler::onPrevControlCommand, this , _1));
40
+
41
+ // Subscriber without callback
42
+ rclcpp::CallbackGroup::SharedPtr cb_group_noexec = this ->create_callback_group (
43
+ rclcpp::CallbackGroupType::MutuallyExclusive, false );
44
+ auto subscription_options = rclcpp::SubscriptionOptions ();
45
+ subscription_options.callback_group = cb_group_noexec;
46
+
41
47
sub_odom_ = create_subscription<nav_msgs::msg::Odometry>(
42
- " ~/input/odometry" , rclcpp::QoS{1 }, std::bind (&EmergencyHandler::onOdometry, this , _1));
43
- // subscribe control mode
48
+ " ~/input/odometry" , rclcpp::QoS{1 },
49
+ [this ]([[maybe_unused]] nav_msgs::msg::Odometry::SharedPtr) -> void
50
+ {
51
+ assert (false );
52
+ }, subscription_options);
53
+
44
54
sub_control_mode_ = create_subscription<autoware_auto_vehicle_msgs::msg::ControlModeReport>(
45
- " ~/input/control_mode" , rclcpp::QoS{1 }, std::bind (&EmergencyHandler::onControlMode, this , _1));
55
+ " ~/input/control_mode" , rclcpp::QoS{1 },
56
+ [this ]([[maybe_unused]] autoware_auto_vehicle_msgs::msg::ControlModeReport::SharedPtr) -> void
57
+ {
58
+ assert (false );
59
+ }, subscription_options);
60
+
61
+ // subscribe control mode
46
62
sub_mrm_comfortable_stop_status_ = create_subscription<tier4_system_msgs::msg::MrmBehaviorStatus>(
47
63
" ~/input/mrm/comfortable_stop/status" , rclcpp::QoS{1 },
48
- std::bind (&EmergencyHandler::onMrmComfortableStopStatus, this , _1));
64
+ [this ]([[maybe_unused]] tier4_system_msgs::msg::MrmBehaviorStatus::SharedPtr) -> void
65
+ {
66
+ assert (false );
67
+ }, subscription_options);
68
+
49
69
sub_mrm_emergency_stop_status_ = create_subscription<tier4_system_msgs::msg::MrmBehaviorStatus>(
50
70
" ~/input/mrm/emergency_stop/status" , rclcpp::QoS{1 },
51
- std::bind (&EmergencyHandler::onMrmEmergencyStopStatus, this , _1));
71
+ [this ]([[maybe_unused]] tier4_system_msgs::msg::MrmBehaviorStatus::SharedPtr) -> void
72
+ {
73
+ assert (false );
74
+ }, subscription_options);
52
75
53
76
// Publisher
54
77
pub_control_command_ = create_publisher<autoware_auto_control_msgs::msg::AckermannControlCommand>(
@@ -73,13 +96,8 @@ EmergencyHandler::EmergencyHandler() : Node("emergency_handler")
73
96
client_mrm_emergency_stop_group_);
74
97
75
98
// Initialize
76
- odom_ = std::make_shared<const nav_msgs::msg::Odometry>();
77
- control_mode_ = std::make_shared<const autoware_auto_vehicle_msgs::msg::ControlModeReport>();
78
99
prev_control_command_ = autoware_auto_control_msgs::msg::AckermannControlCommand::ConstSharedPtr (
79
100
new autoware_auto_control_msgs::msg::AckermannControlCommand);
80
- mrm_comfortable_stop_status_ =
81
- std::make_shared<const tier4_system_msgs::msg::MrmBehaviorStatus>();
82
- mrm_emergency_stop_status_ = std::make_shared<const tier4_system_msgs::msg::MrmBehaviorStatus>();
83
101
mrm_state_.stamp = this ->now ();
84
102
mrm_state_.state = autoware_adapi_v1_msgs::msg::MrmState::NORMAL;
85
103
mrm_state_.behavior = autoware_adapi_v1_msgs::msg::MrmState::NONE;
@@ -107,29 +125,6 @@ void EmergencyHandler::onPrevControlCommand(
107
125
autoware_auto_control_msgs::msg::AckermannControlCommand::ConstSharedPtr (control_command);
108
126
}
109
127
110
- void EmergencyHandler::onOdometry (const nav_msgs::msg::Odometry::ConstSharedPtr msg)
111
- {
112
- odom_ = msg;
113
- }
114
-
115
- void EmergencyHandler::onControlMode (
116
- const autoware_auto_vehicle_msgs::msg::ControlModeReport::ConstSharedPtr msg)
117
- {
118
- control_mode_ = msg;
119
- }
120
-
121
- void EmergencyHandler::onMrmComfortableStopStatus (
122
- const tier4_system_msgs::msg::MrmBehaviorStatus::ConstSharedPtr msg)
123
- {
124
- mrm_comfortable_stop_status_ = msg;
125
- }
126
-
127
- void EmergencyHandler::onMrmEmergencyStopStatus (
128
- const tier4_system_msgs::msg::MrmBehaviorStatus::ConstSharedPtr msg)
129
- {
130
- mrm_emergency_stop_status_ = msg;
131
- }
132
-
133
128
autoware_auto_vehicle_msgs::msg::HazardLightsCommand EmergencyHandler::createHazardCmdMsg ()
134
129
{
135
130
using autoware_auto_vehicle_msgs::msg::HazardLightsCommand;
@@ -290,17 +285,14 @@ bool EmergencyHandler::isDataReady()
290
285
return false ;
291
286
}
292
287
293
- if (
294
- param_.use_comfortable_stop && mrm_comfortable_stop_status_->state ==
295
- tier4_system_msgs::msg::MrmBehaviorStatus::NOT_AVAILABLE) {
288
+ if (param_.use_comfortable_stop && !isComfortableStopStatusAvailable ()) {
296
289
RCLCPP_INFO_THROTTLE (
297
290
this ->get_logger (), *this ->get_clock (), std::chrono::milliseconds (5000 ).count (),
298
291
" waiting for mrm comfortable stop to become available..." );
299
292
return false ;
300
293
}
301
294
302
- if (
303
- mrm_emergency_stop_status_->state == tier4_system_msgs::msg::MrmBehaviorStatus::NOT_AVAILABLE) {
295
+ if (!isEmergencyStopStatusAvailable ()) {
304
296
RCLCPP_INFO_THROTTLE (
305
297
this ->get_logger (), *this ->get_clock (), std::chrono::milliseconds (5000 ).count (),
306
298
" waiting for mrm emergency stop to become available..." );
@@ -372,13 +364,11 @@ void EmergencyHandler::transitionTo(const int new_state)
372
364
void EmergencyHandler::updateMrmState ()
373
365
{
374
366
using autoware_adapi_v1_msgs::msg::MrmState;
375
- using autoware_auto_vehicle_msgs::msg::ControlModeReport;
376
367
377
368
// Check emergency
378
369
const bool is_emergency = isEmergency ();
379
-
380
370
// Get mode
381
- const bool is_auto_mode = control_mode_-> mode == ControlModeReport::AUTONOMOUS ;
371
+ const bool is_auto_mode = isAutonomous () ;
382
372
383
373
// State Machine
384
374
if (mrm_state_.state == MrmState::NORMAL) {
@@ -452,10 +442,36 @@ bool EmergencyHandler::isEmergency()
452
442
453
443
bool EmergencyHandler::isStopped ()
454
444
{
445
+ auto odom = std::make_shared<nav_msgs::msg::Odometry>();
446
+ rclcpp::MessageInfo msg_info;
447
+ if (!sub_odom_->take (*odom, msg_info)) return false ;
448
+
455
449
constexpr auto th_stopped_velocity = 0.001 ;
456
- if (odom_->twist .twist .linear .x < th_stopped_velocity) {
457
- return true ;
458
- }
450
+ return (odom->twist .twist .linear .x < th_stopped_velocity);
451
+ }
459
452
460
- return false ;
453
+ bool EmergencyHandler::isAutonomous ()
454
+ {
455
+ using autoware_auto_vehicle_msgs::msg::ControlModeReport;
456
+
457
+ auto control_mode = std::make_shared<autoware_auto_vehicle_msgs::msg::ControlModeReport>();
458
+ rclcpp::MessageInfo msg_info;
459
+ if (!sub_control_mode_->take (*control_mode, msg_info)) return false ;
460
+ return control_mode->mode == ControlModeReport::AUTONOMOUS;
461
+ }
462
+
463
+ bool EmergencyHandler::isComfortableStopStatusAvailable ()
464
+ {
465
+ auto status = std::make_shared<tier4_system_msgs::msg::MrmBehaviorStatus>();
466
+ rclcpp::MessageInfo msg_info;
467
+ if (!sub_mrm_comfortable_stop_status_->take (*status, msg_info)) return false ;
468
+ return status->state != tier4_system_msgs::msg::MrmBehaviorStatus::NOT_AVAILABLE;
469
+ }
470
+
471
+ bool EmergencyHandler::isEmergencyStopStatusAvailable ()
472
+ {
473
+ auto status = std::make_shared<tier4_system_msgs::msg::MrmBehaviorStatus>();
474
+ rclcpp::MessageInfo msg_info;
475
+ if (!sub_mrm_emergency_stop_status_->take (*status, msg_info)) return false ;
476
+ return status->state != tier4_system_msgs::msg::MrmBehaviorStatus::NOT_AVAILABLE;
461
477
}
0 commit comments