RIT VEXU Core API
Loading...
Searching...
No Matches
math/controls/pid.h
1#pragma once
2
3#include <cmath>
4#include <algorithm>
5#include <limits>
6
7#include "math/math_util.h"
8
9namespace core {
10
23class PID {
24public:
25 typedef struct {
26 double kP = 0.0;
27 double kI = 0.0;
28 double kD = 0.0;
29
30 double tolerance = 0.05; // default tolerance
31
32 double dt = 0.01; // default period in seconds for derivative
33
34 double i_zone = 0.0; // integral zone
35 double i_min = -std::numeric_limits<double>::infinity(); // minimum integral limit
36 double i_max = std::numeric_limits<double>::infinity(); // maximum integral limit
37
38 double minimum_output = -12.0; // default minimum output limit
39 double maximum_output = 12.0; // default maximum output limit
40
41 bool continuous = false; // whether the PID is in continuous mode
42 double minimum_input = -1.0; // minimum input for continuous mode
43 double maximum_input = 1.0; // maximum input for continuous mode
44 } pid_config_t;
45
46
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) {}
55
56 PID(const core::PID&) = default;
57 PID(core::PID&&) = default;
58 PID& operator=(const core::PID&) = default;
59 PID& operator=(core::PID&&) = default;
60
68 void set_pid(double kP, double kI, double kD) {
69 kP_ = kP;
70 kI_ = kI;
71 kD_ = kD;
72 }
73
79 void set_p(double kP) {
80 kP_ = kP;
81 }
82
88 void set_i(double kI) {
89 kI_ = kI;
90 }
91
97 void set_d(double kD) {
98 kD_ = kD;
99 }
100
107 tolerance_ = tolerance;
108 }
109
116 void set_i_zone(double i_zone) {
117 i_zone_ = i_zone;
118 }
119
125 double p() const { return kP_; }
126
132 double i() const { return kI_; }
133
139 double d() const { return kD_; }
140
146 double tolerance() const { return tolerance_; }
147
153 double i_zone() const { return i_zone_; }
154
161 void set_i_limits(double i_min, double i_max) {
162 i_min_ = i_min;
163 i_max_ = i_max;
164 }
165
172 void set_output_limits(double minimum_output, double maximum_output) {
173 minimum_output_ = minimum_output;
174 maximum_output_ = maximum_output;
175 }
176
182 double dt() const { return dt_; }
183
189 void set_dt(double dt) {
190 dt_ = dt;
191 }
192
198 void set_setpoint(double setpoint) {
199 setpoint_ = setpoint;
200 }
201
207 double setpoint() const {
208 return setpoint_;
209 }
210
216 bool is_continuous() const {
217 return continuous_;
218 }
219
227 void enable_continuous(double minimum_input = -1, double maximum_input = 1) {
228 continuous_ = true;
229 minimum_input_ = minimum_input;
230 maximum_input_ = maximum_input;
231 }
232
237 continuous_ = false;
238 }
239
245 bool at_setpoint() const {
246 return std::abs(error_) < tolerance_;
247 }
248
255 double calculate(double measurement) {
256 measurement_ = measurement;
257 prev_error_ = error_;
258
259 if (continuous_) {
260
261 } else {
262 error_ = setpoint_ - measurement_;
263 }
264
265 error_derivative_ = (error_ - prev_error_) / dt_;
266
267 if (std::abs(error_) < i_zone_) {
268 total_error_ = core::clamp(total_error_ + error_ * dt_, i_min_, i_max_);
269 } else {
270 total_error_ = 0;
271 }
272
273 return core::clamp(
274 kP_ * error_ + kI_ * total_error_ + kD_ * error_derivative_,
275 minimum_output_,
276 maximum_output_
277 );
278 }
279
287 double calculate(double setpoint, double measurement) {
288 setpoint_ = setpoint;
289 return calculate(measurement);
290 }
291
295 void reset() {
296 error_ = 0;
297 prev_error_ = 0;
298 error_derivative_ = 0;
299 total_error_ = 0;
300 }
301
305 void reset_i() {
306 total_error_ = 0;
307 }
308
309private:
310 double kP_;
311 double kI_;
312 double kD_;
313 double dt_;
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;
318
319 bool continuous_ = false;
320 double minimum_input_ = -1;
321 double maximum_input_ = 1;
322
323 double setpoint_;
324 double measurement_;
325
326 double error_;
327 double error_derivative_;
328 double prev_error_;
329 double total_error_;
330
331 double maximum_output_ = std::numeric_limits<double>::infinity();
332 double minimum_output_ = -std::numeric_limits<double>::infinity();
333};
334
335} // namespace core
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