stepper_driver.hpp
Go to the documentation of this file.
1 /*
2 stepper_driver.hpp
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 
17 #ifndef STEPPER_DRIVER_HPP
18 #define STEPPER_DRIVER_HPP
19 
20 #include <memory>
21 #include <vector>
22 #include <string>
23 #include <iostream>
24 #include <sstream>
25 #include "ros/duration.h"
26 
28 
29 #include "stepper_reg.hpp"
30 
31 namespace ttl_driver
32 {
33 
37  template <typename reg_type = StepperReg>
39  {
40  public:
41  StepperDriver(std::shared_ptr<dynamixel::PortHandler> portHandler,
42  std::shared_ptr<dynamixel::PacketHandler> packetHandler);
43 
44  public:
45  // AbstractTtlDriver interface
46  std::string str() const override;
47 
48  int checkModelNumber(uint8_t id) override;
49  int readFirmwareVersion(uint8_t id, std::string &version) override;
50 
51  int readTemperature(uint8_t id, uint8_t &temperature) override;
52  int readVoltage(uint8_t id, double &voltage) override;
53  int readHwErrorStatus(uint8_t id, uint8_t &hardware_error_status) override;
54 
55  int syncReadFirmwareVersion(const std::vector<uint8_t> &id_list, std::vector<std::string> &firmware_list) override;
56  int syncReadTemperature(const std::vector<uint8_t> &id_list, std::vector<uint8_t> &temperature_list) override;
57  int syncReadVoltage(const std::vector<uint8_t> &id_list, std::vector<double> &voltage_list) override;
58  int syncReadRawVoltage(const std::vector<uint8_t> &id_list, std::vector<double> &voltage_list) override;
59  int syncReadHwStatus(const std::vector<uint8_t> &id_list, std::vector<std::pair<double, uint8_t>> &data_list) override;
60 
61  int syncReadHwErrorStatus(const std::vector<uint8_t> &id_list, std::vector<uint8_t> &hw_error_list) override;
62 
63  public:
64  // AbstractMotorDriver interface : we cannot define them globally in AbstractMotorDriver
65  // as it is needed here for polymorphism (AbstractMotorDriver cannot be a template class and does not
66  // have access to reg_type). So it seems like a duplicate of DxlDriver
67 
68  int changeId(uint8_t id, uint8_t new_id) override;
69 
70  int readMinPosition(uint8_t id, uint32_t &min_pos) override;
71  int readMaxPosition(uint8_t id, uint32_t &max_pos) override;
72 
73  int writeTorquePercentage(uint8_t id, uint8_t torque_enable) override;
74  int writePositionGoal(uint8_t id, uint32_t position) override;
75  int writeVelocityGoal(uint8_t id, uint32_t velocity) override;
76 
77  int syncWriteTorquePercentage(const std::vector<uint8_t> &id_list, const std::vector<uint8_t> &torque_percentage_list) override;
78  int syncWritePositionGoal(const std::vector<uint8_t> &id_list, const std::vector<uint32_t> &position_list) override;
79  int syncWriteVelocityGoal(const std::vector<uint8_t> &id_list, const std::vector<uint32_t> &velocity_list) override;
80 
81  // ram read
82  int readPosition(uint8_t id, uint32_t &present_position) override;
83  int readVelocity(uint8_t id, uint32_t &present_velocity) override;
84 
85  int syncReadPosition(const std::vector<uint8_t> &id_list, std::vector<uint32_t> &position_list) override;
86  int syncReadVelocity(const std::vector<uint8_t> &id_list, std::vector<uint32_t> &velocity_list) override;
87  int syncReadJointStatus(const std::vector<uint8_t> &id_list, std::vector<std::array<uint32_t, 2>> &data_array_list) override;
88 
89  // AbstractStepperDriver interface
90  public:
91  int readControlMode(uint8_t id, uint8_t &operating_mode) override;
92  int writeControlMode(uint8_t id, uint8_t operating_mode);
93 
94  int readVelocityProfile(uint8_t id, std::vector<uint32_t> &data_list) override;
95  int writeVelocityProfile(uint8_t id, const std::vector<uint32_t> &data_list) override;
96 
97  int startHoming(uint8_t id) override;
98  int writeHomingSetup(uint8_t id, uint8_t direction, uint8_t stall_threshold) override;
99 
100  int readHomingStatus(uint8_t id, uint8_t &status) override;
101  int syncReadHomingStatus(const std::vector<uint8_t> &id_list, std::vector<uint8_t> &status_list) override;
102 
103  int readFirmwareRunning(uint8_t id, bool &is_running) override;
104 
105  int syncReadHomingAbsPosition(const std::vector<uint8_t> &id_list, std::vector<uint32_t> &abs_position) override;
106  int syncWriteHomingAbsPosition(const std::vector<uint8_t> &id_list, const std::vector<uint32_t> &abs_position) override;
107 
108  float velocityUnit() const;
109 
110  private:
111  int writeVStart(uint8_t id, uint32_t v_start);
112  int writeA1(uint8_t id, uint32_t a_1);
113  int writeV1(uint8_t id, uint32_t v_1);
114  int writeAMax(uint8_t id, uint32_t a_max);
115  int writeVMax(uint8_t id, uint32_t v_max);
116  int writeDMax(uint8_t id, uint32_t d_max);
117  int writeD1(uint8_t id, uint32_t d_1);
118  int writeVStop(uint8_t id, uint32_t v_stop);
119  };
120 
121  // definition of methods
122 
126  template <typename reg_type>
127  StepperDriver<reg_type>::StepperDriver(std::shared_ptr<dynamixel::PortHandler> portHandler,
128  std::shared_ptr<dynamixel::PacketHandler> packetHandler) : AbstractStepperDriver(std::move(portHandler),
129  std::move(packetHandler))
130  {
131  }
132 
133  //*****************************
134  // AbstractMotorDriver interface
135  //*****************************
136 
141  template <typename reg_type>
142  std::string StepperDriver<reg_type>::str() const
143  {
144  return common::model::HardwareTypeEnum(reg_type::motor_type).toString() + " : " + AbstractStepperDriver::str();
145  }
146 
153  template <typename reg_type>
154  int StepperDriver<reg_type>::changeId(uint8_t id, uint8_t new_id)
155  {
156  // TODO(THUC) verify that COMM_RX_TIMEOUT error code do not impact on data sent to motor
157  // when COMM_RX_TIMEOUT error, id changed also, so we consider that change id successfully
158  int res = write<typename reg_type::TYPE_ID>(reg_type::ADDR_ID, id, new_id);
159  if (res == COMM_RX_TIMEOUT)
160  res = COMM_SUCCESS;
161  return res;
162  }
163 
169  template <typename reg_type>
171  {
172  uint16_t model_number = 0;
173  int ping_result = getModelNumber(id, model_number);
174 
175  if (ping_result == COMM_SUCCESS)
176  {
177  if (model_number && model_number != reg_type::MODEL_NUMBER)
178  {
179  return PING_WRONG_MODEL_NUMBER;
180  }
181  }
182 
183  return ping_result;
184  }
185 
192  template <typename reg_type>
193  int StepperDriver<reg_type>::readFirmwareVersion(uint8_t id, std::string &version)
194  {
195  int res = 0;
196  uint32_t data{};
197  res = read<typename reg_type::TYPE_FIRMWARE_VERSION>(reg_type::ADDR_FIRMWARE_VERSION, id, data);
198  version = interpretFirmwareVersion(data);
199  return res;
200  }
201 
208  template <typename reg_type>
209  int StepperDriver<reg_type>::readMinPosition(uint8_t id, uint32_t &pos)
210  {
211  return read<typename reg_type::TYPE_MIN_POSITION_LIMIT>(reg_type::ADDR_MIN_POSITION_LIMIT, id, pos);
212  }
213 
220  template <typename reg_type>
221  int StepperDriver<reg_type>::readMaxPosition(uint8_t id, uint32_t &pos)
222  {
223  return read<typename reg_type::TYPE_MAX_POSITION_LIMIT>(reg_type::ADDR_MAX_POSITION_LIMIT, id, pos);
224  }
225 
226  // ram write
227 
234  template <typename reg_type>
235  int StepperDriver<reg_type>::writeTorquePercentage(uint8_t id, uint8_t torque_percentage)
236  {
237  auto torque_enable = torque_percentage > 0 ? 1 : 0;
238  return write<typename reg_type::TYPE_TORQUE_ENABLE>(reg_type::ADDR_TORQUE_ENABLE, id, torque_enable);
239  }
240 
247  template <typename reg_type>
248  int StepperDriver<reg_type>::writePositionGoal(uint8_t id, uint32_t position)
249  {
250  return write<typename reg_type::TYPE_GOAL_POSITION>(reg_type::ADDR_GOAL_POSITION, id, position);
251  }
252 
253  // according to the registers, the data should be an int32_t ?
260  template <typename reg_type>
261  int StepperDriver<reg_type>::writeVelocityGoal(uint8_t id, uint32_t velocity)
262  {
263  return write<typename reg_type::TYPE_GOAL_VELOCITY>(reg_type::ADDR_GOAL_VELOCITY, id, velocity);
264  }
265 
272  template <typename reg_type>
273  int StepperDriver<reg_type>::syncWriteTorquePercentage(const std::vector<uint8_t> &id_list, const std::vector<uint8_t> &torque_percentage_list)
274  {
275  std::vector<uint8_t> torque_enable_list;
276  for(const auto &torque_percentage : torque_percentage_list)
277  {
278  auto torque_enable = torque_percentage > 0 ? 1 : 0;
279  torque_enable_list.push_back(torque_enable);
280  }
281  return syncWrite<typename reg_type::TYPE_TORQUE_ENABLE>(reg_type::ADDR_TORQUE_ENABLE, id_list, torque_enable_list);
282  }
283 
290  template <typename reg_type>
291  int StepperDriver<reg_type>::syncWritePositionGoal(const std::vector<uint8_t> &id_list, const std::vector<uint32_t> &position_list)
292  {
293  return syncWrite<typename reg_type::TYPE_GOAL_POSITION>(reg_type::ADDR_GOAL_POSITION, id_list, position_list);
294  }
295 
302  template <typename reg_type>
303  int StepperDriver<reg_type>::syncWriteVelocityGoal(const std::vector<uint8_t> &id_list, const std::vector<uint32_t> &velocity_list)
304  {
305  return syncWrite<typename reg_type::TYPE_GOAL_VELOCITY>(reg_type::ADDR_GOAL_VELOCITY, id_list, velocity_list);
306  }
307 
308  // ram read
309 
316  template <typename reg_type>
317  int StepperDriver<reg_type>::readPosition(uint8_t id, uint32_t &present_position)
318  {
319  return read<typename reg_type::TYPE_PRESENT_POSITION>(reg_type::ADDR_PRESENT_POSITION, id, present_position);
320  }
321 
328  template <typename reg_type>
329  int StepperDriver<reg_type>::readVelocity(uint8_t id, uint32_t &present_velocity)
330  {
331  return read<typename reg_type::TYPE_PRESENT_VELOCITY>(reg_type::ADDR_PRESENT_VELOCITY, id, present_velocity);
332  }
333 
340  template <typename reg_type>
341  int StepperDriver<reg_type>::readTemperature(uint8_t id, uint8_t &temperature)
342  {
343  return read<typename reg_type::TYPE_PRESENT_TEMPERATURE>(reg_type::ADDR_PRESENT_TEMPERATURE, id, temperature);
344  }
345 
352  template <typename reg_type>
353  int StepperDriver<reg_type>::readVoltage(uint8_t id, double &voltage)
354  {
355  uint16_t voltage_mV = 0;
356  int res = read<typename reg_type::TYPE_PRESENT_VOLTAGE>(reg_type::ADDR_PRESENT_VOLTAGE, id, voltage_mV);
357  voltage = static_cast<double>(voltage_mV) / reg_type::VOLTAGE_CONVERSION;
358  return res;
359  }
360 
367  template <typename reg_type>
368  int StepperDriver<reg_type>::readHwErrorStatus(uint8_t id, uint8_t &hardware_error_status)
369  {
370  return read<typename reg_type::TYPE_HW_ERROR_STATUS>(reg_type::ADDR_HW_ERROR_STATUS, id, hardware_error_status);
371  }
372 
379  template <typename reg_type>
380  int StepperDriver<reg_type>::syncReadPosition(const std::vector<uint8_t> &id_list, std::vector<uint32_t> &position_list)
381  {
382  return syncRead<typename reg_type::TYPE_PRESENT_POSITION>(reg_type::ADDR_PRESENT_POSITION, id_list, position_list);
383  }
384 
391  template <typename reg_type>
392  int StepperDriver<reg_type>::syncReadVelocity(const std::vector<uint8_t> &id_list, std::vector<uint32_t> &velocity_list)
393  {
394  return syncRead<typename reg_type::TYPE_PRESENT_VELOCITY>(reg_type::ADDR_PRESENT_VELOCITY, id_list, velocity_list);
395  }
396 
404  template <typename reg_type>
405  int StepperDriver<reg_type>::syncReadJointStatus(const std::vector<uint8_t> &id_list,
406  std::vector<std::array<uint32_t, 2>> &data_array_list)
407  {
408  int res = COMM_TX_FAIL;
409 
410  if (id_list.empty())
411  return res;
412 
413  data_array_list.clear();
414 
415  // read torque enable on first id
416  typename reg_type::TYPE_TORQUE_ENABLE torque{1};
417  res = read<typename reg_type::TYPE_TORQUE_ENABLE>(reg_type::ADDR_TORQUE_ENABLE, id_list.at(0), torque);
418  if (COMM_SUCCESS != res)
419  std::cout << "#############"
420  " ERROR reading stepper torque in syncReadJointStatus (error "
421  << res << ")" << std::endl;
422 
423  // if torque on, read position and velocity
424  if (torque)
425  {
426  res = syncReadConsecutiveBytes<uint32_t, 2>(reg_type::ADDR_PRESENT_VELOCITY, id_list, data_array_list);
427  }
428  else // else read position only
429  {
430  std::vector<uint32_t> position_list;
431  res = syncReadPosition(id_list, position_list);
432  for (auto p : position_list)
433  data_array_list.emplace_back(std::array<uint32_t, 2>{1, p});
434  }
435 
436  return res;
437  }
438 
445  template <typename reg_type>
446  int StepperDriver<reg_type>::syncReadFirmwareVersion(const std::vector<uint8_t> &id_list, std::vector<std::string> &firmware_list)
447  {
448  int res = 0;
449  firmware_list.clear();
450  std::vector<uint32_t> data_list{};
451  res = syncRead<typename reg_type::TYPE_FIRMWARE_VERSION>(reg_type::ADDR_FIRMWARE_VERSION, id_list, data_list);
452  for (auto const &data : data_list)
453  firmware_list.emplace_back(interpretFirmwareVersion(data));
454  return res;
455  }
456 
463  template <typename reg_type>
464  int StepperDriver<reg_type>::syncReadTemperature(const std::vector<uint8_t> &id_list, std::vector<uint8_t> &temperature_list)
465  {
466  return syncRead<typename reg_type::TYPE_PRESENT_TEMPERATURE>(reg_type::ADDR_PRESENT_TEMPERATURE, id_list, temperature_list);
467  }
468 
475  template <typename reg_type>
476  int StepperDriver<reg_type>::syncReadVoltage(const std::vector<uint8_t> &id_list, std::vector<double> &voltage_list)
477  {
478  voltage_list.clear();
479  std::vector<uint16_t> v_read;
480  int res = syncRead<typename reg_type::TYPE_PRESENT_VOLTAGE>(reg_type::ADDR_PRESENT_VOLTAGE, id_list, v_read);
481  for (auto const &v : v_read)
482  voltage_list.emplace_back(static_cast<double>(v) / reg_type::VOLTAGE_CONVERSION);
483  return res;
484  }
485 
492  template <typename reg_type>
493  int StepperDriver<reg_type>::syncReadRawVoltage(const std::vector<uint8_t> &id_list, std::vector<double> &voltage_list)
494  {
495  voltage_list.clear();
496  std::vector<uint16_t> v_read;
497  int res = syncRead<typename reg_type::TYPE_PRESENT_VOLTAGE>(reg_type::ADDR_PRESENT_VOLTAGE, id_list, v_read);
498  for (auto const &v : v_read)
499  voltage_list.emplace_back(static_cast<double>(v));
500  return res;
501  }
502 
509  template <typename reg_type>
510  int StepperDriver<reg_type>::syncReadHwStatus(const std::vector<uint8_t> &id_list,
511  std::vector<std::pair<double, uint8_t>> &data_list)
512  {
513  data_list.clear();
514 
515  std::vector<std::array<uint8_t, 3>> raw_data;
516  int res = syncReadConsecutiveBytes<uint8_t, 3>(reg_type::ADDR_PRESENT_VOLTAGE, id_list, raw_data);
517 
518  for (auto const &data : raw_data)
519  {
520  // Voltage is first reg, uint16
521  auto v = static_cast<uint16_t>((static_cast<uint16_t>(data.at(1)) << 8) | data.at(0)); // concatenate 2 bytes
522  auto voltage = static_cast<double>(v);
523 
524  // Temperature is second reg, uint8
525  uint8_t temperature = data.at(2);
526 
527  data_list.emplace_back(std::make_pair(voltage, temperature));
528  }
529 
530  return res;
531  }
538  template <typename reg_type>
539  int StepperDriver<reg_type>::syncReadHwErrorStatus(const std::vector<uint8_t> &id_list, std::vector<uint8_t> &hw_error_list)
540  {
541  return syncRead<typename reg_type::TYPE_HW_ERROR_STATUS>(reg_type::ADDR_HW_ERROR_STATUS, id_list, hw_error_list);
542  }
543 
544  //*****************************
545  // AbstractStepperDriver interface
546  //*****************************
547 
548  template <typename reg_type>
549  int StepperDriver<reg_type>::readControlMode(uint8_t id, uint8_t &operating_mode)
550  {
551  return read<typename reg_type::TYPE_OPERATING_MODE>(reg_type::ADDR_OPERATING_MODE, id, operating_mode);
552  }
553 
554  template <typename reg_type>
555  int StepperDriver<reg_type>::writeControlMode(uint8_t id, const uint8_t operating_mode)
556  {
557  return write<typename reg_type::TYPE_OPERATING_MODE>(reg_type::ADDR_OPERATING_MODE, id, operating_mode);
558  }
559 
566  template <typename reg_type>
567  int StepperDriver<reg_type>::readVelocityProfile(uint8_t id, std::vector<uint32_t> &data_list)
568  {
569  int res = COMM_RX_FAIL;
570  data_list.clear();
571 
572  std::vector<std::array<typename reg_type::TYPE_PROFILE, 8>> data_array_list;
573  if (COMM_SUCCESS == syncReadConsecutiveBytes<typename reg_type::TYPE_PROFILE, 8>(reg_type::ADDR_VSTART, {id}, data_array_list))
574  {
575  if (!data_array_list.empty())
576  {
577  auto block = data_array_list.at(0);
578 
579  for (auto data : block)
580  {
581  data_list.emplace_back(data);
582  }
583  }
584 
585  res = COMM_SUCCESS;
586  }
587  else
588  {
589  std::cout << "Failures during read Velocity Profile" << std::endl;
590  }
591 
592  return res;
593  }
594 
602  template <typename reg_type>
603  int StepperDriver<reg_type>::writeVelocityProfile(uint8_t id, const std::vector<uint32_t> &data_list)
604  {
605  int tries = 10;
606  int res = COMM_RX_FAIL;
607  double wait_duration = 0.05;
608 
609  // Random positive value to activate the torque, we need this to write on other registers
610  constexpr auto ACTIVE_TORQUE_PERCENT = 1;
611  writeTorquePercentage(id, ACTIVE_TORQUE_PERCENT);
612 
613  // only rewrite the params which is not success
614  while (tries > 0) // try 10 times
615  {
616  tries--;
617  ros::Duration(wait_duration).sleep();
618  res = writeVStart(id, data_list.at(0));
619  if (res == COMM_SUCCESS)
620  break;
621  }
622  if (res != COMM_SUCCESS)
623  return res;
624 
625  tries = 10;
626  while (tries > 0) // try 10 times
627  {
628  tries--;
629  ros::Duration(wait_duration).sleep();
630  res = writeA1(id, data_list.at(1));
631  if (res == COMM_SUCCESS)
632  break;
633  }
634  if (res != COMM_SUCCESS)
635  return res;
636 
637  tries = 10;
638  while (tries > 0) // try 10 times
639  {
640  tries--;
641  ros::Duration(wait_duration).sleep();
642  res = writeV1(id, data_list.at(2));
643  if (res == COMM_SUCCESS)
644  break;
645  }
646  if (res != COMM_SUCCESS)
647  return res;
648 
649  tries = 10;
650  while (tries > 0) // try 10 times
651  {
652  tries--;
653  ros::Duration(wait_duration).sleep();
654  res = writeAMax(id, data_list.at(3));
655  if (res == COMM_SUCCESS)
656  break;
657  }
658  if (res != COMM_SUCCESS)
659  return res;
660 
661  tries = 10;
662  while (tries > 0) // try 10 times
663  {
664  tries--;
665  ros::Duration(wait_duration).sleep();
666  res = writeVMax(id, data_list.at(4));
667  if (res == COMM_SUCCESS)
668  break;
669  }
670  if (res != COMM_SUCCESS)
671  return res;
672 
673  tries = 10;
674  while (tries > 0) // try 10 times
675  {
676  tries--;
677  ros::Duration(wait_duration).sleep();
678  res = writeDMax(id, data_list.at(5));
679  if (res == COMM_SUCCESS)
680  break;
681  }
682  if (res != COMM_SUCCESS)
683  return res;
684 
685  tries = 10;
686  while (tries > 0) // try 10 times
687  {
688  tries--;
689  ros::Duration(wait_duration).sleep();
690  res = writeD1(id, data_list.at(6));
691  if (res == COMM_SUCCESS)
692  break;
693  }
694  if (res != COMM_SUCCESS)
695  return res;
696 
697  tries = 10;
698  while (tries > 0) // try 10 times
699  {
700  tries--;
701  ros::Duration(wait_duration).sleep();
702  res = writeVStop(id, data_list.at(7));
703  if (res == COMM_SUCCESS)
704  break;
705  }
706 
707  return res;
708  }
709 
715  template <typename reg_type>
717  {
718  return write<typename reg_type::TYPE_COMMAND>(reg_type::ADDR_COMMAND, id, 0);
719  }
720 
729  template <typename reg_type>
730  int StepperDriver<reg_type>::writeHomingSetup(uint8_t id, uint8_t direction, uint8_t stall_threshold)
731  {
732  int res = 0;
733  double wait_duration = 0.05;
734 
735  // Random positive value to activate the torque, we need this to write on other registers
736  constexpr auto ACTIVE_TORQUE_PERCENT = 1;
737  writeTorquePercentage(id, ACTIVE_TORQUE_PERCENT);
738  ros::Duration(wait_duration).sleep();
739 
740  if (COMM_SUCCESS != write<typename reg_type::TYPE_HOMING_DIRECTION>(reg_type::ADDR_HOMING_DIRECTION, id, direction))
741  res++;
742  ros::Duration(wait_duration).sleep();
743 
744  // if (COMM_SUCCESS != write<typename reg_type::TYPE_HOMING_STALL_THRESHOLD>(reg_type::ADDR_HOMING_STALL_THRESHOLD, id, stall_threshold))
745  // res++;
746  // ros::Duration(wait_duration).sleep();
747 
748  if (res > 0)
749  {
750  std::cout << "Failures during writeVelocityProfile : " << res << std::endl;
751  return COMM_TX_FAIL;
752  }
753 
754  return COMM_SUCCESS;
755  }
756 
763  template <typename reg_type>
764  int StepperDriver<reg_type>::readHomingStatus(uint8_t id, uint8_t &status)
765  {
766  return read<typename reg_type::TYPE_HOMING_STATUS>(reg_type::ADDR_HOMING_STATUS, id, status);
767  }
768 
775  template <typename reg_type>
776  int StepperDriver<reg_type>::syncReadHomingStatus(const std::vector<uint8_t> &id_list, std::vector<uint8_t> &status_list)
777  {
778  return syncRead<typename reg_type::TYPE_HOMING_STATUS>(reg_type::ADDR_HOMING_STATUS, id_list, status_list);
779  }
780 
787  template <typename reg_type>
788  int StepperDriver<reg_type>::readFirmwareRunning(uint8_t id, bool &is_running)
789  {
790  typename reg_type::TYPE_FIRMWARE_RUNNING data{};
791  int res = read<typename reg_type::TYPE_FIRMWARE_RUNNING>(reg_type::ADDR_FIRMWARE_RUNNING, id, data);
792  is_running = data;
793  return res;
794  }
795 
802  template <typename reg_type>
803  int StepperDriver<reg_type>::syncWriteHomingAbsPosition(const std::vector<uint8_t> &id_list, const std::vector<uint32_t> &abs_position)
804  {
805  return syncWrite<typename reg_type::TYPE_HOMING_ABS_POSITION>(reg_type::ADDR_HOMING_ABS_POSITION, id_list, abs_position);
806  }
807 
814  template <typename reg_type>
815  int StepperDriver<reg_type>::syncReadHomingAbsPosition(const std::vector<uint8_t> &id_list, std::vector<uint32_t> &abs_position)
816  {
817  return syncRead<typename reg_type::TYPE_HOMING_ABS_POSITION>(reg_type::ADDR_HOMING_ABS_POSITION, id_list, abs_position);
818  }
819 
820  // private
821 
828  template <typename reg_type>
829  int StepperDriver<reg_type>::writeVStart(uint8_t id, uint32_t v_start)
830  {
831  return write<typename reg_type::TYPE_PROFILE>(reg_type::ADDR_VSTART, id, v_start);
832  }
833 
840  template <typename reg_type>
841  int StepperDriver<reg_type>::writeA1(uint8_t id, uint32_t a_1)
842  {
843  return write<typename reg_type::TYPE_PROFILE>(reg_type::ADDR_A1, id, a_1);
844  }
845 
852  template <typename reg_type>
853  int StepperDriver<reg_type>::writeV1(uint8_t id, uint32_t v_1)
854  {
855  return write<typename reg_type::TYPE_PROFILE>(reg_type::ADDR_V1, id, v_1);
856  }
857 
864  template <typename reg_type>
865  int StepperDriver<reg_type>::writeAMax(uint8_t id, uint32_t a_max)
866  {
867  return write<typename reg_type::TYPE_PROFILE>(reg_type::ADDR_AMAX, id, a_max);
868  }
869 
876  template <typename reg_type>
877  int StepperDriver<reg_type>::writeVMax(uint8_t id, uint32_t v_max)
878  {
879  return write<typename reg_type::TYPE_PROFILE>(reg_type::ADDR_VMAX, id, v_max);
880  }
881 
888  template <typename reg_type>
889  int StepperDriver<reg_type>::writeDMax(uint8_t id, uint32_t d_max)
890  {
891  return write<typename reg_type::TYPE_PROFILE>(reg_type::ADDR_DMAX, id, d_max);
892  }
893 
900  template <typename reg_type>
901  int StepperDriver<reg_type>::writeD1(uint8_t id, uint32_t d_1)
902  {
903  return write<typename reg_type::TYPE_PROFILE>(reg_type::ADDR_D1, id, d_1);
904  }
905 
912  template <typename reg_type>
913  int StepperDriver<reg_type>::writeVStop(uint8_t id, uint32_t v_stop)
914  {
915  return write<typename reg_type::TYPE_PROFILE>(reg_type::ADDR_VSTOP, id, v_stop);
916  }
917 
918  template <typename reg_type>
920  {
921  return reg_type::VELOCITY_UNIT;
922  }
923 
924 } // ttl_driver
925 
926 #endif // STEPPER_DRIVER_HPP
ttl_driver::StepperDriver
The StepperDriver class.
Definition: stepper_driver.hpp:38
ttl_driver::StepperDriver::syncReadPosition
int syncReadPosition(const std::vector< uint8_t > &id_list, std::vector< uint32_t > &position_list) override
StepperDriver<reg_type>::syncReadPosition.
Definition: stepper_driver.hpp:380
ttl_driver::StepperDriver::readTemperature
int readTemperature(uint8_t id, uint8_t &temperature) override
StepperDriver<reg_type>::readTemperature.
Definition: stepper_driver.hpp:341
ttl_driver::StepperDriver::syncReadRawVoltage
int syncReadRawVoltage(const std::vector< uint8_t > &id_list, std::vector< double > &voltage_list) override
StepperDriver<reg_type>::syncReadRawVoltage.
Definition: stepper_driver.hpp:493
ttl_driver::AbstractStepperDriver::str
std::string str() const override
AbstractStepperDriver::str.
Definition: abstract_stepper_driver.cpp:48
ttl_driver::StepperDriver::syncReadVoltage
int syncReadVoltage(const std::vector< uint8_t > &id_list, std::vector< double > &voltage_list) override
StepperDriver<reg_type>::syncReadVoltage.
Definition: stepper_driver.hpp:476
ttl_driver::StepperDriver::writeVelocityGoal
int writeVelocityGoal(uint8_t id, uint32_t velocity) override
StepperDriver<reg_type>::writeVelocityGoal.
Definition: stepper_driver.hpp:261
ttl_driver::StepperDriver::StepperDriver
StepperDriver(std::shared_ptr< dynamixel::PortHandler > portHandler, std::shared_ptr< dynamixel::PacketHandler > packetHandler)
DxlDriver<reg_type>::DxlDriver.
Definition: stepper_driver.hpp:127
ttl_driver::StepperDriver::syncWritePositionGoal
int syncWritePositionGoal(const std::vector< uint8_t > &id_list, const std::vector< uint32_t > &position_list) override
StepperDriver<reg_type>::syncWritePositionGoal.
Definition: stepper_driver.hpp:291
ttl_driver::StepperDriver::readVoltage
int readVoltage(uint8_t id, double &voltage) override
StepperDriver<reg_type>::readVoltage.
Definition: stepper_driver.hpp:353
ttl_driver::StepperDriver::writeVMax
int writeVMax(uint8_t id, uint32_t v_max)
StepperDriver<reg_type>::writeVMax.
Definition: stepper_driver.hpp:877
ttl_driver::StepperDriver::writeAMax
int writeAMax(uint8_t id, uint32_t a_max)
StepperDriver<reg_type>::writeAMax.
Definition: stepper_driver.hpp:865
ttl_driver::StepperDriver::syncReadJointStatus
int syncReadJointStatus(const std::vector< uint8_t > &id_list, std::vector< std::array< uint32_t, 2 >> &data_array_list) override
StepperDriver<reg_type>::syncReadJointStatus.
Definition: stepper_driver.hpp:405
stepper_reg.hpp
ttl_driver::StepperDriver::writeVStop
int writeVStop(uint8_t id, uint32_t v_stop)
StepperDriver<reg_type>::writeVStop.
Definition: stepper_driver.hpp:913
ttl_driver::StepperDriver::writeHomingSetup
int writeHomingSetup(uint8_t id, uint8_t direction, uint8_t stall_threshold) override
StepperDriver<reg_type>::writeHomingDirection.
Definition: stepper_driver.hpp:730
ttl_driver::StepperDriver::writeVStart
int writeVStart(uint8_t id, uint32_t v_start)
StepperDriver<reg_type>::writeVStart.
Definition: stepper_driver.hpp:829
ttl_driver::StepperDriver::writeDMax
int writeDMax(uint8_t id, uint32_t d_max)
StepperDriver<reg_type>::writeDMax.
Definition: stepper_driver.hpp:889
ttl_driver::StepperDriver::writePositionGoal
int writePositionGoal(uint8_t id, uint32_t position) override
StepperDriver<reg_type>::writePositionGoal.
Definition: stepper_driver.hpp:248
abstract_stepper_driver.hpp
ttl_driver::StepperDriver::readFirmwareVersion
int readFirmwareVersion(uint8_t id, std::string &version) override
StepperDriver<reg_type>::readFirmwareVersion.
Definition: stepper_driver.hpp:193
ttl_driver::StepperDriver::changeId
int changeId(uint8_t id, uint8_t new_id) override
StepperDriver<reg_type>::changeId.
Definition: stepper_driver.hpp:154
ttl_driver::StepperDriver::readHomingStatus
int readHomingStatus(uint8_t id, uint8_t &status) override
StepperDriver<reg_type>::readHomingStatus.
Definition: stepper_driver.hpp:764
ttl_driver::StepperDriver::writeA1
int writeA1(uint8_t id, uint32_t a_1)
StepperDriver<reg_type>::writeA1.
Definition: stepper_driver.hpp:841
ttl_driver::StepperDriver::readVelocityProfile
int readVelocityProfile(uint8_t id, std::vector< uint32_t > &data_list) override
StepperDriver::readVelocityProfile.
Definition: stepper_driver.hpp:567
ttl_driver::StepperDriver::velocityUnit
float velocityUnit() const
writeVelocityGoal: define the unit of the velocity in RPM
Definition: stepper_driver.hpp:919
ttl_driver
Definition: abstract_dxl_driver.hpp:30
ttl_driver::StepperDriver::checkModelNumber
int checkModelNumber(uint8_t id) override
StepperDriver<reg_type>::checkModelNumber.
Definition: stepper_driver.hpp:170
ttl_driver::StepperDriver::syncReadFirmwareVersion
int syncReadFirmwareVersion(const std::vector< uint8_t > &id_list, std::vector< std::string > &firmware_list) override
StepperDriver<reg_type>::syncReadFirmwareVersion.
Definition: stepper_driver.hpp:446
ttl_driver::StepperDriver::readFirmwareRunning
int readFirmwareRunning(uint8_t id, bool &is_running) override
StepperDriver<reg_type>::readFirmwareRunning.
Definition: stepper_driver.hpp:788
ttl_driver::StepperDriver::syncReadHwStatus
int syncReadHwStatus(const std::vector< uint8_t > &id_list, std::vector< std::pair< double, uint8_t >> &data_list) override
StepperDriver<reg_type>::syncReadHwStatus.
Definition: stepper_driver.hpp:510
ttl_driver::StepperDriver::syncWriteTorquePercentage
int syncWriteTorquePercentage(const std::vector< uint8_t > &id_list, const std::vector< uint8_t > &torque_percentage_list) override
StepperDriver<reg_type>::syncWriteTorquePercentage.
Definition: stepper_driver.hpp:273
ttl_driver::StepperDriver::writeD1
int writeD1(uint8_t id, uint32_t d_1)
StepperDriver<reg_type>::writeD1.
Definition: stepper_driver.hpp:901
ttl_driver::AbstractStepperDriver
Definition: abstract_stepper_driver.hpp:34
ttl_driver::StepperDriver::syncWriteVelocityGoal
int syncWriteVelocityGoal(const std::vector< uint8_t > &id_list, const std::vector< uint32_t > &velocity_list) override
StepperDriver<reg_type>::syncWriteVelocityGoal.
Definition: stepper_driver.hpp:303
ttl_driver::StepperDriver::readMaxPosition
int readMaxPosition(uint8_t id, uint32_t &max_pos) override
StepperDriver<reg_type>::readMaxPosition.
Definition: stepper_driver.hpp:221
ttl_driver::StepperDriver::readMinPosition
int readMinPosition(uint8_t id, uint32_t &min_pos) override
StepperDriver<reg_type>::readMinPosition.
Definition: stepper_driver.hpp:209
ttl_driver::StepperDriver::syncReadHomingStatus
int syncReadHomingStatus(const std::vector< uint8_t > &id_list, std::vector< uint8_t > &status_list) override
StepperDriver<reg_type>::syncReadHomingStatus.
Definition: stepper_driver.hpp:776
ttl_driver::StepperDriver::readPosition
int readPosition(uint8_t id, uint32_t &present_position) override
StepperDriver<reg_type>::readPosition.
Definition: stepper_driver.hpp:317
ttl_driver::StepperDriver::syncWriteHomingAbsPosition
int syncWriteHomingAbsPosition(const std::vector< uint8_t > &id_list, const std::vector< uint32_t > &abs_position) override
StepperDriver<reg_type>::syncWriteHomingAbsPosition.
Definition: stepper_driver.hpp:803
ttl_driver::StepperDriver::syncReadTemperature
int syncReadTemperature(const std::vector< uint8_t > &id_list, std::vector< uint8_t > &temperature_list) override
StepperDriver<reg_type>::syncReadTemperature.
Definition: stepper_driver.hpp:464
ttl_driver::StepperDriver::str
std::string str() const override
StepperDriver<reg_type>::str.
Definition: stepper_driver.hpp:142
ttl_driver::StepperDriver::writeV1
int writeV1(uint8_t id, uint32_t v_1)
StepperDriver<reg_type>::writeV1.
Definition: stepper_driver.hpp:853
ttl_driver::StepperDriver::readControlMode
int readControlMode(uint8_t id, uint8_t &operating_mode) override
Definition: stepper_driver.hpp:549
ttl_driver::StepperDriver::readVelocity
int readVelocity(uint8_t id, uint32_t &present_velocity) override
StepperDriver<reg_type>::readVelocity.
Definition: stepper_driver.hpp:329
ttl_driver::StepperDriver::syncReadVelocity
int syncReadVelocity(const std::vector< uint8_t > &id_list, std::vector< uint32_t > &velocity_list) override
StepperDriver<reg_type>::syncReadVelocity.
Definition: stepper_driver.hpp:392
ttl_driver::StepperDriver::syncReadHwErrorStatus
int syncReadHwErrorStatus(const std::vector< uint8_t > &id_list, std::vector< uint8_t > &hw_error_list) override
StepperDriver<reg_type>::syncReadHwErrorStatus.
Definition: stepper_driver.hpp:539
ttl_driver::StepperDriver::writeVelocityProfile
int writeVelocityProfile(uint8_t id, const std::vector< uint32_t > &data_list) override
StepperDriver<reg_type>::writeVelocityProfile.
Definition: stepper_driver.hpp:603
ttl_driver::StepperDriver::syncReadHomingAbsPosition
int syncReadHomingAbsPosition(const std::vector< uint8_t > &id_list, std::vector< uint32_t > &abs_position) override
StepperDriver<reg_type>::syncReadHomingAbsPosition.
Definition: stepper_driver.hpp:815
ttl_driver::StepperDriver::readHwErrorStatus
int readHwErrorStatus(uint8_t id, uint8_t &hardware_error_status) override
StepperDriver<reg_type>::readHwErrorStatus.
Definition: stepper_driver.hpp:368
ttl_driver::StepperDriver::writeTorquePercentage
int writeTorquePercentage(uint8_t id, uint8_t torque_enable) override
StepperDriver<reg_type>::writeTorquePercentage.
Definition: stepper_driver.hpp:235
ttl_driver::StepperDriver::startHoming
int startHoming(uint8_t id) override
StepperDriver<reg_type>::startHoming.
Definition: stepper_driver.hpp:716
ttl_driver::StepperDriver::writeControlMode
int writeControlMode(uint8_t id, uint8_t operating_mode)
Definition: stepper_driver.hpp:555


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