@@ -94,6 +94,7 @@ MrmHandler::MrmHandler() : Node("mrm_handler")
94
94
mrm_state_.stamp = this ->now ();
95
95
mrm_state_.state = autoware_adapi_v1_msgs::msg::MrmState::NORMAL;
96
96
mrm_state_.behavior = autoware_adapi_v1_msgs::msg::MrmState::NONE;
97
+ is_operation_mode_availability_timeout = false ;
97
98
98
99
// Timer
99
100
const auto update_period_ns = rclcpp::Rate (param_.update_rate ).period ();
@@ -376,24 +377,29 @@ bool MrmHandler::isDataReady()
376
377
return true ;
377
378
}
378
379
379
- void MrmHandler::onTimer ()
380
+ void MrmHandler::checkOperationModeAvailabilityTimeout ()
380
381
{
381
- if (!isDataReady ()) {
382
- return ;
383
- }
384
- const bool is_operation_mode_availability_timeout =
382
+ if (
385
383
(this ->now () - stamp_operation_mode_availability_).seconds () >
386
- param_.timeout_operation_mode_availability ;
387
- if ( is_operation_mode_availability_timeout) {
384
+ param_.timeout_operation_mode_availability ) {
385
+ is_operation_mode_availability_timeout = true ;
388
386
RCLCPP_WARN_THROTTLE (
389
387
this ->get_logger (), *this ->get_clock (), std::chrono::milliseconds (1000 ).count (),
390
- " heartbeat operation_mode_availability is timeout" );
391
- mrm_state_.state = autoware_adapi_v1_msgs::msg::MrmState::MRM_OPERATING;
392
- publishHazardCmd ();
393
- publishGearCmd ();
388
+ " operation_mode_availability is timeout" );
389
+ } else {
390
+ is_operation_mode_availability_timeout = false ;
391
+ }
392
+ }
393
+
394
+ void MrmHandler::onTimer ()
395
+ {
396
+ if (!isDataReady ()) {
394
397
return ;
395
398
}
396
399
400
+ // Check whether operation_mode_availability is timeout
401
+ checkOperationModeAvailabilityTimeout ();
402
+
397
403
// Update Emergency State
398
404
updateMrmState ();
399
405
@@ -495,6 +501,9 @@ autoware_adapi_v1_msgs::msg::MrmState::_behavior_type MrmHandler::getCurrentMrmB
495
501
496
502
// State machine
497
503
if (mrm_state_.behavior == MrmState::NONE) {
504
+ if (is_operation_mode_availability_timeout) {
505
+ return MrmState::EMERGENCY_STOP;
506
+ }
498
507
if (operation_mode_availability_->pull_over ) {
499
508
if (param_.use_pull_over ) {
500
509
return MrmState::PULL_OVER;
@@ -511,6 +520,9 @@ autoware_adapi_v1_msgs::msg::MrmState::_behavior_type MrmHandler::getCurrentMrmB
511
520
return MrmState::EMERGENCY_STOP;
512
521
}
513
522
if (mrm_state_.behavior == MrmState::PULL_OVER) {
523
+ if (is_operation_mode_availability_timeout) {
524
+ return MrmState::EMERGENCY_STOP;
525
+ }
514
526
if (operation_mode_availability_->pull_over ) {
515
527
if (param_.use_pull_over ) {
516
528
return MrmState::PULL_OVER;
@@ -527,6 +539,9 @@ autoware_adapi_v1_msgs::msg::MrmState::_behavior_type MrmHandler::getCurrentMrmB
527
539
return MrmState::EMERGENCY_STOP;
528
540
}
529
541
if (mrm_state_.behavior == MrmState::COMFORTABLE_STOP) {
542
+ if (is_operation_mode_availability_timeout) {
543
+ return MrmState::EMERGENCY_STOP;
544
+ }
530
545
if (isStopped () && operation_mode_availability_->pull_over ) {
531
546
if (param_.use_pull_over ) {
532
547
return MrmState::PULL_OVER;
@@ -543,6 +558,9 @@ autoware_adapi_v1_msgs::msg::MrmState::_behavior_type MrmHandler::getCurrentMrmB
543
558
return MrmState::EMERGENCY_STOP;
544
559
}
545
560
if (mrm_state_.behavior == MrmState::EMERGENCY_STOP) {
561
+ if (is_operation_mode_availability_timeout) {
562
+ return MrmState::EMERGENCY_STOP;
563
+ }
546
564
if (isStopped () && operation_mode_availability_->pull_over ) {
547
565
if (param_.use_pull_over ) {
548
566
return MrmState::PULL_OVER;
@@ -569,7 +587,8 @@ bool MrmHandler::isStopped()
569
587
570
588
bool MrmHandler::isEmergency () const
571
589
{
572
- return !operation_mode_availability_->autonomous || is_emergency_holding_;
590
+ return !operation_mode_availability_->autonomous || is_emergency_holding_ ||
591
+ is_operation_mode_availability_timeout;
573
592
}
574
593
575
594
bool MrmHandler::isArrivedAtGoal ()
0 commit comments