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