14#include <wpi/units/time.hpp>
16#if __has_include(<wpi/telemetry/TelemetryLoggable.hpp>) && __has_include(<wpi/tunables/ComplexTunable.hpp>)
17#include <wpi/math/util/MathShared.hpp>
18#include <wpi/telemetry/TelemetryLoggable.hpp>
19#include <wpi/tunables/ComplexTunable.hpp>
20#include <wpi/tunables/Tunable.hpp>
21#include <wpi/util/UsageReporting.hpp>
22#define CTRE_PHOENIX6_USE_WPILIB
36#if defined(CTRE_PHOENIX6_USE_WPILIB) || defined(_CTRE_DOCS_)
37 :
public wpi::telemetry::TelemetryLoggable,
public wpi::tunables::ComplexTunable
49 m_Kp{Kp}, m_Ki{Ki}, m_Kd{Kd}
51#ifdef CTRE_PHOENIX6_USE_WPILIB
54 wpi::util::ReportUsage(
"PhoenixPIDController", std::to_string(instances));
59#if defined(CTRE_PHOENIX6_USE_WPILIB) || defined(_CTRE_DOCS_)
77 constexpr void SetPID(
double Kp,
double Ki,
double Kd)
91 constexpr void SetP(
double Kp) { m_Kp = Kp; }
100 constexpr void SetI(
double Ki) { m_Ki = Ki; }
109 constexpr void SetD(
double Kd) { m_Kd = Kd; }
124 if (!std::is_constant_evaluated() && iZone < 0) {
125 std::string
const error =
"IZone must be a non-negative number, got " + std::to_string(iZone) +
"!";
136 constexpr double GetP()
const {
return m_Kp; }
143 constexpr double GetI()
const {
return m_Ki; }
150 constexpr double GetD()
const {
return m_Kd; }
157 constexpr double GetIZone()
const {
return m_iZone; }
188 m_setpoint = setpoint;
189 m_haveSetpoint =
true;
192 double errorBound = (m_maximumInput - m_minimumInput) / 2.0;
193 m_error = InputModulus(m_setpoint - m_measurement, -errorBound, errorBound);
195 m_error = m_setpoint - m_measurement;
198 if (m_period > 0_s) {
199 m_errorDerivative = (m_error - m_prevError) / m_period.value();
201 m_errorDerivative = 0.0;
221 return m_haveMeasurement && m_haveSetpoint &&
222 gcem::abs(m_error) < m_errorTolerance &&
223 gcem::abs(m_errorDerivative) < m_errorDerivativeTolerance;
239 m_minimumInput = minimumInput;
240 m_maximumInput = maximumInput;
265 m_minimumIntegral = minimumIntegral;
266 m_maximumIntegral = maximumIntegral;
276 double errorTolerance,
277 double errorDerivativeTolerance = std::numeric_limits<double>::infinity()
279 m_errorTolerance = errorTolerance;
280 m_errorDerivativeTolerance = errorDerivativeTolerance;
286 constexpr double GetError()
const {
return m_error; }
299 constexpr double Calculate(
double measurement, wpi::units::second_t timestamp)
301 m_measurement = measurement;
302 m_prevError = m_error;
303 m_haveMeasurement =
true;
305 m_period = timestamp - m_lastTimestamp;
306 m_lastTimestamp = timestamp;
309 double errorBound = (m_maximumInput - m_minimumInput) / 2.0;
310 m_error = InputModulus(m_setpoint - m_measurement, -errorBound, errorBound);
312 m_error = m_setpoint - m_measurement;
315 m_errorDerivative = (m_error - m_prevError) / m_period.value();
319 if (gcem::abs(m_error) > m_iZone) {
321 }
else if (m_Ki != 0) {
322 m_totalError = std::clamp(
323 m_totalError + m_error * m_period.value(),
324 m_minimumIntegral / m_Ki, m_maximumIntegral / m_Ki
328 m_lastAppliedOutput = m_Kp * m_error + m_Ki * m_totalError + m_Kd * m_errorDerivative;
329 return m_lastAppliedOutput;
339 constexpr double Calculate(
double measurement,
double setpoint, wpi::units::second_t timestamp)
341 m_setpoint = setpoint;
342 m_haveSetpoint =
true;
343 return Calculate(measurement, timestamp);
359 m_errorDerivative = 0;
360 m_haveMeasurement =
false;
363#if defined(CTRE_PHOENIX6_USE_WPILIB) || defined(_CTRE_DOCS_)
369 void LogTo(wpi::telemetry::TelemetryTable &table)
const override;
393 constexpr std::string_view
GetTunableType()
const override {
return "PIDController"; }
404 template <
typename T>
405 static constexpr T InputModulus(T input, T minimumInput, T maximumInput)
407 T
const modulus = maximumInput - minimumInput;
410 int const numMax = (input - minimumInput) / modulus;
411 input -= numMax * modulus;
414 int const numMin = (input - maximumInput) / modulus;
415 input -= numMin * modulus;
420#if defined(CTRE_PHOENIX6_USE_WPILIB) || defined(_CTRE_DOCS_)
421 template <
typename T,
typename... I>
422 using Tunable = wpi::tunables::Tunable<T, I...>;
424 template <
typename T,
typename... I>
429 Tunable<double> m_Kp;
432 Tunable<double> m_Ki;
435 Tunable<double> m_Kd;
438 Tunable<double> m_iZone{std::numeric_limits<double>::infinity()};
440 double m_maximumIntegral = 1.0;
442 double m_minimumIntegral = -1.0;
444 double m_maximumInput = 0;
446 double m_minimumInput = 0;
449 bool m_continuous =
false;
453 double m_errorDerivative = 0;
457 double m_prevError = 0;
460 double m_totalError = 0;
463 double m_errorTolerance = 0.05;
464 double m_errorDerivativeTolerance = std::numeric_limits<double>::infinity();
466 double m_setpoint = 0;
467 double m_measurement = 0;
469 bool m_haveSetpoint =
false;
470 bool m_haveMeasurement =
false;
472 double m_lastAppliedOutput;
475 wpi::units::second_t m_lastTimestamp;
477 wpi::units::second_t m_period;
480 inline static int instances = 0;
487#ifdef CTRE_PHOENIX6_USE_WPILIB
488#undef CTRE_PHOENIX6_USE_WPILIB
static void ReportError(bool isError, int32_t errorCode, char const *details, char const *location, bool getStackTrace=true)
Reports an error.
void PublishTunable(wpi::tunables::TunableTable &table) override
Publishes the tunable to the given table.
constexpr double GetErrorDerivative() const
Returns the error derivative.
Definition PhoenixPIDController.hpp:291
constexpr double Calculate(double measurement, double setpoint, wpi::units::second_t timestamp)
Returns the next output of the PID controller.
Definition PhoenixPIDController.hpp:339
constexpr double GetLastAppliedOutput() const
Returns the last applied output from this PID controller.
Definition PhoenixPIDController.hpp:349
constexpr PhoenixPIDController & operator=(PhoenixPIDController &&)=default
constexpr double GetIZone() const
Get the IZone range.
Definition PhoenixPIDController.hpp:157
constexpr double GetErrorDerivativeTolerance() const
Gets the error derivative tolerance of this controller.
Definition PhoenixPIDController.hpp:171
constexpr void DisableContinuousInput()
Disables continuous input.
Definition PhoenixPIDController.hpp:246
constexpr void Reset()
Reset the previous error and the integral term.
Definition PhoenixPIDController.hpp:354
constexpr PhoenixPIDController & operator=(PhoenixPIDController const &)=default
constexpr std::string_view GetTunableType() const override
Gets the tunable table type.
Definition PhoenixPIDController.hpp:393
constexpr double GetAccumulatedError() const
Gets the accumulated error used in the integral calculation of this controller.
Definition PhoenixPIDController.hpp:179
constexpr void EnableContinuousInput(double minimumInput, double maximumInput)
Enables continuous input.
Definition PhoenixPIDController.hpp:236
constexpr double GetErrorTolerance() const
Gets the error tolerance of this controller.
Definition PhoenixPIDController.hpp:164
constexpr void SetIZone(double iZone)
Sets the IZone range.
Definition PhoenixPIDController.hpp:122
constexpr double GetP() const
Gets the proportional coefficient.
Definition PhoenixPIDController.hpp:136
void LogTo(wpi::telemetry::TelemetryTable &table) const override
Logs the object to a wpi::telemetry::TelemetryTable.
constexpr std::string_view GetTelemetryType() const override
Gets the telemetry table type.
Definition PhoenixPIDController.hpp:375
constexpr PhoenixPIDController(double Kp, double Ki, double Kd)
Allocates a PhoenixPIDController with the given constants for Kp, Ki, and Kd.
Definition PhoenixPIDController.hpp:48
constexpr ~PhoenixPIDController() override=default
constexpr double Calculate(double measurement, wpi::units::second_t timestamp)
Returns the next output of the PID controller.
Definition PhoenixPIDController.hpp:299
constexpr double GetI() const
Gets the integral coefficient.
Definition PhoenixPIDController.hpp:143
constexpr void SetPID(double Kp, double Ki, double Kd)
Sets the PID Controller gain parameters.
Definition PhoenixPIDController.hpp:77
constexpr void SetP(double Kp)
Sets the proportional coefficient of the PID controller gain.
Definition PhoenixPIDController.hpp:91
constexpr bool AtSetpoint() const
Returns true if the error is within the tolerance of the setpoint.
Definition PhoenixPIDController.hpp:219
constexpr void SetTolerance(double errorTolerance, double errorDerivativeTolerance=std::numeric_limits< double >::infinity())
Sets the error which is considered tolerable for use with AtSetpoint().
Definition PhoenixPIDController.hpp:275
constexpr void SetSetpoint(double setpoint)
Sets the setpoint for the PIDController.
Definition PhoenixPIDController.hpp:186
constexpr PhoenixPIDController(PhoenixPIDController &&)=default
constexpr double GetD() const
Gets the differential coefficient.
Definition PhoenixPIDController.hpp:150
constexpr bool IsContinuousInputEnabled() const
Returns true if continuous input is enabled.
Definition PhoenixPIDController.hpp:251
constexpr double GetError() const
Returns the difference between the setpoint and the measurement.
Definition PhoenixPIDController.hpp:286
constexpr void SetIntegratorRange(double minimumIntegral, double maximumIntegral)
Sets the minimum and maximum contributions of the integral term.
Definition PhoenixPIDController.hpp:263
constexpr void SetI(double Ki)
Sets the integral coefficient of the PID controller gain.
Definition PhoenixPIDController.hpp:100
constexpr void SetD(double Kd)
Sets the differential coefficient of the PID controller gain.
Definition PhoenixPIDController.hpp:109
constexpr double GetSetpoint() const
Returns the current setpoint of the PIDController.
Definition PhoenixPIDController.hpp:210
constexpr PhoenixPIDController(PhoenixPIDController const &)=default
Definition SwerveModule.hpp:28
Definition ExternalFeedbackConfigs.hpp:16
Definition motor_constants.h:14