Skip to content

Commit 87d69f3

Browse files
authored
Combined status and state read managers (#13)
* Combined status and state read managers * Updated Readme
1 parent 719089b commit 87d69f3

File tree

3 files changed

+31
-22
lines changed

3 files changed

+31
-22
lines changed

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,29 @@ external_joint_measurements:
174174
'
175175
```
176176

177+
## Troubleshooting
178+
179+
### Slow communication
180+
181+
You can inspect read/write performance via the controller manager statistics topic. Look for the hardware interface’s
182+
reported read and write durations.
183+
If communication appears slow or irregular, check the following:
184+
185+
* **USB latency timer**
186+
* Many USB–TTL adapters buffer data by default (often 16 ms).
187+
* Verify with:
188+
```bash
189+
cat /sys/bus/usb-serial/devices/<ttyUSB0>/latency_timer
190+
```
191+
It should show **1 ms**.
192+
* **Baud rate**
193+
* Ensure the configured baud rate matches all motors.
194+
* Higher baud rates (e.g. 3 M or 4.5 M) significantly reduce cycle times.
195+
196+
* **Return Delay Time (per motor)**
197+
* Each Dynamixel adds this delay before replying.
198+
* Keep it **near 0** for fastest SyncRead performance
199+
177200
## Contribution
178201

179202
Feel free to contribute to this project by opening an issue or a pull request.

dynamixel_ros_control/include/dynamixel_ros_control/dynamixel_hardware_interface.hpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,8 @@ class DynamixelHardwareInterface : public hardware_interface::SystemInterface
5757
private:
5858
bool loadTransmissionConfiguration();
5959
bool processCommandInterfaceUpdates(const std::vector<std::string>& interface_updates, bool stopping);
60-
bool setUpStateReadManager();
60+
bool setUpStateAndStatusReadManager();
6161
bool setUpCmdReadManager();
62-
bool setUpStatusReadManager();
6362
bool setUpTorqueWriteManager();
6463
bool setUpControlWriteManager();
6564

@@ -83,7 +82,6 @@ class DynamixelHardwareInterface : public hardware_interface::SystemInterface
8382

8483
// Read
8584
SyncReadManager read_manager_;
86-
SyncReadManager status_read_manager_;
8785
SyncReadManager cmd_read_manager_;
8886
rclcpp::Time last_successful_read_time_;
8987
bool first_read_successful_{false};

dynamixel_ros_control/src/dynamixel_hardware_interface.cpp

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -214,8 +214,8 @@ DynamixelHardwareInterface::on_configure(const rclcpp_lifecycle::State& previous
214214
// }
215215

216216
// Set up sync read / write managers
217-
if (!setUpStatusReadManager() || !setUpStateReadManager() || !setUpTorqueWriteManager() ||
218-
!setUpControlWriteManager() || !setUpCmdReadManager()) {
217+
if (!setUpStateAndStatusReadManager() || !setUpTorqueWriteManager() || !setUpControlWriteManager() ||
218+
!setUpCmdReadManager()) {
219219
return hardware_interface::CallbackReturn::FAILURE;
220220
}
221221

@@ -463,13 +463,12 @@ hardware_interface::return_type DynamixelHardwareInterface::read(const rclcpp::T
463463
// Another operation is holding dynamixel_comm_mutex_; skipping read
464464
return hardware_interface::return_type::OK;
465465
}
466-
// Check for hardware errors
467-
status_read_manager_.read();
466+
467+
read_manager_.read();
468468
if (!isHardwareOk()) {
469469
return hardware_interface::return_type::ERROR;
470470
}
471471

472-
read_manager_.read();
473472
if (!read_manager_.isOk()) {
474473
DXL_LOG_ERROR("Read manager lost connection");
475474
return hardware_interface::return_type::ERROR;
@@ -616,7 +615,7 @@ bool DynamixelHardwareInterface::processCommandInterfaceUpdates(const std::vecto
616615
return true;
617616
}
618617

619-
bool DynamixelHardwareInterface::setUpStateReadManager()
618+
bool DynamixelHardwareInterface::setUpStateAndStatusReadManager()
620619
{
621620
read_manager_ = SyncReadManager();
622621
std::unordered_map<std::string, DxlValueMappingList> register_dynamixel_mappings;
@@ -628,6 +627,8 @@ bool DynamixelHardwareInterface::setUpStateReadManager()
628627
register_dynamixel_mappings[register_name].push_back(
629628
std::make_pair<Dynamixel*, DxlValue>(joint.dynamixel.get(), DxlValue(&interface_value)));
630629
}
630+
register_dynamixel_mappings[DXL_REGISTER_HARDWARE_ERROR].push_back(
631+
std::make_pair<Dynamixel*, DxlValue>(joint.dynamixel.get(), DxlValue(&joint.dynamixel->hardware_error_status)));
631632
}
632633

633634
for (const auto& [register_name, dynamixel_mapping] : register_dynamixel_mappings) {
@@ -637,19 +638,6 @@ bool DynamixelHardwareInterface::setUpStateReadManager()
637638
return read_manager_.init(driver_);
638639
}
639640

640-
bool DynamixelHardwareInterface::setUpStatusReadManager()
641-
{
642-
status_read_manager_ = SyncReadManager();
643-
DxlValueMappingList status_mapping;
644-
for (auto& [name, joint] : joints_) {
645-
status_read_manager_.addDynamixel(joint.dynamixel.get());
646-
status_mapping.push_back(
647-
std::make_pair<Dynamixel*, DxlValue>(joint.dynamixel.get(), DxlValue(&joint.dynamixel->hardware_error_status)));
648-
}
649-
650-
status_read_manager_.addRegister(DXL_REGISTER_HARDWARE_ERROR, status_mapping);
651-
return status_read_manager_.init(driver_);
652-
}
653641
bool DynamixelHardwareInterface::setUpCmdReadManager()
654642
{
655643
cmd_read_manager_ = SyncReadManager();

0 commit comments

Comments
 (0)