Define: err = (cycle ? CycleValue(sp) - fb : sp - fb) e_k = k * err fb_d_k = k * fb_dot
189 {
190 if (!std::isfinite(sp) || !std::isfinite(fb) || !std::isfinite(fb_dot) ||
191 !std::isfinite(dt) || dt <= Scalar(0))
192 {
193 return last_out_;
194 }
195
196
197 const Scalar ERR = param_.
cycle ? (CycleValue<Scalar>(sp) - fb) : (sp - fb);
198 const Scalar E_K = ERR * param_.
k;
199
200
201 Scalar fb_d_k = fb_dot * param_.
k;
202 if (!std::isfinite(fb_d_k))
203 {
204 fb_d_k = Scalar(0);
205 }
206
207
208 const Scalar OUTPUT_PD = (E_K * param_.
p) - (fb_d_k * param_.
d);
209
210
211
212
213
214 if (param_.
i > PID_SIGMA && param_.
i_limit > PID_SIGMA)
215 {
216 Scalar i_candidate = i_ + E_K * dt;
217
218 if (std::isfinite(i_candidate))
219 {
220
221 i_candidate = std::clamp(i_candidate, -param_.i_limit, param_.i_limit);
222
223 bool accept = true;
224
225 if (param_.out_limit > PID_SIGMA)
226 {
227 const Scalar OUT_BEFORE = OUTPUT_PD + (i_ * param_.i) + feed_forward_;
228 const Scalar OUT_AFTER = OUTPUT_PD + (i_candidate * param_.i) + feed_forward_;
229
230 if (std::isfinite(OUT_BEFORE) && std::isfinite(OUT_AFTER))
231 {
232 const bool BEFORE_SAT = (std::abs(OUT_BEFORE) > param_.out_limit);
233 const bool AFTER_SAT = (std::abs(OUT_AFTER) > param_.out_limit);
234
235 if (AFTER_SAT)
236 {
237 accept = BEFORE_SAT && (std::abs(OUT_AFTER) < std::abs(OUT_BEFORE));
238 }
239 }
240 else
241 {
242 accept = false;
243 }
244 }
245
246 if (accept)
247 {
248 i_ = i_candidate;
249 }
250 }
251 }
252 else
253 {
254
255 i_ = Scalar(0);
256 }
257
258 const Scalar I_OUT = i_ * param_.
i;
259
260
261 Scalar output = OUTPUT_PD + I_OUT + feed_forward_;
262 if (std::isfinite(output) && param_.
out_limit > PID_SIGMA)
263 {
265 }
266
267
268 last_err_ = ERR;
269 last_fb_ = fb;
270 last_out_ = output;
271 last_der_ = fb_d_k;
272 return output;
273 }