@@ -180,18 +180,41 @@ void Pid::set_gains(
180
180
set_gains (gains);
181
181
}
182
182
183
- void Pid::set_gains (const Gains & gains )
183
+ void Pid::set_gains (const Gains & gains_in )
184
184
{
185
- if (gains .i_min_ > gains .i_max_ )
185
+ if (gains_in .i_min_ > gains_in .i_max_ )
186
186
{
187
187
std::cout << " received i_min > i_max, skip new gains\n " ;
188
188
}
189
- else if (gains .u_min_ > gains .u_max_ )
189
+ else if (gains_in .u_min_ > gains_in .u_max_ )
190
190
{
191
191
std::cout << " received u_min > u_max, skip new gains\n " ;
192
192
}
193
193
else
194
194
{
195
+ Gains gains = gains_in;
196
+
197
+ if (gains.antiwindup_strat_ == AntiwindupStrategy::BACK_CALCULATION)
198
+ {
199
+ if (is_zero (gains.trk_tc_ ) && !is_zero (gains.d_gain_ ))
200
+ {
201
+ // Default value for tracking time constant for back calculation technique
202
+ gains.trk_tc_ = std::sqrt (gains.d_gain_ / gains.i_gain_ );
203
+ }
204
+ else if (is_zero (gains.trk_tc_ ) && is_zero (gains.d_gain_ ))
205
+ {
206
+ // Default value for tracking time constant for back calculation technique
207
+ gains.trk_tc_ = gains.p_gain_ / gains.i_gain_ ;
208
+ }
209
+ }
210
+ else if (gains.antiwindup_strat_ == AntiwindupStrategy::CONDITIONING_TECHNIQUE)
211
+ {
212
+ if (is_zero (gains.trk_tc_ ))
213
+ {
214
+ // Default value for tracking time constant for conditioning technique
215
+ gains.trk_tc_ = gains.p_gain_ ;
216
+ }
217
+ }
195
218
gains_buffer_.writeFromNonRT (gains);
196
219
}
197
220
}
@@ -317,27 +340,12 @@ double Pid::compute_command(double error, double error_dot, const double & dt_s)
317
340
318
341
if (gains.antiwindup_strat_ == AntiwindupStrategy::BACK_CALCULATION && !is_zero (gains.i_gain_ ))
319
342
{
320
- if (is_zero (gains.trk_tc_ ) && !is_zero (gains.d_gain_ ))
321
- {
322
- // Default value for tracking time constant for back calculation technique
323
- gains.trk_tc_ = std::sqrt (gains.d_gain_ / gains.i_gain_ );
324
- }
325
- else if (is_zero (gains.trk_tc_ ) && is_zero (gains.d_gain_ ))
326
- {
327
- // Default value for tracking time constant for back calculation technique
328
- gains.trk_tc_ = gains.p_gain_ / gains.i_gain_ ;
329
- }
330
343
i_term_ += dt_s * (gains.i_gain_ * error + 1 / gains.trk_tc_ * (cmd_ - cmd_unsat_));
331
344
}
332
345
else if (
333
346
gains.antiwindup_strat_ == AntiwindupStrategy::CONDITIONING_TECHNIQUE &&
334
347
!is_zero (gains.i_gain_ ))
335
348
{
336
- if (is_zero (gains.trk_tc_ ))
337
- {
338
- // Default value for tracking time constant for conditioning technique
339
- gains.trk_tc_ = gains.p_gain_ ;
340
- }
341
349
i_term_ += dt_s * gains.i_gain_ * (error + 1 / gains.trk_tc_ * (cmd_ - cmd_unsat_));
342
350
}
343
351
else if (gains.antiwindup_strat_ == AntiwindupStrategy::CONDITIONAL_INTEGRATION)
0 commit comments