|
23 | 23 | #include <vector>
|
24 | 24 | #include <string>
|
25 | 25 | #include <map>
|
| 26 | +#include <unordered_map> |
26 | 27 |
|
27 | 28 | #include "hardware_interface/types/hardware_interface_type_values.hpp"
|
28 | 29 | #include "rclcpp/rclcpp.hpp"
|
@@ -435,23 +436,7 @@ hardware_interface::CallbackReturn DynamixelHardware::start()
|
435 | 436 | CalcTransmissionToJoint();
|
436 | 437 |
|
437 | 438 | // sync commands = states joint
|
438 |
| - for (auto it_states : hdl_joint_states_) { |
439 |
| - for (auto it_commands : hdl_joint_commands_) { |
440 |
| - if (it_states.name == it_commands.name) { |
441 |
| - for (size_t i = 0; i < it_states.interface_name_vec.size(); i++) { |
442 |
| - if (it_commands.interface_name_vec.at(0) == it_states.interface_name_vec.at(i)) { |
443 |
| - *it_commands.value_ptr_vec.at(0) = *it_states.value_ptr_vec.at(i); |
444 |
| - RCLCPP_INFO_STREAM( |
445 |
| - logger_, "Sync joint state to command (" << |
446 |
| - it_commands.interface_name_vec.at(0).c_str() << ", " << |
447 |
| - *it_commands.value_ptr_vec.at(0) * 180.0 / 3.141592 << " <- " << |
448 |
| - it_states.interface_name_vec.at(i).c_str() << ", " << |
449 |
| - *it_states.value_ptr_vec.at(i) * 180.0 / 3.141592); |
450 |
| - } |
451 |
| - } |
452 |
| - } |
453 |
| - } |
454 |
| - } |
| 439 | + SyncJointCommandWithStates(); |
455 | 440 | usleep(500 * 1000);
|
456 | 441 |
|
457 | 442 | // Enable torque only for Dynamixels that have torque enabled in their parameters
|
@@ -846,24 +831,26 @@ bool DynamixelHardware::InitDxlWriteItems()
|
846 | 831 | if (!is_set_hdl_) {
|
847 | 832 | hdl_trans_commands_.clear();
|
848 | 833 | for (const hardware_interface::ComponentInfo & gpio : info_.gpios) {
|
849 |
| - if (gpio.command_interfaces.size()) { |
850 |
| - uint8_t id = static_cast<uint8_t>(stoi(gpio.parameters.at("ID"))); |
851 |
| - HandlerVarType temp_write; |
852 |
| - temp_write.id = id; |
853 |
| - temp_write.name = gpio.name; |
854 |
| - |
855 |
| - temp_write.interface_name_vec.push_back("Goal Position"); |
856 |
| - temp_write.value_ptr_vec.push_back(std::make_shared<double>(0.0)); |
857 |
| - |
858 |
| - for (auto it : gpio.command_interfaces) { |
859 |
| - if (it.name == "Goal Current") { |
860 |
| - temp_write.interface_name_vec.push_back("Goal Current"); |
861 |
| - temp_write.value_ptr_vec.push_back(std::make_shared<double>(0.0)); |
862 |
| - } |
| 834 | + if(gpio.parameters.at("type") != "dxl") { |
| 835 | + continue; |
| 836 | + } |
| 837 | + uint8_t id = static_cast<uint8_t>(stoi(gpio.parameters.at("ID"))); |
| 838 | + HandlerVarType temp_write; |
| 839 | + temp_write.id = id; |
| 840 | + temp_write.name = gpio.name; |
| 841 | + |
| 842 | + for (auto it : gpio.command_interfaces) { |
| 843 | + if (it.name != "Goal Position" && |
| 844 | + it.name != "Goal Velocity" && |
| 845 | + it.name != "Goal Current") |
| 846 | + { |
| 847 | + continue; |
863 | 848 | }
|
864 |
| - |
865 |
| - hdl_trans_commands_.push_back(temp_write); |
| 849 | + temp_write.interface_name_vec.push_back(it.name); |
| 850 | + temp_write.value_ptr_vec.push_back(std::make_shared<double>(0.0)); |
866 | 851 | }
|
| 852 | + |
| 853 | + hdl_trans_commands_.push_back(temp_write); |
867 | 854 | }
|
868 | 855 | is_set_hdl_ = true;
|
869 | 856 | }
|
@@ -958,90 +945,102 @@ void DynamixelHardware::SetMatrix()
|
958 | 945 | }
|
959 | 946 | void DynamixelHardware::CalcTransmissionToJoint()
|
960 | 947 | {
|
| 948 | + // Define the indices and their corresponding state types |
| 949 | + const std::array<size_t, 3> indices = { |
| 950 | + PRESENT_POSITION_INDEX, |
| 951 | + PRESENT_VELOCITY_INDEX, |
| 952 | + PRESENT_EFFORT_INDEX |
| 953 | + }; |
| 954 | + |
| 955 | + // Process each joint |
961 | 956 | for (size_t i = 0; i < num_of_joints_; i++) {
|
962 |
| - double value = 0.0; |
963 |
| - for (size_t j = 0; j < num_of_transmissions_; j++) { |
964 |
| - value += transmission_to_joint_matrix_[i][j] * |
965 |
| - (*hdl_trans_states_.at(j).value_ptr_vec.at(PRESENT_POSITION_INDEX)); |
966 |
| - } |
967 |
| - |
968 |
| - if (hdl_joint_states_.at(i).name == conversion_joint_name_) { |
969 |
| - value = revoluteToPrismatic(value); |
970 |
| - } |
971 |
| - *hdl_joint_states_.at(i).value_ptr_vec.at(PRESENT_POSITION_INDEX) = value; |
972 |
| - } |
| 957 | + // Process each state type (position, velocity, effort) |
| 958 | + for (size_t state_idx : indices) { |
| 959 | + double value = 0.0; |
| 960 | + // Calculate value using transmission matrix |
| 961 | + for (size_t j = 0; j < num_of_transmissions_; j++) { |
| 962 | + value += transmission_to_joint_matrix_[i][j] * |
| 963 | + (*hdl_trans_states_.at(j).value_ptr_vec.at(state_idx)); |
| 964 | + } |
973 | 965 |
|
974 |
| - for (size_t i = 0; i < num_of_joints_; i++) { |
975 |
| - double value = 0.0; |
976 |
| - for (size_t j = 0; j < num_of_transmissions_; j++) { |
977 |
| - value += transmission_to_joint_matrix_[i][j] * |
978 |
| - (*hdl_trans_states_.at(j).value_ptr_vec.at(PRESENT_VELOCITY_INDEX)); |
979 |
| - } |
980 |
| - *hdl_joint_states_.at(i).value_ptr_vec.at(PRESENT_VELOCITY_INDEX) = value; |
981 |
| - } |
| 966 | + // Apply conversion if needed (only for position) |
| 967 | + if (state_idx == PRESENT_POSITION_INDEX && |
| 968 | + hdl_joint_states_.at(i).name == conversion_joint_name_) { |
| 969 | + value = revoluteToPrismatic(value); |
| 970 | + } |
982 | 971 |
|
983 |
| - for (size_t i = 0; i < num_of_joints_; i++) { |
984 |
| - double value = 0.0; |
985 |
| - for (size_t j = 0; j < num_of_transmissions_; j++) { |
986 |
| - value += transmission_to_joint_matrix_[i][j] * |
987 |
| - (*hdl_trans_states_.at(j).value_ptr_vec.at(PRESENT_EFFORT_INDEX)); |
| 972 | + // Store the calculated value |
| 973 | + *hdl_joint_states_.at(i).value_ptr_vec.at(state_idx) = value; |
988 | 974 | }
|
989 |
| - *hdl_joint_states_.at(i).value_ptr_vec.at(PRESENT_EFFORT_INDEX) = value; |
990 | 975 | }
|
991 | 976 | }
|
992 | 977 |
|
993 | 978 | void DynamixelHardware::CalcJointToTransmission()
|
994 | 979 | {
|
995 | 980 | for (size_t i = 0; i < num_of_transmissions_; i++) {
|
996 | 981 | double value = 0.0;
|
| 982 | + bool temp_flag = false; |
997 | 983 | for (size_t j = 0; j < num_of_joints_; j++) {
|
998 |
| - value += joint_to_transmission_matrix_[i][j] * |
999 |
| - (*hdl_joint_commands_.at(j).value_ptr_vec.at(GOAL_POSITION_INDEX)); |
1000 |
| - } |
1001 |
| - |
1002 |
| - if (hdl_trans_commands_.at(i).name == conversion_dxl_name_) { |
1003 |
| - value = prismaticToRevolute(value); |
1004 |
| - } |
1005 |
| - *hdl_trans_commands_.at(i).value_ptr_vec.at(GOAL_POSITION_INDEX) = value; |
1006 |
| - } |
1007 |
| - |
1008 |
| - for (size_t i = 0; i < num_of_transmissions_; i++) { |
1009 |
| - if (hdl_trans_commands_.at(i).interface_name_vec.size() > GOAL_CURRENT_INDEX && |
1010 |
| - hdl_trans_commands_.at(i).interface_name_vec.at(GOAL_CURRENT_INDEX) == "Goal Current") |
1011 |
| - { |
1012 |
| - for (size_t j = 0; j < hdl_joint_commands_.size(); j++) { |
1013 |
| - if (hdl_joint_commands_.at(j).interface_name_vec.size() > GOAL_CURRENT_INDEX && |
1014 |
| - hdl_joint_commands_.at(j).interface_name_vec.at(GOAL_CURRENT_INDEX) == |
1015 |
| - hardware_interface::HW_IF_EFFORT) |
1016 |
| - { |
1017 |
| - double value = 0.0; |
1018 |
| - for (size_t k = 0; k < num_of_joints_; k++) { |
1019 |
| - value += joint_to_transmission_matrix_[i][k] * |
1020 |
| - (*hdl_joint_commands_.at(k).value_ptr_vec.at(GOAL_CURRENT_INDEX)); |
| 984 | + for(size_t k = 0; k < hdl_joint_commands_.at(j).interface_name_vec.size(); k++) { |
| 985 | + value += joint_to_transmission_matrix_[i][j] * |
| 986 | + (*hdl_joint_commands_.at(j).value_ptr_vec.at(k)); |
| 987 | + if(hdl_joint_commands_.at(j).name == "l_rh_r1_joint") { |
| 988 | + if(joint_to_transmission_matrix_[i][j] == 1.0) { |
| 989 | + temp_flag = true; |
1021 | 990 | }
|
1022 |
| - *hdl_trans_commands_.at(i).value_ptr_vec.at(GOAL_CURRENT_INDEX) = value; |
1023 | 991 | }
|
1024 | 992 | }
|
1025 | 993 | }
|
| 994 | + |
| 995 | + for(size_t k = 0; k < hdl_trans_commands_.at(i).interface_name_vec.size(); k++) { |
| 996 | + if (hdl_trans_commands_.at(i).interface_name_vec.at(k) == "Goal Position" && |
| 997 | + hdl_trans_commands_.at(i).name == conversion_dxl_name_) { |
| 998 | + value = prismaticToRevolute(value); |
| 999 | + } |
| 1000 | + if(hdl_trans_commands_.at(i).name == "dxl38") { |
| 1001 | + RCLCPP_INFO_STREAM(logger_, "hdl_trans_commands_.at(i).name: " << hdl_trans_commands_.at(i).name << ", cmd_idx: " << k << ", value: " << value); |
| 1002 | + } |
| 1003 | + *hdl_trans_commands_.at(i).value_ptr_vec.at(k) = value; |
| 1004 | + } |
1026 | 1005 | }
|
1027 | 1006 | }
|
1028 | 1007 |
|
| 1008 | + |
1029 | 1009 | void DynamixelHardware::SyncJointCommandWithStates()
|
1030 | 1010 | {
|
1031 |
| - for (auto it_states : hdl_joint_states_) { |
1032 |
| - for (auto it_commands : hdl_joint_commands_) { |
| 1011 | + for (auto& it_states : hdl_joint_states_) { |
| 1012 | + for (auto& it_commands : hdl_joint_commands_) { |
1033 | 1013 | if (it_states.name == it_commands.name) {
|
1034 |
| - for (size_t i = 0; i < it_states.interface_name_vec.size(); i++) { |
1035 |
| - if (it_commands.interface_name_vec.at(0) == it_states.interface_name_vec.at(i)) { |
1036 |
| - *it_commands.value_ptr_vec.at(0) = *it_states.value_ptr_vec.at(i); |
1037 |
| - RCLCPP_INFO_STREAM( |
1038 |
| - logger_, "Sync joint state to command (" << |
1039 |
| - it_commands.interface_name_vec.at(0).c_str() << ", " << |
1040 |
| - *it_commands.value_ptr_vec.at(0) << " <- " << |
1041 |
| - it_states.interface_name_vec.at(i).c_str() << ", " << |
1042 |
| - *it_states.value_ptr_vec.at(i)); |
1043 |
| - } |
| 1014 | + std::string pos_cmd_name = hardware_interface::HW_IF_POSITION; |
| 1015 | + std::string pos_dxl_name = ros2_to_dxl_cmd_map.count(pos_cmd_name) ? ros2_to_dxl_cmd_map.at(pos_cmd_name) : pos_cmd_name; |
| 1016 | + // Find index in command interfaces |
| 1017 | + auto cmd_it = std::find( |
| 1018 | + it_commands.interface_name_vec.begin(), |
| 1019 | + it_commands.interface_name_vec.end(), |
| 1020 | + pos_cmd_name); |
| 1021 | + if (cmd_it == it_commands.interface_name_vec.end()) { |
| 1022 | + RCLCPP_WARN_STREAM(logger_, "No position interface found in command interfaces for joint '" << it_commands.name << "'. Skipping sync!"); |
| 1023 | + continue; |
| 1024 | + } |
| 1025 | + size_t cmd_idx = std::distance(it_commands.interface_name_vec.begin(), cmd_it); |
| 1026 | + // Find index in state interfaces |
| 1027 | + auto state_it = std::find( |
| 1028 | + it_states.interface_name_vec.begin(), |
| 1029 | + it_states.interface_name_vec.end(), |
| 1030 | + pos_cmd_name); |
| 1031 | + if (state_it == it_states.interface_name_vec.end()) { |
| 1032 | + RCLCPP_WARN_STREAM(logger_, "No position interface found in state interfaces for joint '" << it_states.name << "'. Skipping sync!"); |
| 1033 | + continue; |
1044 | 1034 | }
|
| 1035 | + size_t state_idx = std::distance(it_states.interface_name_vec.begin(), state_it); |
| 1036 | + // Sync the value |
| 1037 | + *it_commands.value_ptr_vec.at(cmd_idx) = *it_states.value_ptr_vec.at(state_idx); |
| 1038 | + RCLCPP_INFO_STREAM( |
| 1039 | + logger_, "Sync joint state to command (joint: " << it_states.name << ", " << |
| 1040 | + it_commands.interface_name_vec.at(cmd_idx).c_str() << ", " << |
| 1041 | + *it_commands.value_ptr_vec.at(cmd_idx) << " <- " << |
| 1042 | + it_states.interface_name_vec.at(state_idx).c_str() << ", " << |
| 1043 | + *it_states.value_ptr_vec.at(state_idx)); |
1045 | 1044 | }
|
1046 | 1045 | }
|
1047 | 1046 | }
|
|
0 commit comments