@@ -35,7 +35,11 @@ DynamixelHardware::DynamixelHardware()
35
35
{
36
36
dxl_status_ = DXL_OK;
37
37
dxl_torque_status_ = TORQUE_ENABLED;
38
- err_timeout_sec_ = 3.0 ;
38
+ err_timeout_ms_ = 500 ;
39
+ is_read_in_error_ = false ;
40
+ is_write_in_error_ = false ;
41
+ read_error_duration_ = rclcpp::Duration (0 , 0 );
42
+ write_error_duration_ = rclcpp::Duration (0 , 0 );
39
43
}
40
44
41
45
DynamixelHardware::~DynamixelHardware ()
@@ -64,7 +68,7 @@ hardware_interface::CallbackReturn DynamixelHardware::on_init(
64
68
65
69
port_name_ = info_.hardware_parameters [" port_name" ];
66
70
baud_rate_ = info_.hardware_parameters [" baud_rate" ];
67
- err_timeout_sec_ = stod (info_.hardware_parameters [" error_timeout_sec " ]);
71
+ err_timeout_ms_ = stod (info_.hardware_parameters [" error_timeout_ms " ]);
68
72
69
73
RCLCPP_INFO_STREAM (
70
74
logger_,
@@ -394,11 +398,23 @@ hardware_interface::return_type DynamixelHardware::read(
394
398
} else if (dxl_status_ == DXL_OK || dxl_status_ == COMM_ERROR) {
395
399
dxl_comm_err_ = CheckError (dxl_comm_->ReadMultiDxlData ());
396
400
if (dxl_comm_err_ != DxlError::OK) {
401
+ if (!is_read_in_error_) {
402
+ is_read_in_error_ = true ;
403
+ read_error_duration_ = rclcpp::Duration (0 , 0 );
404
+ }
405
+ read_error_duration_ = read_error_duration_ + period;
406
+
397
407
RCLCPP_ERROR_STREAM (
398
408
logger_,
399
- " Dynamixel Read Fail :" << Dynamixel::DxlErrorToString (dxl_comm_err_));
400
- return hardware_interface::return_type::ERROR;
409
+ " Dynamixel Read Fail (Duration: " << read_error_duration_.seconds () * 1000 << " ms/" << err_timeout_ms_ << " ms)" );
410
+
411
+ if (read_error_duration_.seconds () * 1000 >= err_timeout_ms_) {
412
+ return hardware_interface::return_type::ERROR;
413
+ }
414
+ return hardware_interface::return_type::OK;
401
415
}
416
+ is_read_in_error_ = false ;
417
+ read_error_duration_ = rclcpp::Duration (0 , 0 );
402
418
} else if (dxl_status_ == HW_ERROR) {
403
419
dxl_comm_err_ = CheckError (dxl_comm_->ReadMultiDxlData ());
404
420
if (dxl_comm_err_ != DxlError::OK) {
@@ -434,7 +450,6 @@ hardware_interface::return_type DynamixelHardware::read(
434
450
}
435
451
return hardware_interface::return_type::OK;
436
452
}
437
-
438
453
hardware_interface::return_type DynamixelHardware::write (
439
454
const rclcpp::Time & time, const rclcpp::Duration & period)
440
455
{
@@ -447,16 +462,28 @@ hardware_interface::return_type DynamixelHardware::write(
447
462
448
463
dxl_comm_->WriteMultiDxlData ();
449
464
465
+ is_write_in_error_ = false ;
466
+ write_error_duration_ = rclcpp::Duration (0 , 0 );
467
+
450
468
return hardware_interface::return_type::OK;
451
469
} else {
452
- RCLCPP_ERROR_STREAM (logger_, " Dynamixel Write Fail" );
453
- return hardware_interface::return_type::ERROR;
470
+ write_error_duration_ = write_error_duration_ + period;
471
+
472
+ RCLCPP_ERROR_STREAM (
473
+ logger_,
474
+ " Dynamixel Write Fail (Duration: " << write_error_duration_.seconds () * 1000 << " ms/" << err_timeout_ms_ << " ms)" );
475
+
476
+ if (write_error_duration_.seconds () * 1000 >= err_timeout_ms_) {
477
+ return hardware_interface::return_type::ERROR;
478
+ }
479
+ return hardware_interface::return_type::OK;
454
480
}
455
481
}
456
482
457
483
DxlError DynamixelHardware::CheckError (DxlError dxl_comm_err)
458
484
{
459
485
DxlError error_state = DxlError::OK;
486
+ dxl_status_ = DXL_OK;
460
487
461
488
// check comm error
462
489
if (dxl_comm_err != DxlError::OK) {
0 commit comments