abstract_dxl_driver.cpp
Go to the documentation of this file.
1 /*
2  abstract_motor_driver.cpp
3  Copyright (C) 2020 Niryo
4  All rights reserved.
5  This program is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9  This program is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13  You should have received a copy of the GNU General Public License
14  along with this program. If not, see <http:// www.gnu.org/licenses/>.
15 */
16 
18 
19 #include "common/model/dxl_command_type_enum.hpp"
20 #include "common/model/single_motor_cmd.hpp"
21 
22 #include <cassert>
23 #include <memory>
24 #include <ros/ros.h>
25 #include <string>
26 #include <utility>
27 #include <vector>
28 
29 using ::common::model::EDxlCommandType;
30 
31 namespace ttl_driver
32 {
33 
37 AbstractDxlDriver::AbstractDxlDriver(std::shared_ptr<dynamixel::PortHandler> portHandler, std::shared_ptr<dynamixel::PacketHandler> packetHandler)
38  : AbstractMotorDriver(std::move(portHandler), std::move(packetHandler))
39 {
40 }
41 
42 std::string AbstractDxlDriver::str() const { return "Dynamixel Driver (" + AbstractMotorDriver::str() + ")"; }
43 
48 int AbstractDxlDriver::writeSingleCmd(const std::unique_ptr<common::model::AbstractTtlSingleMotorCmd> &cmd)
49 {
50  if (cmd && cmd->isValid() && cmd->isDxlCmd())
51  {
52  switch (EDxlCommandType(cmd->getCmdType()))
53  {
54  case EDxlCommandType::CMD_TYPE_VELOCITY:
55  return writeVelocityGoal(cmd->getId(), cmd->getParam());
56  case EDxlCommandType::CMD_TYPE_POSITION:
57  return writePositionGoal(cmd->getId(), cmd->getParam());
58  case EDxlCommandType::CMD_TYPE_EFFORT:
59  return writeTorqueGoal(cmd->getId(), static_cast<uint16_t>(cmd->getParam()));
60  case EDxlCommandType::CMD_TYPE_TORQUE:
61  return writeTorquePercentage(cmd->getId(), static_cast<uint8_t>(cmd->getParam()));
62  case EDxlCommandType::CMD_TYPE_LEARNING_MODE:
63  return writeTorquePercentage(cmd->getId(), static_cast<uint8_t>(!cmd->getParam()));
64  case EDxlCommandType::CMD_TYPE_PING:
65  return ping(cmd->getId());
66  case EDxlCommandType::CMD_TYPE_PID:
67  {
68  std::vector<uint16_t> params_conv;
69  for (auto p : cmd->getParams())
70  {
71  params_conv.emplace_back(static_cast<uint16_t>(p));
72  }
73  return writePID(cmd->getId(), params_conv);
74  }
75  case EDxlCommandType::CMD_TYPE_PROFILE:
76  return writeVelocityProfile(cmd->getId(), cmd->getParams());
77  case EDxlCommandType::CMD_TYPE_CONTROL_MODE:
78  return writeControlMode(cmd->getId(), static_cast<uint8_t>(cmd->getParam()));
79  case EDxlCommandType::CMD_TYPE_LED_STATE:
80  return writeLed(cmd->getId(), static_cast<uint8_t>(cmd->getParam()));
81  case EDxlCommandType::CMD_TYPE_STARTUP:
82  return writeStartupConfiguration(cmd->getId(), static_cast<uint8_t>(cmd->getParam()));
83  case EDxlCommandType::CMD_TYPE_TEMPERATURE_LIMIT:
84  return writeTemperatureLimit(cmd->getId(), static_cast<uint8_t>(cmd->getParam()));
85  case EDxlCommandType::CMD_TYPE_SHUTDOWN:
86  return writeShutdownConfiguration(cmd->getId(), static_cast<uint8_t>(cmd->getParam()));
87  default:
88  std::cout << "Command not implemented " << cmd->getCmdType() << std::endl;
89  }
90  }
91 
92  std::cout << "AbstractDxlDriver::writeSingleCmd : Command not validated: " << cmd->str() << std::endl;
93  return COMM_RX_CORRUPT;
94 }
95 
102 int AbstractDxlDriver::writeSyncCmd(int type, const std::vector<uint8_t> &ids, const std::vector<uint32_t> &params)
103 {
104  assert(!ids.empty() && "AbstractDxlDriver::writeSyncCmd: ids is empty");
105  assert(!params.empty() && "AbstractDxlDriver::writeSyncCmd: params is empty");
106 
107  switch (EDxlCommandType(type))
108  {
109  case EDxlCommandType::CMD_TYPE_POSITION:
110  return syncWritePositionGoal(ids, params);
111  case EDxlCommandType::CMD_TYPE_VELOCITY:
112  return syncWriteVelocityGoal(ids, params);
113  case EDxlCommandType::CMD_TYPE_EFFORT:
114  {
115  std::vector<uint16_t> params_conv;
116  params_conv.reserve(params.size());
117  for (auto const &p : params)
118  {
119  params_conv.emplace_back(static_cast<uint16_t>(p));
120  }
121  return syncWriteTorqueGoal(ids, params_conv);
122  }
123  case EDxlCommandType::CMD_TYPE_TORQUE:
124  {
125  std::vector<uint8_t> params_conv;
126  params_conv.reserve(params.size());
127  for (auto const &p : params)
128  {
129  params_conv.emplace_back(static_cast<uint8_t>(p));
130  }
131  return syncWriteTorquePercentage(ids, params_conv);
132  }
133  case EDxlCommandType::CMD_TYPE_LEARNING_MODE:
134  {
135  std::vector<uint8_t> params_inv;
136  params_inv.reserve(params.size());
137  for (auto const &p : params)
138  {
139  params_inv.emplace_back(!p);
140  }
141  return syncWriteTorquePercentage(ids, params_inv);
142  }
143  default:
144  std::cout << "Command not implemented " << type << std::endl;
145  }
146 
147  std::cout << "AbstractDxlDriver::writeSyncCmd : Command not validated: " << type << std::endl;
148  return -1;
149 }
150 
151 } // namespace ttl_driver
ttl_driver::AbstractDxlDriver::writeLed
virtual int writeLed(uint8_t id, uint8_t led_value)=0
ttl_driver::AbstractTtlDriver::ping
virtual int ping(uint8_t id)
AbstractTtlDriver::ping.
Definition: abstract_ttl_driver.cpp:48
ttl_driver::AbstractDxlDriver::writeTemperatureLimit
virtual int writeTemperatureLimit(uint8_t id, uint8_t temperature_limit)=0
ttl_driver::AbstractMotorDriver::syncWritePositionGoal
virtual int syncWritePositionGoal(const std::vector< uint8_t > &id_list, const std::vector< uint32_t > &position_list)=0
ttl_driver::AbstractDxlDriver::writeSingleCmd
int writeSingleCmd(const std::unique_ptr< common::model::AbstractTtlSingleMotorCmd > &cmd) override
AbstractDxlDriver::writeSingleCmd.
Definition: abstract_dxl_driver.cpp:48
ttl_driver::AbstractMotorDriver::writeControlMode
virtual int writeControlMode(uint8_t id, uint8_t mode)=0
ttl_driver::AbstractDxlDriver::writeShutdownConfiguration
virtual int writeShutdownConfiguration(uint8_t id, uint8_t configuration)=0
ttl_driver::AbstractDxlDriver::AbstractDxlDriver
AbstractDxlDriver()=default
abstract_dxl_driver.hpp
ttl_driver::AbstractMotorDriver::writeVelocityProfile
virtual int writeVelocityProfile(uint8_t id, const std::vector< uint32_t > &data_list)=0
ttl_driver::AbstractMotorDriver::writePositionGoal
virtual int writePositionGoal(uint8_t id, uint32_t position)=0
ttl_driver
Definition: abstract_dxl_driver.hpp:30
ttl_driver::AbstractMotorDriver
The XDriver class.
Definition: abstract_motor_driver.hpp:38
ttl_driver::AbstractDxlDriver::writeStartupConfiguration
virtual int writeStartupConfiguration(uint8_t id, uint8_t config)=0
ttl_driver::AbstractMotorDriver::str
std::string str() const override
AbstractMotorDriver::str.
Definition: abstract_motor_driver.cpp:44
ttl_driver::AbstractDxlDriver::writePID
virtual int writePID(uint8_t id, const std::vector< uint16_t > &data)=0
ttl_driver::AbstractDxlDriver::str
std::string str() const override
AbstractTtlDriver::str : build a string describing the object. For debug purpose only.
Definition: abstract_dxl_driver.cpp:42
ttl_driver::AbstractMotorDriver::syncWriteVelocityGoal
virtual int syncWriteVelocityGoal(const std::vector< uint8_t > &id_list, const std::vector< uint32_t > &velocity_list)=0
ttl_driver::AbstractDxlDriver::writeTorqueGoal
virtual int writeTorqueGoal(uint8_t id, uint16_t torque)=0
ttl_driver::AbstractDxlDriver::writeSyncCmd
int writeSyncCmd(int type, const std::vector< uint8_t > &ids, const std::vector< uint32_t > &params) override
AbstractDxlDriver::writeSyncCmd.
Definition: abstract_dxl_driver.cpp:102
ttl_driver::AbstractMotorDriver::writeTorquePercentage
virtual int writeTorquePercentage(uint8_t id, uint8_t torque_percentage)=0
ttl_driver::AbstractDxlDriver::syncWriteTorqueGoal
virtual int syncWriteTorqueGoal(const std::vector< uint8_t > &id_list, const std::vector< uint16_t > &torque_list)=0
ttl_driver::AbstractMotorDriver::syncWriteTorquePercentage
virtual int syncWriteTorquePercentage(const std::vector< uint8_t > &id_list, const std::vector< uint8_t > &torque_percentage_list)=0
ttl_driver::AbstractMotorDriver::writeVelocityGoal
virtual int writeVelocityGoal(uint8_t id, uint32_t velocity)=0


ttl_driver
Author(s): Clement Cocquempot
autogenerated on Wed May 21 2025 08:30:14