ros2_canopen  master
C++ ROS CANopen Library
motor.hpp
Go to the documentation of this file.
1 #ifndef MOTOR_HPP
2 #define MOTOR_HPP
3 
4 #include <algorithm>
5 #include <atomic>
6 #include <bitset>
7 #include <condition_variable>
8 #include <functional>
9 #include <iostream>
10 #include <limits>
11 #include <mutex>
12 #include <thread>
13 #include "rclcpp/rclcpp.hpp"
14 
19 
20 namespace ros2_canopen
21 {
22 
31 typedef ModeForwardHelper<
32  MotorBase::Velocity, int16_t, 0x6042, 0,
36 typedef ModeForwardHelper<
37  MotorBase::Interpolated_Position, int32_t, 0x60C1, 0x01,
40 
41 class Motor402 : public MotorBase
42 {
43 public:
45  std::shared_ptr<LelyDriverBridge> driver, ros2_canopen::State402::InternalState switching_state)
46  : MotorBase(), switching_state_(switching_state), monitor_mode_(true), state_switch_timeout_(5)
47  {
48  this->driver = driver;
49  }
50 
51  virtual bool setTarget(double val);
52  virtual bool enterModeAndWait(uint16_t mode);
53  virtual bool isModeSupported(uint16_t mode);
54  virtual uint16_t getMode();
55  bool readState();
56  void handleDiag();
65  bool handleInit();
73  void handleRead();
81  void handleWrite();
96  bool handleHalt();
97 
106 
121  template <typename T, typename... Args>
122  bool registerMode(uint16_t mode, Args &&... args)
123  {
124  return mode_allocators_
125  .insert(std::make_pair(
126  mode,
127  [args..., mode, this]()
128  {
129  if (isModeSupportedByDevice(mode)) registerMode(mode, ModeSharedPtr(new T(args...)));
130  }))
131  .second;
132  }
133 
138  virtual void registerDefaultModes()
139  {
140  registerMode<ProfiledPositionMode>(MotorBase::Profiled_Position, driver);
141  registerMode<VelocityMode>(MotorBase::Velocity, driver);
142  registerMode<ProfiledVelocityMode>(MotorBase::Profiled_Velocity, driver);
143  registerMode<ProfiledTorqueMode>(MotorBase::Profiled_Torque, driver);
144  registerMode<DefaultHomingMode>(MotorBase::Homing, driver);
145  registerMode<InterpolatedPositionMode>(MotorBase::Interpolated_Position, driver);
146  registerMode<CyclicSynchronousPositionMode>(MotorBase::Cyclic_Synchronous_Position, driver);
147  registerMode<CyclicSynchronousVelocityMode>(MotorBase::Cyclic_Synchronous_Velocity, driver);
148  registerMode<CyclicSynchronousTorqueMode>(MotorBase::Cyclic_Synchronous_Torque, driver);
149  }
150 
151  double get_speed() const { return (double)this->driver->universal_get_value<int32_t>(0x606C, 0); }
152  double get_position() const
153  {
154  return (double)this->driver->universal_get_value<int32_t>(0x6064, 0);
155  }
156 
157 private:
158  virtual bool isModeSupportedByDevice(uint16_t mode);
159  void registerMode(uint16_t id, const ModeSharedPtr & m);
160 
161  ModeSharedPtr allocMode(uint16_t mode);
162 
163  bool switchMode(uint16_t mode);
164  bool switchState(const State402::InternalState & target);
165 
166  std::atomic<uint16_t> status_word_;
167  uint16_t control_word_;
168  std::mutex cw_mutex_;
169  std::atomic<bool> start_fault_reset_;
170  std::atomic<State402::InternalState> target_state_;
171 
172  State402 state_handler_;
173 
174  std::mutex map_mutex_;
175  std::unordered_map<uint16_t, ModeSharedPtr> modes_;
176  typedef std::function<void()> AllocFuncType;
177  std::unordered_map<uint16_t, AllocFuncType> mode_allocators_;
178 
179  ModeSharedPtr selected_mode_;
180  uint16_t mode_id_;
181  std::condition_variable mode_cond_;
182  std::mutex mode_mutex_;
183  const State402::InternalState switching_state_;
184  const bool monitor_mode_;
185  const std::chrono::seconds state_switch_timeout_;
186 
187  std::shared_ptr<LelyDriverBridge> driver;
188  const uint16_t status_word_entry_index = 0x6041;
189  const uint16_t control_word_entry_index = 0x6040;
190  const uint16_t op_mode_display_index = 0x6061;
191  const uint16_t op_mode_index = 0x6060;
192  const uint16_t supported_drive_modes_index = 0x6502;
193 };
194 
195 } // namespace ros2_canopen
196 
197 #endif
@ CW_Operation_mode_specific1
Definition: command.hpp:48
@ CW_Operation_mode_specific0
Definition: command.hpp:47
@ CW_Operation_mode_specific2
Definition: command.hpp:49
Definition: mode_forward_helper.hpp:14
Definition: motor.hpp:42
Motor402(std::shared_ptr< LelyDriverBridge > driver, ros2_canopen::State402::InternalState switching_state)
Definition: motor.hpp:44
bool handleShutdown()
Shutdowns the drive.
bool handleHalt()
Executes a quickstop.
double get_position() const
Definition: motor.hpp:152
virtual bool isModeSupported(uint16_t mode)
Check if Operation Mode is supported.
bool handleInit()
Initialise the drive.
double get_speed() const
Definition: motor.hpp:151
bool handleRecover()
Recovers the device from fault.
virtual bool enterModeAndWait(uint16_t mode)
Enter Operation Mode.
void handleRead()
Read objects of the drive.
virtual bool setTarget(double val)
Set target.
virtual uint16_t getMode()
Get current Mode.
void handleWrite()
Writes objects to the drive.
virtual void registerDefaultModes()
Tries to register the standard operation modes defined in cia402.
Definition: motor.hpp:138
bool registerMode(uint16_t mode, Args &&... args)
Register a new operation mode for the drive.
Definition: motor.hpp:122
Motor Base Class.
Definition: base.hpp:16
@ Profiled_Velocity
Definition: base.hpp:26
@ Cyclic_Synchronous_Velocity
Definition: base.hpp:32
@ Cyclic_Synchronous_Torque
Definition: base.hpp:33
@ Cyclic_Synchronous_Position
Definition: base.hpp:31
@ Profiled_Position
Definition: base.hpp:24
@ Homing
Definition: base.hpp:29
@ Profiled_Torque
Definition: base.hpp:27
@ Interpolated_Position
Definition: base.hpp:30
@ Velocity
Definition: base.hpp:25
Definition: state.hpp:11
InternalState
Definition: state.hpp:33
Definition: configuration_manager.hpp:28
ModeForwardHelper< MotorBase::Cyclic_Synchronous_Position, int32_t, 0x607A, 0, 0 > CyclicSynchronousPositionMode
Definition: motor.hpp:26
std::shared_ptr< Mode > ModeSharedPtr
Definition: mode.hpp:28
ModeForwardHelper< MotorBase::Cyclic_Synchronous_Velocity, int32_t, 0x60FF, 0, 0 > CyclicSynchronousVelocityMode
Definition: motor.hpp:28
ModeForwardHelper< MotorBase::Profiled_Velocity, int32_t, 0x60FF, 0, 0 > ProfiledVelocityMode
Definition: motor.hpp:23
ModeForwardHelper< MotorBase::Profiled_Torque, int16_t, 0x6071, 0, 0 > ProfiledTorqueMode
Definition: motor.hpp:24
ModeForwardHelper< MotorBase::Cyclic_Synchronous_Torque, int16_t, 0x6071, 0, 0 > CyclicSynchronousTorqueMode
Definition: motor.hpp:30