LightLib
PROS library for VEX V5: EKF/MCL localization, RAMSETE path following, high-level chassis API
Loading...
Searching...
No Matches
iterativePosPidController.hpp
Go to the documentation of this file.
1/*
2 * Based on the Arduino PID controller: https://github.com/br3ttb/Arduino-PID-Library
3 *
4 * This Source Code Form is subject to the terms of the Mozilla Public
5 * License, v. 2.0. If a copy of the MPL was not distributed with this
6 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 */
8#pragma once
9
16#include <limits>
17#include <memory>
18
19namespace okapi {
21 public:
22 struct Gains {
23 double kP{0};
24 double kI{0};
25 double kD{0};
26 double kBias{0};
27
28 bool operator==(const Gains &rhs) const;
29 bool operator!=(const Gains &rhs) const;
30 };
31
44 double ikP,
45 double ikI,
46 double ikD,
47 double ikBias,
48 const TimeUtil &itimeUtil,
49 std::unique_ptr<Filter> iderivativeFilter = std::make_unique<PassthroughFilter>(),
50 std::shared_ptr<Logger> ilogger = Logger::getDefaultLogger());
51
60 const Gains &igains,
61 const TimeUtil &itimeUtil,
62 std::unique_ptr<Filter> iderivativeFilter = std::make_unique<PassthroughFilter>(),
63 std::shared_ptr<Logger> ilogger = Logger::getDefaultLogger());
64
72 double step(double inewReading) override;
73
79 void setTarget(double itarget) override;
80
87 void controllerSet(double ivalue) override;
88
94 double getTarget() override;
95
101 double getTarget() const;
102
106 double getProcessValue() const override;
107
112 double getOutput() const override;
113
119 double getMaxOutput() override;
120
126 double getMinOutput() override;
127
131 double getError() const override;
132
141 bool isSettled() override;
142
148 void setSampleTime(QTime isampleTime) override;
149
156 void setOutputLimits(double imax, double imin) override;
157
165 void setControllerSetTargetLimits(double itargetMax, double itargetMin) override;
166
171 void reset() override;
172
177 void flipDisable() override;
178
185 void flipDisable(bool iisDisabled) override;
186
192 bool isDisabled() const override;
193
199 QTime getSampleTime() const override;
200
207 virtual void setIntegralLimits(double imax, double imin);
208
217 virtual void setErrorSumLimits(double imax, double imin);
218
224 virtual void setIntegratorReset(bool iresetOnZero);
225
231 virtual void setGains(const Gains &igains);
232
239
240 protected:
241 std::shared_ptr<Logger> logger;
242 double kP, kI, kD, kBias;
243 QTime sampleTime{10_ms};
244 double target{0};
245 double lastReading{0};
246 double error{0};
247 double lastError{0};
248 std::unique_ptr<Filter> derivativeFilter;
249
250 // Integral bounds
251 double integral{0};
252 double integralMax{1};
253 double integralMin{-1};
254
255 // Error will only be added to the integral term within these bounds on either side of the target
256 double errorSumMin{0};
257 double errorSumMax{std::numeric_limits<double>::max()};
258
259 double derivative{0};
260
261 // Output bounds
262 double output{0};
263 double outputMax{1};
264 double outputMin{-1};
267
268 // Reset the integrated when the controller crosses 0 or not
270
272
273 std::unique_ptr<AbstractTimer> loopDtTimer;
274 std::unique_ptr<SettledUtil> settledUtil;
275};
276} // namespace okapi
void reset() override
Resets the controller's internal state so it is similar to when it was first initialized,...
QTime getSampleTime() const override
Get the last set sample time.
double getTarget() override
Gets the last set target, or the default target if none was set.
IterativePosPIDController(double ikP, double ikI, double ikD, double ikBias, const TimeUtil &itimeUtil, std::unique_ptr< Filter > iderivativeFilter=std::make_unique< PassthroughFilter >(), std::shared_ptr< Logger > ilogger=Logger::getDefaultLogger())
Position PID controller.
virtual void setIntegratorReset(bool iresetOnZero)
Set whether the integrator should be reset when error is 0 or changes sign.
double getMinOutput() override
Get the lower output bound.
void setControllerSetTargetLimits(double itargetMax, double itargetMin) override
Sets the (soft) limits for the target range that controllerSet() scales into.
void setTarget(double itarget) override
Sets the target for the controller.
virtual void setGains(const Gains &igains)
Set controller gains.
void flipDisable(bool iisDisabled) override
Sets whether the controller is off or on.
double getError() const override
Returns the last error of the controller.
void setOutputLimits(double imax, double imin) override
Set controller output bounds.
double getMaxOutput() override
Get the upper output bound.
bool isSettled() override
Returns whether the controller has settled at the target.
bool isDisabled() const override
Returns whether the controller is currently disabled.
void setSampleTime(QTime isampleTime) override
Set time between loops in ms.
double getTarget() const
Gets the last set target, or the default target if none was set.
void flipDisable() override
Changes whether the controller is off or on.
Gains getGains() const
Gets the current gains.
std::unique_ptr< AbstractTimer > loopDtTimer
void controllerSet(double ivalue) override
Writes the value of the controller output.
IterativePosPIDController(const Gains &igains, const TimeUtil &itimeUtil, std::unique_ptr< Filter > iderivativeFilter=std::make_unique< PassthroughFilter >(), std::shared_ptr< Logger > ilogger=Logger::getDefaultLogger())
Position PID controller.
double step(double inewReading) override
Do one iteration of the controller.
double getProcessValue() const override
std::unique_ptr< SettledUtil > settledUtil
double getOutput() const override
Returns the last calculated output of the controller.
virtual void setIntegralLimits(double imax, double imin)
Set integrator bounds.
virtual void setErrorSumLimits(double imax, double imin)
Set the error sum bounds.
static std::shared_ptr< Logger > getDefaultLogger()
Utility class for holding an AbstractTimer, AbstractRate, and SettledUtil together in one class since...
Definition timeUtil.hpp:18
bool operator==(const Gains &rhs) const
bool operator!=(const Gains &rhs) const