fastcat 0.13.18
C++ EtherCAT Device Command & Control Library
Loading...
Searching...
No Matches
actuator.h
Go to the documentation of this file.
1#ifndef FASTCAT_ACTUATOR_H_
2#define FASTCAT_ACTUATOR_H_
3
4// Include related header (for cc files)
5
6// Include c then c++ libraries
7
8// Include external then project includes
9#include "fastcat/jsd/jsd_device_base.h"
10#include "fastcat/trap.h"
11#include "fastcat/ring_buffer.h"
12#include "jsd/jsd_elmo_common_types.h"
13#include "jsd/jsd_elmo_common.h"
14
15namespace fastcat
16{
35
40
56
61
66
67class Actuator : public JsdDeviceBase
68{
69 public:
70 Actuator();
71
72 bool ConfigFromYaml(const YAML::Node& node) override;
73 bool Read() override;
74 FaultType Process() override;
75 bool Write(DeviceCmd& cmd) override;
76 void Fault() override;
77 void Reset() override;
78 bool SetOutputPosition(double position);
79 bool HasAbsoluteEncoder();
80
83 explicit_interpolation_algorithm_ = algorithm;
84 }
85
88 explicit_interpolation_timestamp_source_ = source;
89 }
90
91 void SetExplicitInterpolationCyclesDelay(size_t cycles_delay) {
92 if(cycles_delay > 10) {
93 WARNING(
94 "cycles_delay must be <= 10 cycles, ignoring request to set cycles_delay to %zu",
95 cycles_delay
96 );
97 }
98 csp_cycles_delay_ = cycles_delay + 1;
99 }
100
101 void SetInterpolationCyclesStale(size_t cycles) {
102 csp_cycles_stale_ = cycles;
103 }
104
105 static std::string GetFastcatFaultCodeAsString(const DeviceState& state);
106 static std::string GetJSDFaultCodeAsString(const DeviceState& state);
107 static bool IsJsdFaultCodePresent(const DeviceState& state);
108 static double GetActualPosition(const DeviceState& state);
109
111 std::string actuator_type_str;
112 // TODO: populate ctrl_gs_mode_str from ctrl_gs_mode_ once JSD function is
113 // available.
114 std::string ctrl_gs_mode_str;
115 double gear_ratio = 1.0;
116 double counts_per_rev = 1.0;
133 int64_t elmo_crc = 0;
135 double smooth_factor = 0.0;
136 double torque_constant = 0.0;
137 double winding_resistance = 0.0;
138 double brake_power = 0.0;
141 bool prof_pos_hold = false;
142 };
143
144 const ActuatorParams& GetParams() { return params_; }
145
146 protected:
147 double CntsToEu(int32_t cnts);
148 double EuToCnts(double eu);
149 double PosCntsToEu(int32_t cnts);
150 int32_t PosEuToCnts(double eu);
151
154
156 FaultType ProcessProfPosTrapImpl();
157
158 double ComputeTargetPosProfPosCmd(const DeviceCmd& cmd);
159 double ComputePower(double actual_velocity, double actual_current,
160 bool motor_is_on);
161
162 bool compute_power_ = false;
163
164 // Use mode saved in driver's volatile memory.
165 jsd_elmo_gain_scheduling_mode_t ctrl_gs_mode_ =
166 JSD_ELMO_GAIN_SCHEDULING_MODE_PRELOADED;
167
168 jsd_slave_config_t jsd_slave_config_ = {};
169
174
176
177 DeviceCmd last_cmd_ = {};
178
179 jsd_elmo_state_machine_state_t last_elmo_state_machine_state_ =
180 JSD_ELMO_STATE_MACHINE_STATE_NOT_READY_TO_SWITCH_ON;
181
182 // Timeout in seconds after which a fault should occur if a transition out of
183 // PROF_*_DISENGAGING does not take place. Default value corresponds to the
184 // maximum value the drive's brake disengage parameter (BP[2]) can take.
185 // prof_disengaging_timeout_ can be temporarily increased to allow for an
186 // initial commutation search in actuators that do not have hall sensors, for
187 // example.
189
190 private:
191
192 bool PosExceedsCmdLimits(double pos_eu);
193 bool VelExceedsCmdLimits(double vel_eu);
194 bool AccExceedsCmdLimits(double vel_eu);
195 bool CurrentExceedsCmdLimits(double current);
196 bool CheckStateMachineMotionCmds();
197 bool CheckStateMachineGainSchedulingCmds();
198 bool HandleNewHaltCmd();
199 bool HandleNewResetCmd();
200 bool HandleNewSetOutputPositionCmd(const DeviceCmd& cmd);
201 bool HandleNewSetUnitModeCmd(const DeviceCmd& cmd);
202 bool HandleNewSetProfDisengagingTimeoutCmd(const DeviceCmd& cmd);
203 bool HandleNewCalibrationCmd(const DeviceCmd& cmd);
204 bool HandleNewCSPCmd(const DeviceCmd& cmd);
205 bool HandleNewCSVCmd(const DeviceCmd& cmd);
206 bool HandleNewCSTCmd(const DeviceCmd& cmd);
207 bool HandleNewProfPosCmd(const DeviceCmd& cmd);
208 bool HandleNewProfVelCmd(const DeviceCmd& cmd);
209 bool HandleNewProfTorqueCmd(const DeviceCmd& cmd);
210
211 bool IsIdleFaultConditionMet();
212 FaultType ProcessFaulted();
213 FaultType ProcessHalted();
214 FaultType ProcessHolding();
215 FaultType ProcessCS();
216 FaultType ProcessCalMoveToHardstop();
217 FaultType ProcessCalAtHardstop();
218 FaultType ProcessCalUpdatePosition();
219 FaultType ProcessCalMoveToSoftstop();
220
221 bool GSModeFromString(std::string gs_mode_string,
222 jsd_elmo_gain_scheduling_mode_t& gs_mode);
223
224 virtual bool ParseSpecializedYamlParams(const YAML::Node& node);
225
226 virtual void PopulateJsdSlaveConfig() = 0;
227 virtual void PopulateState() = 0;
228
229 virtual bool HandleNewProfPosCmdImpl(const DeviceCmd& cmd) = 0;
230 virtual bool HandleNewProfVelCmdImpl(const DeviceCmd& cmd) = 0;
231 virtual bool HandleNewProfTorqueCmdImpl(const DeviceCmd& cmd) = 0;
232
233 virtual FaultType ProcessProfPosDisengaging() = 0;
234 virtual FaultType ProcessProfPos() = 0;
235 virtual FaultType ProcessProfVelDisengaging() = 0;
236 virtual FaultType ProcessProfVel() = 0;
237 virtual FaultType ProcessProfTorqueDisengaging() = 0;
238 virtual FaultType ProcessProfTorque() = 0;
239
240 virtual void ElmoSetConfig();
241 virtual void ElmoRead() = 0;
242 virtual void ElmoClearErrors() = 0;
243 virtual void ElmoFault() = 0;
244 virtual void ElmoReset() = 0;
245 virtual void ElmoSetPeakCurrent(double current) = 0;
246 virtual void ElmoSetDigitalOutput(uint8_t digital_output_index,
247 uint8_t output_level) = 0;
248 virtual void ElmoSetUnitMode(int32_t mode, uint16_t app_id) = 0;
249 virtual void ElmoSetGainSchedulingMode(jsd_elmo_gain_scheduling_mode_t mode,
250 uint16_t app_id) = 0;
251 virtual void ElmoSetGainSchedulingIndex(uint16_t index) = 0;
252 virtual void ElmoCSP(const jsd_elmo_motion_command_csp_t& jsd_csp_cmd) = 0;
253 virtual void ElmoCSV(const jsd_elmo_motion_command_csv_t& jsd_csv_cmd) = 0;
254 virtual void ElmoCST(const jsd_elmo_motion_command_cst_t& jsd_cst_cmd) = 0;
255 virtual void ElmoHalt() = 0;
256 virtual void ElmoProcess() = 0;
257
258 virtual double GetActualVelocity() = 0;
259 virtual double GetElmoActualPosition() = 0;
260 virtual jsd_elmo_state_machine_state_t GetElmoStateMachineState() = 0;
261 virtual bool IsStoEngaged() = 0;
262
263 double overall_reduction_ = 1.0;
264
265 ActuatorCalibrateCmd cal_cmd_ = {};
266
267 bool actuator_absolute_encoder_ = false;
268 int32_t elmo_pos_offset_cnts_ = 1;
269 RingBuffer<DeviceCmd> last_device_cmd_ = RingBuffer<DeviceCmd>(50);
270 double csp_interpolation_offset_time_ = 0.0;
271 size_t csp_cycles_delay_ = 4;
272 size_t csp_cycles_stale_ = 10;
273
274 ActuatorExplicitInterpolationAlgorithm explicit_interpolation_algorithm_ =
276
277 ActuatorExplicitInterpolationTimestamp explicit_interpolation_timestamp_source_ =
279
280
281};
282
283} // namespace fastcat
284
285#endif
Definition actuator.h:68
bool compute_power_
Definition actuator.h:162
void SetExplicitInterpolationTimestampSource(ActuatorExplicitInterpolationTimestamp source)
Definition actuator.h:86
bool SetOutputPosition(double position)
Definition actuator.cc:515
const ActuatorParams & GetParams()
Definition actuator.h:144
double ComputePower(double actual_velocity, double actual_current, bool motor_is_on)
Definition actuator.cc:832
DeviceCmd last_cmd_
Definition actuator.h:177
static std::string StateMachineStateToString(ActuatorStateMachineState sms)
Definition actuator.cc:617
ActuatorParams params_
Definition actuator.h:173
double EuToCnts(double eu)
Definition actuator.cc:534
jsd_elmo_gain_scheduling_mode_t ctrl_gs_mode_
Definition actuator.h:165
void SetExplicitInterpolationCyclesDelay(size_t cycles_delay)
Definition actuator.h:91
static std::string GetJSDFaultCodeAsString(const DeviceState &state)
Definition actuator.cc:763
int32_t PosEuToCnts(double eu)
Definition actuator.cc:543
double last_transition_time_
Definition actuator.h:171
void SetInterpolationCyclesStale(size_t cycles)
Definition actuator.h:101
static bool IsJsdFaultCodePresent(const DeviceState &state)
Definition actuator.cc:782
void Fault() override
Definition actuator.cc:494
double prof_disengaging_timeout_
Definition actuator.h:188
double PosCntsToEu(int32_t cnts)
Definition actuator.cc:539
fastcat_trap_t trap_
Definition actuator.h:172
void SetExplicitInterpolationAlgorithm(ActuatorExplicitInterpolationAlgorithm algorithm)
Definition actuator.h:81
void Reset() override
Definition actuator.cc:503
FaultType ProcessProfPosTrapImpl()
Definition actuator_fsm_helpers.cc:622
jsd_slave_config_t jsd_slave_config_
Definition actuator.h:168
bool IsMotionFaultConditionMet()
Definition actuator_fsm_helpers.cc:537
double CntsToEu(int32_t cnts)
Definition actuator.cc:530
bool Write(DeviceCmd &cmd) override
Definition actuator.cc:235
Actuator()
Definition actuator.cc:19
static std::string GetFastcatFaultCodeAsString(const DeviceState &state)
Definition actuator.cc:703
jsd_elmo_state_machine_state_t last_elmo_state_machine_state_
Definition actuator.h:179
ActuatorStateMachineState actuator_sms_
Definition actuator.h:170
static double GetActualPosition(const DeviceState &state)
Definition actuator.cc:804
ActuatorFastcatFault fastcat_fault_
Definition actuator.h:175
bool HasAbsoluteEncoder()
Definition actuator.cc:525
void TransitionToState(ActuatorStateMachineState sms)
Definition actuator.cc:606
double ComputeTargetPosProfPosCmd(const DeviceCmd &cmd)
Definition actuator.cc:820
bool ConfigFromYaml(const YAML::Node &node) override
Definition actuator.cc:25
bool Read() override
Definition actuator.cc:228
FaultType Process() override
Definition actuator.cc:425
Definition jsd_device_base.h:16
Definition ring_buffer.h:13
Definition device_base.h:18
ActuatorExplicitInterpolationTimestamp
Definition actuator.h:62
@ ACTUATOR_EXPLICIT_INTERPOLATION_TIMESTAMP_FASTCAT_CLOCK
Definition actuator.h:64
@ ACTUATOR_EXPLICIT_INTERPOLATION_TIMESTAMP_CSP_MESSAGE
Definition actuator.h:63
ActuatorStateMachineState
Definition actuator.h:17
@ ACTUATOR_SMS_CSV
Definition actuator.h:28
@ ACTUATOR_SMS_CST
Definition actuator.h:29
@ ACTUATOR_SMS_PROF_TORQUE_DISENGAGING
Definition actuator.h:26
@ ACTUATOR_SMS_CAL_MOVE_TO_HARDSTOP
Definition actuator.h:30
@ ACTUATOR_SMS_CAL_AT_HARDSTOP
Definition actuator.h:32
@ ACTUATOR_SMS_FAULTED
Definition actuator.h:18
@ ACTUATOR_SMS_PROF_POS
Definition actuator.h:21
@ ACTUATOR_SMS_PROF_VEL_DISENGAGING
Definition actuator.h:24
@ ACTUATOR_SMS_CAL_MOVE_TO_SOFTSTOP
Definition actuator.h:33
@ ACTUATOR_SMS_PROF_TORQUE
Definition actuator.h:25
@ ACTUATOR_SMS_CSP
Definition actuator.h:27
@ ACTUATOR_SMS_HALTED
Definition actuator.h:19
@ ACTUATOR_SMS_PROF_POS_DISENGAGING
Definition actuator.h:22
@ ACTUATOR_SMS_HOLDING
Definition actuator.h:20
@ ACTUATOR_SMS_CAL_UPDATE_POSITION
Definition actuator.h:31
@ ACTUATOR_SMS_PROF_VEL
Definition actuator.h:23
ActuatorFastcatFault
Definition actuator.h:41
@ ACTUATOR_FASTCAT_FAULT_INVALID_ELMO_SMS_DURING_MOTION
Definition actuator.h:50
@ ACTUATOR_FASTCAT_FAULT_OKAY
Definition actuator.h:42
@ ACTUATOR_FASTCAT_FAULT_INVALID_CAL_MOTION_RANGE
Definition actuator.h:47
@ ACTUATOR_FASTCAT_FAULT_CAL_RESET_TIMEOUT_EXCEEDED
Definition actuator.h:53
@ ACTUATOR_FASTCAT_FAULT_INVALID_CMD_DURING_CAL
Definition actuator.h:46
@ ACTUATOR_FASTCAT_FAULT_BRAKE_DISENGAGE_TIMEOUT_EXCEEDED
Definition actuator.h:51
@ ACTUATOR_FASTCAT_FAULT_CMD_LIMIT_EXCEEDED
Definition actuator.h:44
@ ACTUATOR_FASTCAT_FAULT_INVALID_CMD_DURING_MOTION
Definition actuator.h:45
@ ACTUATOR_FASTCAT_FAULT_PROF_POS_CMD_ACK_TIMEOUT_EXCEEDED
Definition actuator.h:54
@ ACTUATOR_FASTCAT_FAULT_NO_HARDSTOP_DURING_CAL
Definition actuator.h:52
@ ACTUATOR_FASTCAT_FAULT_STO_ENGAGED
Definition actuator.h:49
ActuatorType
Definition actuator.h:36
@ ACTUATOR_TYPE_PRISMATIC
Definition actuator.h:38
@ ACTUATOR_TYPE_REVOLUTE
Definition actuator.h:37
ActuatorExplicitInterpolationAlgorithm
Definition actuator.h:57
@ ACTUATOR_EXPLICIT_INTERPOLATION_ALGORITHM_LINEAR
Definition actuator.h:59
@ ACTUATOR_EXPLICIT_INTERPOLATION_ALGORITHM_CUBIC
Definition actuator.h:58
Definition actuator.h:110
double holding_duration_sec
Definition actuator.h:130
double max_speed_eu_per_sec
Definition actuator.h:117
bool prof_pos_hold
Definition actuator.h:141
double elmo_brake_engage_msec
Definition actuator.h:131
double pos_tracking_error_eu
Definition actuator.h:121
double continuous_current_limit_amps
Definition actuator.h:124
double peak_current_limit_amps
Definition actuator.h:122
double smooth_factor
Definition actuator.h:135
int64_t elmo_crc
Definition actuator.h:133
double high_pos_cmd_limit_eu
Definition actuator.h:128
double high_pos_cal_limit_eu
Definition actuator.h:129
double over_speed_multiplier
Definition actuator.h:119
double peak_current_time_sec
Definition actuator.h:123
double low_pos_cal_limit_eu
Definition actuator.h:126
double vel_tracking_error_eu_per_sec
Definition actuator.h:120
double elmo_drive_max_cur_limit_amps
Definition actuator.h:134
double max_accel_eu_per_sec2
Definition actuator.h:118
std::string actuator_type_str
Definition actuator.h:111
double motor_encoder_gear_ratio
Definition actuator.h:139
double elmo_brake_disengage_msec
Definition actuator.h:132
double brake_power
Definition actuator.h:138
double gear_ratio
Definition actuator.h:115
std::string ctrl_gs_mode_str
Definition actuator.h:114
double low_pos_cmd_limit_eu
Definition actuator.h:127
double torque_constant
Definition actuator.h:136
double counts_per_rev
Definition actuator.h:116
double torque_slope_amps_per_sec
Definition actuator.h:125
bool actuator_absolute_encoder
Definition actuator.h:140
double winding_resistance
Definition actuator.h:137
Definition trap.h:16