@@ -272,18 +272,17 @@ double Pid::compute_command(double error, double error_dot, const double & dt_s)
272
272
d_term = gains.d_gain_ * d_error_;
273
273
274
274
// Calculate integral contribution to command
275
- if (gains.antiwindup_ == true && gains.antiwindup_strat_ == " none" ) {
275
+ if (gains.antiwindup_ && gains.antiwindup_strat_ == " none" ) {
276
276
// Prevent i_term_ from climbing higher than permitted by i_max_/i_min_
277
- i_term_ = std::clamp (i_term_ + gains.i_gain_ * dt_s * p_error_, gains.i_min_ , gains.i_max_ );
278
- }
279
- else
280
- {
277
+ i_term_ = std::clamp (i_term_ + gains.i_gain_ * dt_s * p_error_,
278
+ gains.i_min_ , gains.i_max_ );
279
+ } else if (!gains.antiwindup_ && gains.antiwindup_strat_ == " none" ) {
281
280
i_term_ += gains.i_gain_ * dt_s * p_error_;
281
+ i_term_ = std::clamp (i_term_, gains.i_min_ , gains.i_max_ );
282
282
}
283
283
284
284
// Compute the command
285
285
// Limit i_term so that the limit is meaningful in the output
286
- // Compute the command
287
286
cmd_unsat_ = p_term + i_term_ + d_term;
288
287
289
288
if (gains.saturation_ == true ) {
@@ -293,7 +292,7 @@ double Pid::compute_command(double error, double error_dot, const double & dt_s)
293
292
cmd_ = cmd_unsat_;
294
293
}
295
294
296
- if (gains.antiwindup_strat_ == " back_calculation" ) {
295
+ if (gains.antiwindup_strat_ == " back_calculation" && gains. i_gain_ != 0 ) {
297
296
if (gains.trk_tc_ == 0.0 && gains.d_gain_ != 0.0 ) {
298
297
// Default value for tracking time constant for back calculation technique
299
298
gains.trk_tc_ = std::sqrt (gains.d_gain_ /gains.i_gain_ );
0 commit comments