7 #include <condition_variable>
13 #include "rclcpp/rclcpp.hpp"
46 :
MotorBase(), switching_state_(switching_state), monitor_mode_(true), state_switch_timeout_(5)
48 this->driver = driver;
121 template <
typename T,
typename... Args>
124 return mode_allocators_
125 .insert(std::make_pair(
127 [args..., mode,
this]()
129 if (isModeSupportedByDevice(mode)) registerMode(mode, ModeSharedPtr(new T(args...)));
151 double get_speed()
const {
return (
double)this->driver->universal_get_value<int32_t>(0x606C, 0); }
154 return (
double)this->driver->universal_get_value<int32_t>(0x6064, 0);
158 virtual bool isModeSupportedByDevice(uint16_t mode);
163 bool switchMode(uint16_t mode);
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_;
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_;
181 std::condition_variable mode_cond_;
182 std::mutex mode_mutex_;
184 const bool monitor_mode_;
185 const std::chrono::seconds state_switch_timeout_;
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;
@ 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
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
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