@@ -35,7 +35,11 @@ DynamixelHardware::DynamixelHardware()
3535{
3636 dxl_status_ = DXL_OK;
3737 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 );
3943}
4044
4145DynamixelHardware::~DynamixelHardware ()
@@ -64,7 +68,13 @@ hardware_interface::CallbackReturn DynamixelHardware::on_init(
6468
6569 port_name_ = info_.hardware_parameters [" port_name" ];
6670 baud_rate_ = info_.hardware_parameters [" baud_rate" ];
67- err_timeout_sec_ = stod (info_.hardware_parameters [" error_timeout_sec" ]);
71+ try {
72+ err_timeout_ms_ = stod (info_.hardware_parameters [" error_timeout_ms" ]);
73+ } catch (const std::exception & e) {
74+ RCLCPP_ERROR (
75+ logger_, " Failed to parse error_timeout_ms parameter: %s, using default value" ,
76+ e.what ());
77+ }
6878
6979 RCLCPP_INFO_STREAM (
7080 logger_,
@@ -269,8 +279,6 @@ hardware_interface::CallbackReturn DynamixelHardware::on_init(
269279 str_set_dxl_torque_srv_name,
270280 std::bind (&DynamixelHardware::set_dxl_torque_srv_callback, this , _1, _2));
271281
272- ros_update_freq_ = stoi (info_.hardware_parameters [" ros_update_freq" ]);
273-
274282 return hardware_interface::CallbackReturn::SUCCESS;
275283}
276284
@@ -394,11 +402,24 @@ hardware_interface::return_type DynamixelHardware::read(
394402 } else if (dxl_status_ == DXL_OK || dxl_status_ == COMM_ERROR) {
395403 dxl_comm_err_ = CheckError (dxl_comm_->ReadMultiDxlData ());
396404 if (dxl_comm_err_ != DxlError::OK) {
405+ if (!is_read_in_error_) {
406+ is_read_in_error_ = true ;
407+ read_error_duration_ = rclcpp::Duration (0 , 0 );
408+ }
409+ read_error_duration_ = read_error_duration_ + period;
410+
397411 RCLCPP_ERROR_STREAM (
398412 logger_,
399- " Dynamixel Read Fail :" << Dynamixel::DxlErrorToString (dxl_comm_err_));
400- return hardware_interface::return_type::ERROR;
413+ " Dynamixel Read Fail (Duration: " << read_error_duration_.seconds () * 1000 << " ms/" <<
414+ err_timeout_ms_ << " ms)" );
415+
416+ if (read_error_duration_.seconds () * 1000 >= err_timeout_ms_) {
417+ return hardware_interface::return_type::ERROR;
418+ }
419+ return hardware_interface::return_type::OK;
401420 }
421+ is_read_in_error_ = false ;
422+ read_error_duration_ = rclcpp::Duration (0 , 0 );
402423 } else if (dxl_status_ == HW_ERROR) {
403424 dxl_comm_err_ = CheckError (dxl_comm_->ReadMultiDxlData ());
404425 if (dxl_comm_err_ != DxlError::OK) {
@@ -434,7 +455,6 @@ hardware_interface::return_type DynamixelHardware::read(
434455 }
435456 return hardware_interface::return_type::OK;
436457}
437-
438458hardware_interface::return_type DynamixelHardware::write (
439459 const rclcpp::Time & time, const rclcpp::Duration & period)
440460{
@@ -447,16 +467,29 @@ hardware_interface::return_type DynamixelHardware::write(
447467
448468 dxl_comm_->WriteMultiDxlData ();
449469
470+ is_write_in_error_ = false ;
471+ write_error_duration_ = rclcpp::Duration (0 , 0 );
472+
450473 return hardware_interface::return_type::OK;
451474 } else {
452- RCLCPP_ERROR_STREAM (logger_, " Dynamixel Write Fail" );
453- return hardware_interface::return_type::ERROR;
475+ write_error_duration_ = write_error_duration_ + period;
476+
477+ RCLCPP_ERROR_STREAM (
478+ logger_,
479+ " Dynamixel Write Fail (Duration: " << write_error_duration_.seconds () * 1000 << " ms/" <<
480+ err_timeout_ms_ << " ms)" );
481+
482+ if (write_error_duration_.seconds () * 1000 >= err_timeout_ms_) {
483+ return hardware_interface::return_type::ERROR;
484+ }
485+ return hardware_interface::return_type::OK;
454486 }
455487}
456488
457489DxlError DynamixelHardware::CheckError (DxlError dxl_comm_err)
458490{
459491 DxlError error_state = DxlError::OK;
492+ dxl_status_ = DXL_OK;
460493
461494 // check comm error
462495 if (dxl_comm_err != DxlError::OK) {
0 commit comments