18 #include "common/model/stepper_command_type_enum.hpp"
28 using ::common::model::EStepperCalibrationStatus;
29 using ::common::model::EStepperCommandType;
40 std::shared_ptr<dynamixel::PacketHandler> packetHandler)
60 if (cmd->isValid() && cmd->isStepperCmd())
62 switch (EStepperCommandType(cmd->getCmdType()))
64 case EStepperCommandType::CMD_TYPE_VELOCITY:
66 case EStepperCommandType::CMD_TYPE_POSITION:
68 case EStepperCommandType::CMD_TYPE_TORQUE:
70 case EStepperCommandType::CMD_TYPE_LEARNING_MODE:
72 case EStepperCommandType::CMD_TYPE_CALIBRATION:
74 case EStepperCommandType::CMD_TYPE_FACTORY_CALIBRATION:
76 case EStepperCommandType::CMD_TYPE_CALIBRATION_SETUP:
77 return writeHomingSetup(cmd->getId(),
static_cast<uint8_t
>(cmd->getParams().at(0)),
78 static_cast<uint8_t
>(cmd->getParams().at(1)));
79 case EStepperCommandType::CMD_TYPE_PING:
80 return ping(cmd->getId());
81 case EStepperCommandType::CMD_TYPE_CONVEYOR: {
82 std::vector<uint32_t> params = cmd->getParams();
89 uint32_t dir =
static_cast<uint32_t
>(cmd->getParams().at(2));
90 uint32_t speed_percent = std::clamp(
static_cast<uint32_t
>(cmd->getParams().at(1)), 0u, 100u);
94 ROS_INFO(
"AbstractStepperDriver::writeSingleCmd: speed = %d", speed);
97 case EStepperCommandType::CMD_TYPE_VELOCITY_PROFILE:
99 case EStepperCommandType::CMD_TYPE_OPERATING_MODE:
100 return writeControlMode(cmd->getId(),
static_cast<uint8_t
>(cmd->getParam()));
102 std::cout <<
"Command not implemented " << cmd->getCmdType() << std::endl;
106 std::cout <<
"AbstractStepperDriver::writeSingleCmd: Command not validated : " << cmd->str() << std::endl;
118 assert(!ids.empty() &&
"AbstractStepperDriver::writeSyncCmdwriteSyncCmd: ids is empty");
119 assert(!params.empty() &&
"AbstractStepperDriver::writeSyncCmdwriteSyncCmd: params is empty");
121 switch (EStepperCommandType(type))
123 case EStepperCommandType::CMD_TYPE_POSITION:
125 case EStepperCommandType::CMD_TYPE_VELOCITY:
127 case EStepperCommandType::CMD_TYPE_TORQUE: {
128 std::vector<uint8_t> params_conv;
129 params_conv.reserve(params.size());
130 for (
auto const &p : params)
132 params_conv.emplace_back(
static_cast<uint8_t
>(p));
136 case EStepperCommandType::CMD_TYPE_LEARNING_MODE: {
137 std::vector<uint8_t> params_inv;
138 params_inv.reserve(params.size());
139 for (
auto const &p : params)
141 params_inv.emplace_back(!p);
145 case EStepperCommandType::CMD_TYPE_WRITE_HOMING_ABS_POSITION:
148 std::cout <<
"Command not implemented " << type << std::endl;
151 std::cout <<
"AbstractStepperDriver::writeSyncCmd : Command not validated : " << type << std::endl;
162 auto v_major =
static_cast<uint8_t
>(fw_version >> 24);
163 auto v_minor =
static_cast<uint8_t
>((fw_version >> 16) & 0xFF);
164 auto v_patch =
static_cast<uint16_t
>(fw_version & 0xFFFF);
166 std::ostringstream ss;
167 ss << std::to_string(v_major) <<
"." << std::to_string(v_minor) <<
"." << std::to_string(v_patch);
168 std::string version = ss.str();
180 std::string hardware_message;
182 if (hw_state & 1 << 0)
184 hardware_message +=
"Input Voltage";
186 if (hw_state & 1 << 2)
188 if (!hardware_message.empty())
189 hardware_message +=
", ";
190 hardware_message +=
"OverHeating";
192 if (hw_state & 1 << 3)
194 if (!hardware_message.empty())
195 hardware_message +=
", ";
196 hardware_message +=
"Motor Encoder";
198 if (hw_state & 1 << 7)
200 if (!hardware_message.empty())
201 hardware_message +=
", ";
202 hardware_message +=
"Disconnection";
205 if (!hardware_message.empty())
206 hardware_message +=
" Error";
208 return hardware_message;
218 EStepperCalibrationStatus homing_status{ EStepperCalibrationStatus::UNINITIALIZED };
223 homing_status = EStepperCalibrationStatus::UNINITIALIZED;
226 homing_status = EStepperCalibrationStatus::IN_PROGRESS;
229 homing_status = EStepperCalibrationStatus::OK;
232 homing_status = EStepperCalibrationStatus::FAIL;
235 homing_status = EStepperCalibrationStatus::FAIL;
239 return homing_status;
249 ROS_WARN(
"AbstractStepperDriver::factoryCalibration - not implemented");
259 uint32_t unsigned_present_velocity = 0;
261 if (res != COMM_SUCCESS)
263 ROS_ERROR(
"AbstractStepperDriver::readConveyorVelocity: readVelocity failed with error %d", res);
269 int32_t present_velocity =
static_cast<int32_t
>(unsigned_present_velocity);
272 auto velocity_rpms = present_velocity * velocity_unit;
273 direction = present_velocity > 0 ? 1 : -1;
274 velocity_percent =
static_cast<int32_t
>(std::abs(velocity_rpms * 100 /
MAX_CONVEYOR_RPM));