7#include "cycle_value.hpp"
11using DefaultScalar = LIBXR_DEFAULT_SCALAR;
13constexpr DefaultScalar PID_SIGMA = 1e-6f;
25template <
typename Scalar = DefaultScalar>
52 PID(
P&& p) : param_(std::forward<
P>(p))
75 if (!std::isfinite(sp) || !std::isfinite(fb) || !std::isfinite(dt) || dt <= Scalar(0))
82 const Scalar E_K = ERR * param_.
k;
85 Scalar fb_dot = (fb - last_fb_) / dt;
86 if (!std::isfinite(fb_dot))
91 Scalar fb_d_k = fb_dot * param_.
k;
92 if (!std::isfinite(fb_d_k))
98 const Scalar OUTPUT_PD = (E_K * param_.
p) - (fb_d_k * param_.
d);
104 if (param_.
i > PID_SIGMA && param_.
i_limit > PID_SIGMA)
106 Scalar i_candidate = i_ + E_K * dt;
108 if (std::isfinite(i_candidate))
111 i_candidate = std::clamp(i_candidate, -param_.
i_limit, param_.
i_limit);
118 const Scalar OUT_BEFORE = OUTPUT_PD + (i_ * param_.
i) + feed_forward_;
119 const Scalar OUT_AFTER = OUTPUT_PD + (i_candidate * param_.
i) + feed_forward_;
121 if (std::isfinite(OUT_BEFORE) && std::isfinite(OUT_AFTER))
123 const bool BEFORE_SAT = (std::abs(OUT_BEFORE) > param_.
out_limit);
124 const bool AFTER_SAT = (std::abs(OUT_AFTER) > param_.
out_limit);
133 accept = BEFORE_SAT && (std::abs(OUT_AFTER) < std::abs(OUT_BEFORE));
154 const Scalar I_OUT = i_ * param_.
i;
157 Scalar output = OUTPUT_PD + I_OUT + feed_forward_;
158 if (std::isfinite(output) && param_.
out_limit > PID_SIGMA)
188 Scalar
Calculate(Scalar sp, Scalar fb, Scalar fb_dot, Scalar dt)
190 if (!std::isfinite(sp) || !std::isfinite(fb) || !std::isfinite(fb_dot) ||
191 !std::isfinite(dt) || dt <= Scalar(0))
198 const Scalar E_K = ERR * param_.
k;
201 Scalar fb_d_k = fb_dot * param_.
k;
202 if (!std::isfinite(fb_d_k))
208 const Scalar OUTPUT_PD = (E_K * param_.
p) - (fb_d_k * param_.
d);
214 if (param_.
i > PID_SIGMA && param_.
i_limit > PID_SIGMA)
216 Scalar i_candidate = i_ + E_K * dt;
218 if (std::isfinite(i_candidate))
221 i_candidate = std::clamp(i_candidate, -param_.
i_limit, param_.
i_limit);
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_;
230 if (std::isfinite(OUT_BEFORE) && std::isfinite(OUT_AFTER))
232 const bool BEFORE_SAT = (std::abs(OUT_BEFORE) > param_.
out_limit);
233 const bool AFTER_SAT = (std::abs(OUT_AFTER) > param_.
out_limit);
237 accept = BEFORE_SAT && (std::abs(OUT_AFTER) < std::abs(OUT_BEFORE));
258 const Scalar I_OUT = i_ * param_.
i;
261 Scalar output = OUTPUT_PD + I_OUT + feed_forward_;
262 if (std::isfinite(output) && param_.
out_limit > PID_SIGMA)
276 void SetK(Scalar k) { param_.
k = k; }
278 void SetP(Scalar p) { param_.
p = p; }
280 void SetI(Scalar i) { param_.
i = i; }
282 void SetD(Scalar d) { param_.
d = d; }
289 Scalar
K()
const {
return param_.
k; }
291 Scalar
P()
const {
return param_.
p; }
293 Scalar
I()
const {
return param_.
i; }
295 Scalar
D()
const {
return param_.
d; }
353 Scalar last_err_ = 0;
355 Scalar last_der_ = 0;
356 Scalar last_out_ = 0;
357 Scalar feed_forward_ = 0;
角度循环处理类,用于处理周期性角度计算。 A cyclic angle handling class for periodic angle calculations.
通用 PID 控制器类。 Generic PID controller.
Scalar D() const
获取 D 项系数 / Get derivative gain
void SetOutLimit(Scalar limit)
设置输出限幅 / Set output limit
Scalar ILimit() const
获取积分限幅 / Get integral limit
Scalar LastFeedback() const
获取上一次反馈值(未缩放) / Get last feedback (raw)
Scalar GetFeedForward() const
获取前馈项 / Get feedforward
Scalar P() const
获取 P 项系数 / Get proportional gain
Scalar LastDerivative() const
获取上一次导数(k * d(fb)/dt 或 k * fb_dot) / Get last derivative (scaled by k)
Scalar LastOutput() const
获取上一次输出 / Get last output
void SetD(Scalar d)
设置 D 项系数 / Set derivative gain
void Reset()
重置控制器状态。 Reset all internal states.
void SetP(Scalar p)
设置 P 项系数 / Set proportional gain
Scalar Calculate(Scalar sp, Scalar fb, Scalar dt)
使用反馈值计算 PID 输出。 Compute output from feedback only.
void SetILimit(Scalar limit)
设置积分限幅 / Set integral limit
Scalar I() const
获取 I 项系数 / Get integral gain
Scalar OutLimit() const
获取输出限幅 / Get output limit
Scalar Calculate(Scalar sp, Scalar fb, Scalar fb_dot, Scalar dt)
使用外部导数计算 PID 输出。 Compute output using external feedback derivative.
void SetIntegralError(Scalar err)
设置累计误差 / Set integral error
Scalar GetIntegralError() const
获取累计误差 / Get integral error
void SetI(Scalar i)
设置 I 项系数 / Set integral gain
void SetK(Scalar k)
设置全局比例系数 / Set global proportional gain
Scalar LastError() const
获取上一次误差 / Get last error
Scalar K() const
获取全局比例系数 / Get global proportional gain
PID(P &&p)
构造 PID 控制器。 Construct a PID controller.
void SetFeedForward(Scalar feed_forward)
设置前馈项 / Set feedforward
LibXR 命名空间 / LibXR namespace.
PID 参数结构体。 Structure holding PID parameters.
Scalar i_limit
积分限幅 / Integral limit
Scalar out_limit
输出限幅 / Output limit
Scalar p
比例项 / Proportional gain
bool cycle
是否处理周期误差 / Whether input is cyclic
Scalar k
全局比例因子 / Global gain
Scalar i
积分项 / Integral gain
Scalar d
微分项 / Derivative gain