Skip to content

Commit 03254d1

Browse files
committed
Calculate tracking time constant in set_gains
1 parent 7978559 commit 03254d1

File tree

1 file changed

+26
-18
lines changed

1 file changed

+26
-18
lines changed

control_toolbox/src/pid.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -180,18 +180,41 @@ void Pid::set_gains(
180180
set_gains(gains);
181181
}
182182

183-
void Pid::set_gains(const Gains & gains)
183+
void Pid::set_gains(const Gains & gains_in)
184184
{
185-
if (gains.i_min_ > gains.i_max_)
185+
if (gains_in.i_min_ > gains_in.i_max_)
186186
{
187187
std::cout << "received i_min > i_max, skip new gains\n";
188188
}
189-
else if (gains.u_min_ > gains.u_max_)
189+
else if (gains_in.u_min_ > gains_in.u_max_)
190190
{
191191
std::cout << "received u_min > u_max, skip new gains\n";
192192
}
193193
else
194194
{
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+
}
195218
gains_buffer_.writeFromNonRT(gains);
196219
}
197220
}
@@ -317,27 +340,12 @@ double Pid::compute_command(double error, double error_dot, const double & dt_s)
317340

318341
if (gains.antiwindup_strat_ == AntiwindupStrategy::BACK_CALCULATION && !is_zero(gains.i_gain_))
319342
{
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-
}
330343
i_term_ += dt_s * (gains.i_gain_ * error + 1 / gains.trk_tc_ * (cmd_ - cmd_unsat_));
331344
}
332345
else if (
333346
gains.antiwindup_strat_ == AntiwindupStrategy::CONDITIONING_TECHNIQUE &&
334347
!is_zero(gains.i_gain_))
335348
{
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-
}
341349
i_term_ += dt_s * gains.i_gain_ * (error + 1 / gains.trk_tc_ * (cmd_ - cmd_unsat_));
342350
}
343351
else if (gains.antiwindup_strat_ == AntiwindupStrategy::CONDITIONAL_INTEGRATION)

0 commit comments

Comments
 (0)