RIT VEXU Core API
Loading...
Searching...
No Matches
math/controls/pidff.h
1#pragma once
2
3#include <algorithm>
4#include <cmath>
5#include <limits>
6
7#include "math/controls/arm_feedforward.h"
8#include "math/controls/pid.h"
9#include "math/geometry/rotation2d.h"
10#include "math/math_util.h"
11
12namespace core {
13
26class PIDFF {
27 public:
41 PIDFF(double kP, double kI, double kD, double kS, double kV, double kA, double kG,
42 double tolerance, double dt = 0.01)
43 : pid_(kP, kI, kD, tolerance, dt),
44 ff_(kS, kV, kA, kG) {}
45
46 PIDFF(const PIDFF&) = default;
47 PIDFF(PIDFF&&) = default;
48 PIDFF& operator=(const PIDFF&) = default;
49 PIDFF& operator=(PIDFF&&) = default;
50
62 void set_gains(double kP, double kI, double kD, double kS, double kV, double kA, double kG) {
63 pid_.set_pid(kP, kI, kD);
64 ff_.set_kS(kS);
65 ff_.set_kV(kV);
66 ff_.set_kA(kA);
67 ff_.set_kG(kG);
68 }
69
77 void set_pid(double kP, double kI, double kD) { pid_.set_pid(kP, kI, kD); }
78
87 void set_ff(double kS, double kV, double kA, double kG) {
88 ff_.set_kS(kS);
89 ff_.set_kV(kV);
90 ff_.set_kA(kA);
91 ff_.set_kG(kG);
92 }
93
94 // PID-specific methods
95 void set_p(double kP) { pid_.set_p(kP); }
96 void set_i(double kI) { pid_.set_i(kI); }
97 void set_d(double kD) { pid_.set_d(kD); }
98 void set_tolerance(double tolerance) { pid_.set_tolerance(tolerance); }
99 void set_i_zone(double i_zone) { pid_.set_i_zone(i_zone); }
100 void set_i_limits(double i_min, double i_max) { pid_.set_i_limits(i_min, i_max); }
101 void set_dt(double dt) { pid_.set_dt(dt); }
102 void enable_continuous(double minimum_input = -1,
103 double maximum_input = 1) {
104 pid_.enable_continuous(minimum_input, maximum_input);
105 }
106 void disable_continuous() { pid_.disable_continuous(); }
107 void reset() { pid_.reset(); }
108 void reset_i() { pid_.reset_i(); }
109
110 // Feedforward-specific methods
111 void set_kS(double kS) { ff_.set_kS(kS); }
112 void set_kV(double kV) { ff_.set_kV(kV); }
113 void set_kA(double kA) { ff_.set_kA(kA); }
114 void set_kG(double kG) { ff_.set_kG(kG); }
115
116 // Getters
117 double p() const { return pid_.p(); }
118 double i() const { return pid_.i(); }
119 double d() const { return pid_.d(); }
120 double tolerance() const { return pid_.tolerance(); }
121 double i_zone() const { return pid_.i_zone(); }
122 double dt() const { return pid_.dt(); }
123 double kS() const { return ff_.kS(); }
124 double kV() const { return ff_.kV(); }
125 double kA() const { return ff_.kA(); }
126 double kG() const { return ff_.kG(); }
127 bool is_continuous() const { return pid_.is_continuous(); }
128 bool at_setpoint() const { return pid_.at_setpoint(); }
129
135 void set_setpoint(double setpoint) { pid_.set_setpoint(setpoint); }
136
142 double setpoint() const { return pid_.setpoint(); }
143
150 void set_output_limits(double minimum_output, double maximum_output) {
151 pid_.set_output_limits(minimum_output, maximum_output);
152 }
153
162 double calculate(double measurement, Rotation2d angle = Rotation2d()) {
163 double pid_output = pid_.calculate(measurement);
164 double ff_output =
165 ff_.kS() * sign(pid_output) + ff_.kG() * angle.f_cos();
166 return pid_output + ff_output;
167 }
168
178 double calculate(double setpoint, double measurement,
179 Rotation2d angle = Rotation2d()) {
180 pid_.set_setpoint(setpoint);
181 return calculate(measurement, angle);
182 }
183
193 double calculate_with_ff(double measurement, double v, double a,
194 Rotation2d angle = Rotation2d()) {
195 double pid_output = pid_.calculate(measurement);
196 double ff_output = ff_.calculate(v, a, angle);
197 return pid_output + ff_output;
198 }
199
210 double calculate_with_ff(double setpoint, double measurement, double v,
211 double a, Rotation2d angle = Rotation2d()) {
212 pid_.set_setpoint(setpoint);
213 return calculate_with_ff(measurement, v, a, angle);
214 }
215
216 private:
217 PID pid_;
218 ArmFeedforward ff_;
219};
220
221} // namespace core
Definition rotation2d.h:25
Definition arm_feedforward.h:27
Definition math/controls/pidff.h:26
void set_pid(double kP, double kI, double kD)
Definition math/controls/pidff.h:77
void set_gains(double kP, double kI, double kD, double kS, double kV, double kA, double kG)
Definition math/controls/pidff.h:62
void set_ff(double kS, double kV, double kA, double kG)
Definition math/controls/pidff.h:87
double calculate(double measurement, Rotation2d angle=Rotation2d())
Definition math/controls/pidff.h:162
void set_output_limits(double minimum_output, double maximum_output)
Definition math/controls/pidff.h:150
double setpoint() const
Definition math/controls/pidff.h:142
double calculate_with_ff(double setpoint, double measurement, double v, double a, Rotation2d angle=Rotation2d())
Definition math/controls/pidff.h:210
void set_setpoint(double setpoint)
Definition math/controls/pidff.h:135
PIDFF(double kP, double kI, double kD, double kS, double kV, double kA, double kG, double tolerance, double dt=0.01)
Definition math/controls/pidff.h:41
double calculate_with_ff(double measurement, double v, double a, Rotation2d angle=Rotation2d())
Definition math/controls/pidff.h:193
double calculate(double setpoint, double measurement, Rotation2d angle=Rotation2d())
Definition math/controls/pidff.h:178
Definition math/controls/pid.h:23
void set_p(double kP)
Definition math/controls/pid.h:79
void set_i(double kI)
Definition math/controls/pid.h:88