15#include "core/math/units.h"
25template <
typename T,
typename U>
43 PID(kPType kP, kIType kI, kDType kD, T deadband, units::Time on_target_time)
44 : kP_(kP), kI_(kI), kD_(kD), deadband_(deadband), on_target_time_(on_target_time) {
50 this->accum_error_ = T();
51 this->last_error_ = T();
63 U
update(
const double& state,
const double& reference,
const units::Time& dt = 10_ms)
override {
65 this->reference_ = reference;
67 const T current_error = this->reference_ - this->state_;
68 const T delta_error = current_error - this->last_error_;
70 accum_error_ += current_error;
72 const U p_out = kP_ * current_error;
74 const U i_out = kI_ * accum_error_;
76 const U d_out = kP_ * delta_error;
78 this->last_error_ = current_error;
80 if (std::abs(current_error) < deadband_) {
81 last_target_time_ += dt;
83 last_target_time_ = 0_ms;
86 if (last_target_time_ > on_target_time_) {
92 this->output_ = p_out + i_out + d_out;
94 this->output_ = clamp(this->output_, this->output_min_, this->output_max_);
106 units::Time on_target_time_;
110 units::Time last_target_time_;
pure virtual class for generic feedback control loops.
Definition feedback.h:21
bool get_on_target()
Gets the on target state of the PID controller.
Definition pid.h:100
U update(const double &state, const double &reference, const units::Time &dt=10_ms) override
Updates the control loop output.
Definition pid.h:63
PID(kPType kP, kIType kI, kDType kD, T deadband, units::Time on_target_time)
PID controller object constructor.
Definition pid.h:43
void reset() override
Definition pid.h:49
A pure virual class to function as an interface for all feedback control loops.
Quantity< std::ratio_subtract< typename Q1::mass, typename Q2::mass >, std::ratio_subtract< typename Q1::length, typename Q2::length >, std::ratio_subtract< typename Q1::time, typename Q2::time >, std::ratio_subtract< typename Q1::current, typename Q2::current >, std::ratio_subtract< typename Q1::angle, typename Q2::angle >, std::ratio_subtract< typename Q1::temperature, typename Q2::temperature >, std::ratio_subtract< typename Q1::luminosity, typename Q2::luminosity >, std::ratio_subtract< typename Q1::moles, typename Q2::moles > > Divided
Dividing quantities subtracts their dimensions.
Definition units.h:206
Quantity< std::ratio_add< typename Q1::mass, typename Q2::mass >, std::ratio_add< typename Q1::length, typename Q2::length >, std::ratio_add< typename Q1::time, typename Q2::time >, std::ratio_add< typename Q1::current, typename Q2::current >, std::ratio_add< typename Q1::angle, typename Q2::angle >, std::ratio_add< typename Q1::temperature, typename Q2::temperature >, std::ratio_add< typename Q1::luminosity, typename Q2::luminosity >, std::ratio_add< typename Q1::moles, typename Q2::moles > > Multiplied
Multiplying quantities adds their dimensions.
Definition units.h:194