Skip to content

Commit c8f6a73

Browse files
committed
reflecting some review comments
Signed-off-by: bueche <ed.bueche64@gmail.com>
1 parent ceff220 commit c8f6a73

File tree

2 files changed

+62
-23
lines changed

2 files changed

+62
-23
lines changed

include/dynamixel_hardware_interface/dynamixel_hardware_interface.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,15 @@ class DynamixelHardware : public
373373

374374
// Move dxl_comm_ to the end for safe destruction order
375375
std::shared_ptr<Dynamixel> dxl_comm_;
376+
377+
/**
378+
* @brief populates a specific telementry value for a given servo
379+
* @return void
380+
*/
381+
void processTelemetryInterface(
382+
const std::string& interface_name,
383+
double value,
384+
size_t index);
376385
};
377386

378387
// Conversion maps between ROS2 and Dynamixel interface names

src/dynamixel_hardware_interface.cpp

Lines changed: 53 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@
3333
namespace dynamixel_hardware_interface
3434
{
3535

36+
// Telemetry interface name constants
37+
namespace TelemetryInterfaces {
38+
constexpr const char* TEMPERATURE = "Present Temperature";
39+
constexpr const char* VOLTAGE = "Present Input Voltage";
40+
constexpr const char* CURRENT = "Present Current";
41+
constexpr const char* LOAD = "Present Load";
42+
}
43+
3644
DynamixelHardware::DynamixelHardware()
3745
: rclcpp::Node("dynamixel_hardware_interface"),
3846
logger_(rclcpp::get_logger("dynamixel_hardware_interface"))
@@ -364,8 +372,8 @@ hardware_interface::CallbackReturn DynamixelHardware::on_init(
364372
dxl_state_pub_uni_ptr_->msg_.dxl_hw_state.resize(num_of_pub_data);
365373
dxl_state_pub_uni_ptr_->msg_.torque_state.resize(num_of_pub_data);
366374
// Add telemetry arrays
367-
dxl_state_pub_uni_ptr_->msg_.temperature.resize(num_of_pub_data);
368-
dxl_state_pub_uni_ptr_->msg_.voltage.resize(num_of_pub_data);
375+
dxl_state_pub_uni_ptr_->msg_.present_temperature.resize(num_of_pub_data);
376+
dxl_state_pub_uni_ptr_->msg_.present_input_voltage.resize(num_of_pub_data);
369377
dxl_state_pub_uni_ptr_->msg_.present_current.resize(num_of_pub_data);
370378
dxl_state_pub_uni_ptr_->msg_.present_load.resize(num_of_pub_data);
371379
dxl_state_pub_uni_ptr_->unlock();
@@ -612,6 +620,46 @@ hardware_interface::CallbackReturn DynamixelHardware::stop()
612620
return hardware_interface::CallbackReturn::SUCCESS;
613621
}
614622

623+
struct TelemetryHandler {
624+
double scale_factor;
625+
std::function<void(DynamixelHardware*, int16_t, size_t)> setter;
626+
};
627+
628+
void DynamixelHardware::processTelemetryInterface(
629+
const std::string& interface_name,
630+
double value,
631+
size_t index)
632+
{
633+
// Static map for constant time lookup - initialized once
634+
static const std::unordered_map<std::string, TelemetryHandler> telemetry_map = {
635+
{TelemetryInterfaces::TEMPERATURE,
636+
{1.0, [](DynamixelHardware* hw, int16_t val, size_t idx) {
637+
hw->dxl_state_pub_uni_ptr_->msg_.present_temperature.at(idx) = val;
638+
}}},
639+
{TelemetryInterfaces::VOLTAGE,
640+
{10.0, [](DynamixelHardware* hw, int16_t val, size_t idx) {
641+
hw->dxl_state_pub_uni_ptr_->msg_.present_input_voltage.at(idx) = val;
642+
}}},
643+
{TelemetryInterfaces::CURRENT,
644+
{1.0, [](DynamixelHardware* hw, int16_t val, size_t idx) {
645+
hw->dxl_state_pub_uni_ptr_->msg_.present_current.at(idx) = val;
646+
}}},
647+
{TelemetryInterfaces::LOAD,
648+
{1.0, [](DynamixelHardware* hw, int16_t val, size_t idx) {
649+
hw->dxl_state_pub_uni_ptr_->msg_.present_load.at(idx) = val;
650+
}}}
651+
};
652+
653+
auto it = telemetry_map.find(interface_name);
654+
if (it != telemetry_map.end()) {
655+
const auto& handler = it->second;
656+
double scale = handler.scale_factor;
657+
auto setter = handler.setter;
658+
int16_t converted_value = static_cast<int16_t>(value * scale);
659+
setter(this, converted_value, index);
660+
}
661+
}
662+
615663
hardware_interface::return_type DynamixelHardware::read(
616664
[[maybe_unused]] const rclcpp::Time & time, const rclcpp::Duration & period)
617665
{
@@ -663,35 +711,17 @@ hardware_interface::return_type DynamixelHardware::read(
663711
dxl_state_pub_uni_ptr_->msg_.torque_state.at(index) = ts;
664712

665713
// Initialize telemetry values to 0
666-
dxl_state_pub_uni_ptr_->msg_.temperature.at(index) = 0;
667-
dxl_state_pub_uni_ptr_->msg_.voltage.at(index) = 0;
714+
dxl_state_pub_uni_ptr_->msg_.present_temperature.at(index) = 0;
715+
dxl_state_pub_uni_ptr_->msg_.present_input_voltage.at(index) = 0;
668716
dxl_state_pub_uni_ptr_->msg_.present_current.at(index) = 0;
669717
dxl_state_pub_uni_ptr_->msg_.present_load.at(index) = 0;
670718

671719
// Extract telemetry values from state interfaces
672720
for (size_t i = 0; i < it.interface_name_vec.size(); i++) {
673721
const std::string& interface_name = it.interface_name_vec.at(i);
674722
double value = *it.value_ptr_vec.at(i);
675-
676-
if (interface_name == "Present Temperature") {
677-
dxl_state_pub_uni_ptr_->msg_.temperature.at(index) =
678-
static_cast<int16_t>(value);
679-
}
680-
else if (interface_name == "Present Input Voltage") {
681-
dxl_state_pub_uni_ptr_->msg_.voltage.at(index) =
682-
static_cast<int16_t>(value * 10.0);
683-
}
684-
else if (interface_name == "Present Current") {
685-
// Value is already in mA (raw units) from model file
686-
dxl_state_pub_uni_ptr_->msg_.present_current.at(index) =
687-
static_cast<int16_t>(value);
688-
}
689-
else if (interface_name == "Present Load") {
690-
dxl_state_pub_uni_ptr_->msg_.present_load.at(index) =
691-
static_cast<int16_t>(value);
692-
}
723+
processTelemetryInterface(interface_name, value, index);
693724
}
694-
695725
index++;
696726
}
697727
dxl_state_pub_uni_ptr_->unlockAndPublish();

0 commit comments

Comments
 (0)