10#include "wpi/units/length.hpp"
11#include "wpi/units/time.hpp"
12#include "wpi/units/voltage.hpp"
25 wpi::units::inverse<wpi::units::seconds>>;
28 wpi::units::inverse<wpi::units::seconds>>;
29 using kv_unit = wpi::units::compound_unit<wpi::units::volts,
30 wpi::units::inverse<Velocity>>;
31 using ka_unit = wpi::units::compound_unit<wpi::units::volts,
32 wpi::units::inverse<Acceleration>>;
47 wpi::units::volt_t kS, wpi::units::volt_t kG,
48 wpi::units::unit_t<kv_unit> kV,
49 wpi::units::unit_t<ka_unit> kA = wpi::units::unit_t<ka_unit>(0),
50 wpi::units::second_t dt = 20_ms)
51 : kS(kS), kG(kG), kV(kV), kA(kA), m_dt(dt) {
53 wpi::math::MathSharedStore::ReportError(
54 "kV must be a non-negative number, got {}!", kV.value());
55 this->kV = wpi::units::unit_t<kv_unit>{0};
59 wpi::math::MathSharedStore::ReportError(
60 "kA must be a non-negative number, got {}!", kA.value());
61 this->kA = wpi::units::unit_t<ka_unit>{0};
66 "period must be a positive number, got {}!", dt.value());
80 wpi::units::unit_t<Velocity> currentVelocity)
const {
81 return Calculate(currentVelocity, currentVelocity);
95 wpi::units::unit_t<Velocity> currentVelocity,
96 wpi::units::unit_t<Velocity> nextVelocity)
const {
98 if (kA <
decltype(kA)(1e-9)) {
101 double A = -kV.value() / kA.value();
102 double B = 1.0 / kA.value();
103 double A_d =
gcem::exp(A * m_dt.value());
104 double B_d = A > -1e-9 ? B * m_dt.value() : 1.0 / A * (A_d - 1.0) * B;
108 (nextVelocity.value() - A_d * currentVelocity.value())};
127 wpi::units::volt_t maxVoltage,
128 wpi::units::unit_t<Acceleration> acceleration) {
130 return (maxVoltage - kS - kG - kA * acceleration) / kV;
145 wpi::units::volt_t maxVoltage,
146 wpi::units::unit_t<Acceleration> acceleration) {
148 return (-maxVoltage + kS - kG - kA * acceleration) / kV;
163 wpi::units::volt_t maxVoltage, wpi::units::unit_t<Velocity> velocity) {
164 return (maxVoltage - kS *
wpi::util::sgn(velocity) - kG - kV * velocity) /
180 wpi::units::volt_t maxVoltage, wpi::units::unit_t<Velocity> velocity) {
189 constexpr void SetKs(wpi::units::volt_t kS) { this->kS = kS; }
196 constexpr void SetKg(wpi::units::volt_t kG) { this->kG = kG; }
203 constexpr void SetKv(wpi::units::unit_t<kv_unit> kV) { this->kV = kV; }
210 constexpr void SetKa(wpi::units::unit_t<ka_unit> kA) { this->kA = kA; }
217 constexpr wpi::units::volt_t
GetKs()
const {
return kS; }
224 constexpr wpi::units::volt_t
GetKg()
const {
return kG; }
231 constexpr wpi::units::unit_t<kv_unit>
GetKv()
const {
return kV; }
238 constexpr wpi::units::unit_t<ka_unit>
GetKa()
const {
return kA; }
242 wpi::units::volt_t kS;
245 wpi::units::volt_t kG;
248 wpi::units::unit_t<kv_unit> kV;
251 wpi::units::unit_t<ka_unit> kA;
254 wpi::units::second_t m_dt;
wpi::units::compound_unit< wpi::units::volts, wpi::units::inverse< Velocity > > kv_unit
Definition ElevatorFeedforward.hpp:29
constexpr void SetKa(wpi::units::unit_t< ka_unit > kA)
Sets the acceleration gain.
Definition ElevatorFeedforward.hpp:210
constexpr wpi::units::volt_t Calculate(wpi::units::unit_t< Velocity > currentVelocity) const
Calculates the feedforward from the gains and setpoint assuming discrete control.
Definition ElevatorFeedforward.hpp:79
wpi::units::meters Distance
Definition ElevatorFeedforward.hpp:22
constexpr wpi::units::unit_t< ka_unit > GetKa() const
Returns the acceleration gain.
Definition ElevatorFeedforward.hpp:238
constexpr ElevatorFeedforward(wpi::units::volt_t kS, wpi::units::volt_t kG, wpi::units::unit_t< kv_unit > kV, wpi::units::unit_t< ka_unit > kA=wpi::units::unit_t< ka_unit >(0), wpi::units::second_t dt=20_ms)
Creates a new ElevatorFeedforward with the specified gains.
Definition ElevatorFeedforward.hpp:46
wpi::units::compound_unit< Distance, wpi::units::inverse< wpi::units::seconds > > Velocity
Definition ElevatorFeedforward.hpp:23
constexpr wpi::units::unit_t< Velocity > MaxAchievableVelocity(wpi::units::volt_t maxVoltage, wpi::units::unit_t< Acceleration > acceleration)
Calculates the maximum achievable velocity given a maximum voltage supply and an acceleration.
Definition ElevatorFeedforward.hpp:126
constexpr void SetKv(wpi::units::unit_t< kv_unit > kV)
Sets the velocity gain.
Definition ElevatorFeedforward.hpp:203
wpi::units::compound_unit< Velocity, wpi::units::inverse< wpi::units::seconds > > Acceleration
Definition ElevatorFeedforward.hpp:26
constexpr wpi::units::volt_t GetKg() const
Returns the gravity gain.
Definition ElevatorFeedforward.hpp:224
constexpr void SetKg(wpi::units::volt_t kG)
Sets the gravity gain.
Definition ElevatorFeedforward.hpp:196
constexpr wpi::units::unit_t< Acceleration > MaxAchievableAcceleration(wpi::units::volt_t maxVoltage, wpi::units::unit_t< Velocity > velocity)
Calculates the maximum achievable acceleration given a maximum voltage supply and a velocity.
Definition ElevatorFeedforward.hpp:162
constexpr void SetKs(wpi::units::volt_t kS)
Sets the static gain.
Definition ElevatorFeedforward.hpp:189
constexpr wpi::units::volt_t GetKs() const
Returns the static gain.
Definition ElevatorFeedforward.hpp:217
constexpr wpi::units::unit_t< Velocity > MinAchievableVelocity(wpi::units::volt_t maxVoltage, wpi::units::unit_t< Acceleration > acceleration)
Calculates the minimum achievable velocity given a maximum voltage supply and an acceleration.
Definition ElevatorFeedforward.hpp:144
constexpr wpi::units::volt_t Calculate(wpi::units::unit_t< Velocity > currentVelocity, wpi::units::unit_t< Velocity > nextVelocity) const
Calculates the feedforward from the gains and setpoints assuming discrete control.
Definition ElevatorFeedforward.hpp:94
constexpr wpi::units::unit_t< Acceleration > MinAchievableAcceleration(wpi::units::volt_t maxVoltage, wpi::units::unit_t< Velocity > velocity)
Calculates the minimum achievable acceleration given a maximum voltage supply and a velocity.
Definition ElevatorFeedforward.hpp:179
wpi::units::compound_unit< wpi::units::volts, wpi::units::inverse< Acceleration > > ka_unit
Definition ElevatorFeedforward.hpp:31
constexpr wpi::units::unit_t< kv_unit > GetKv() const
Returns the velocity gain.
Definition ElevatorFeedforward.hpp:231
static void ReportError(const S &format, Args &&... args)
Definition MathShared.hpp:48
static void ReportWarning(const S &format, Args &&... args)
Definition MathShared.hpp:57
constexpr return_t< T > exp(const T x) noexcept
Compile-time exponential function.
Definition exp.hpp:130
Definition LinearSystem.hpp:20
constexpr int sgn(T val)
Definition MathExtras.hpp:766