3#include "../utils/time.h"
4#include "../world_interface/data.h"
20 double kP, kI, kD, kF;
21 std::optional<double> iZone;
52 for (
int i = 0; i < dim; i++) {
67 return setPoint.has_value();
76 this->setPoint = setPoint;
87 if (!setPoint.has_value()) {
88 return Arrayd<dim>::Zero();
93 Arrayd<dim> err = setPoint.value() - currValue;
94 Arrayd<dim> pTerm = err * kP;
95 Arrayd<dim> fTerm = setPoint.value() * kF;
97 Arrayd<dim> iTerm = Arrayd<dim>::Zero();
98 Arrayd<dim> dTerm = Arrayd<dim>::Zero();
100 if (lastData.has_value()) {
102 auto [lastTime, lastValue] = lastData.value();
106 Arrayd<dim> derivative = (currValue - lastValue) / dtSec;
107 dTerm = derivative * kD;
110 Arrayd<dim> area = (lastValue + currValue) * dtSec / 2.0;
112 iTerm = (err.abs() <= iZone).select(iAccum * kI, Arrayd<dim>::Zero());
115 lastData = {currTime, currValue};
116 Arrayd<dim> output = pTerm + iTerm + dTerm + fTerm;
131 Arrayd<dim> kP, kI, kD, kF;
134 std::optional<Arrayd<dim>> setPoint;
135 std::optional<std::pair<robot::types::datatime_t, Arrayd<dim>>> lastData;
static constexpr _Tp infinity() noexcept
bool hasTarget()
Check if a target is currently set.
Definition PIDControl.h:66
void reset()
Reset the controller.
Definition PIDControl.h:124
void setTarget(const Arrayd< dim > &setPoint)
Set the target of the controller.
Definition PIDControl.h:75
Arrayd< dim > getOutput(robot::types::datatime_t currTime, const Arrayd< dim > &currValue)
Get the output from the controller.
Definition PIDControl.h:86
PIDController(const std::array< PIDGains, dim > &gains)
Construct a new PIDController.
Definition PIDControl.h:41
void setGains(const std::array< PIDGains, dim > &gains)
Set the gains of the PID controller.
Definition PIDControl.h:51
std::chrono::time_point< dataclock > datatime_t
A point in time as measured by dataclock.
Definition data.h:31
double durationToSec(std::chrono::duration< Rep, Period > dur)
Convert a duration to seconds, as a double.
Definition time.h:18
A set of PID gains.
Definition PIDControl.h:19