7#include "math/math_util.h"
35 double i_min = -std::numeric_limits<double>::infinity();
36 double i_max = std::numeric_limits<double>::infinity();
38 double minimum_output = -12.0;
39 double maximum_output = 12.0;
41 bool continuous =
false;
42 double minimum_input = -1.0;
43 double maximum_input = 1.0;
47 PID(
double kP,
double kI,
double kD,
double tolerance,
double dt = 0.01) : kP_(kP), kI_(kI), kD_(kD), dt_(
dt) {}
48 PID(PID::pid_config_t config)
49 : kP_(config.kP), kI_(config.kI), kD_(config.kD),
50 tolerance_(config.tolerance), dt_(config.dt),
51 i_zone_(config.i_zone), i_min_(config.i_min), i_max_(config.i_max),
52 minimum_output_(config.minimum_output), maximum_output_(config.maximum_output),
53 continuous_(config.continuous), minimum_input_(config.minimum_input),
54 maximum_input_(config.maximum_input) {}
58 PID& operator=(
const core::PID&) =
default;
68 void set_pid(
double kP,
double kI,
double kD) {
125 double p()
const {
return kP_; }
132 double i()
const {
return kI_; }
139 double d()
const {
return kD_; }
153 double i_zone()
const {
return i_zone_; }
173 minimum_output_ = minimum_output;
174 maximum_output_ = maximum_output;
182 double dt()
const {
return dt_; }
229 minimum_input_ = minimum_input;
230 maximum_input_ = maximum_input;
246 return std::abs(error_) < tolerance_;
256 measurement_ = measurement;
257 prev_error_ = error_;
262 error_ = setpoint_ - measurement_;
265 error_derivative_ = (error_ - prev_error_) / dt_;
267 if (std::abs(error_) < i_zone_) {
268 total_error_ = core::clamp(total_error_ + error_ * dt_, i_min_, i_max_);
274 kP_ * error_ + kI_ * total_error_ + kD_ * error_derivative_,
298 error_derivative_ = 0;
314 double i_zone_ = std::numeric_limits<double>::infinity();
315 double i_max_ = std::numeric_limits<double>::infinity();
316 double i_min_ = -std::numeric_limits<double>::infinity();
317 double tolerance_ = 0.05;
319 bool continuous_ =
false;
320 double minimum_input_ = -1;
321 double maximum_input_ = 1;
327 double error_derivative_;
331 double maximum_output_ = std::numeric_limits<double>::infinity();
332 double minimum_output_ = -std::numeric_limits<double>::infinity();
Definition math/controls/pid.h:23
double setpoint() const
Definition math/controls/pid.h:207
void set_d(double kD)
Definition math/controls/pid.h:97
void set_setpoint(double setpoint)
Definition math/controls/pid.h:198
bool at_setpoint() const
Definition math/controls/pid.h:245
double dt() const
Definition math/controls/pid.h:182
void disable_continuous()
Definition math/controls/pid.h:236
double i() const
Definition math/controls/pid.h:132
void set_i_zone(double i_zone)
Definition math/controls/pid.h:116
void set_output_limits(double minimum_output, double maximum_output)
Definition math/controls/pid.h:172
void set_tolerance(double tolerance)
Definition math/controls/pid.h:106
void set_pid(double kP, double kI, double kD)
Definition math/controls/pid.h:68
double i_zone() const
Definition math/controls/pid.h:153
double p() const
Definition math/controls/pid.h:125
void set_dt(double dt)
Definition math/controls/pid.h:189
void set_i_limits(double i_min, double i_max)
Definition math/controls/pid.h:161
double calculate(double setpoint, double measurement)
Definition math/controls/pid.h:287
double tolerance() const
Definition math/controls/pid.h:146
void enable_continuous(double minimum_input=-1, double maximum_input=1)
Definition math/controls/pid.h:227
void reset()
Definition math/controls/pid.h:295
void reset_i()
Definition math/controls/pid.h:305
void set_p(double kP)
Definition math/controls/pid.h:79
bool is_continuous() const
Definition math/controls/pid.h:216
double calculate(double measurement)
Definition math/controls/pid.h:255
double d() const
Definition math/controls/pid.h:139
void set_i(double kI)
Definition math/controls/pid.h:88