10#include "wpi/units/angle.hpp"
11#include "wpi/units/length.hpp"
12#include "wpi/units/time.hpp"
13#include "wpi/units/voltage.hpp"
22template <
class Distance>
23 requires wpi::units::length_unit<Distance> || wpi::units::angle_unit<Distance>
27 wpi::units::compound_unit<Distance,
28 wpi::units::inverse<wpi::units::seconds>>;
31 wpi::units::inverse<wpi::units::seconds>>;
32 using kv_unit = wpi::units::compound_unit<wpi::units::volts,
33 wpi::units::inverse<Velocity>>;
34 using ka_unit = wpi::units::compound_unit<wpi::units::volts,
35 wpi::units::inverse<Acceleration>>;
49 wpi::units::volt_t kS, wpi::units::unit_t<kv_unit> kV,
50 wpi::units::unit_t<ka_unit> kA = wpi::units::unit_t<ka_unit>(0),
51 wpi::units::second_t dt = 20_ms)
52 : kS(kS), kV(kV), kA(kA), m_dt(dt) {
54 wpi::math::MathSharedStore::ReportError(
55 "kV must be a non-negative number, got {}!", kV.value());
56 this->kV = wpi::units::unit_t<kv_unit>{0};
60 wpi::math::MathSharedStore::ReportError(
61 "kA must be a non-negative number, got {}!", kA.value());
62 this->kA = wpi::units::unit_t<ka_unit>{0};
67 "period must be a positive number, got {}!", dt.value());
82 wpi::units::unit_t<Velocity> velocity)
const {
97 wpi::units::unit_t<Velocity> currentVelocity,
98 wpi::units::unit_t<Velocity> nextVelocity)
const {
100 if (kA <
decltype(kA)(1e-9)) {
103 double A = -kV.value() / kA.value();
104 double B = 1.0 / kA.value();
105 double A_d =
gcem::exp(A * m_dt.value());
106 double B_d = A > -1e-9 ? B * m_dt.value() : 1.0 / A * (A_d - 1.0) * B;
110 (nextVelocity.value() - A_d * currentVelocity.value())};
129 wpi::units::volt_t maxVoltage,
130 wpi::units::unit_t<Acceleration> acceleration)
const {
132 return (maxVoltage - kS - kA * acceleration) / kV;
147 wpi::units::volt_t maxVoltage,
148 wpi::units::unit_t<Acceleration> acceleration)
const {
150 return (-maxVoltage + kS - kA * acceleration) / kV;
165 wpi::units::volt_t maxVoltage,
166 wpi::units::unit_t<Velocity> velocity)
const {
167 return (maxVoltage - kS *
wpi::util::sgn(velocity) - kV * velocity) / kA;
182 wpi::units::volt_t maxVoltage,
183 wpi::units::unit_t<Velocity> velocity)
const {
192 constexpr void SetKs(wpi::units::volt_t kS) { this->kS = kS; }
199 constexpr void SetKv(wpi::units::unit_t<kv_unit> kV) { this->kV = kV; }
206 constexpr void SetKa(wpi::units::unit_t<ka_unit> kA) { this->kA = kA; }
213 constexpr wpi::units::volt_t
GetKs()
const {
return kS; }
220 constexpr wpi::units::unit_t<kv_unit>
GetKv()
const {
return kV; }
227 constexpr wpi::units::unit_t<ka_unit>
GetKa()
const {
return kA; }
234 constexpr wpi::units::second_t
GetDt()
const {
return m_dt; }
238 wpi::units::volt_t kS;
241 wpi::units::unit_t<kv_unit> kV;
244 wpi::units::unit_t<ka_unit> kA;
247 wpi::units::second_t m_dt;
static void ReportError(const S &format, Args &&... args)
Definition MathShared.hpp:48
static void ReportWarning(const S &format, Args &&... args)
Definition MathShared.hpp:57
wpi::units::compound_unit< wpi::units::volts, wpi::units::inverse< Acceleration > > ka_unit
Definition SimpleMotorFeedforward.hpp:34
constexpr void SetKa(wpi::units::unit_t< ka_unit > kA)
Sets the acceleration gain.
Definition SimpleMotorFeedforward.hpp:206
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 SimpleMotorFeedforward.hpp:96
constexpr SimpleMotorFeedforward(wpi::units::volt_t kS, 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 SimpleMotorFeedforward with the specified gains.
Definition SimpleMotorFeedforward.hpp:48
constexpr wpi::units::unit_t< Acceleration > MaxAchievableAcceleration(wpi::units::volt_t maxVoltage, wpi::units::unit_t< Velocity > velocity) const
Calculates the maximum achievable acceleration given a maximum voltage supply and a velocity.
Definition SimpleMotorFeedforward.hpp:164
wpi::units::compound_unit< wpi::units::volts, wpi::units::inverse< Velocity > > kv_unit
Definition SimpleMotorFeedforward.hpp:32
constexpr wpi::units::volt_t Calculate(wpi::units::unit_t< Velocity > velocity) const
Calculates the feedforward from the gains and velocity setpoint assuming discrete control.
Definition SimpleMotorFeedforward.hpp:81
constexpr wpi::units::second_t GetDt() const
Returns the period.
Definition SimpleMotorFeedforward.hpp:234
constexpr wpi::units::volt_t GetKs() const
Returns the static gain.
Definition SimpleMotorFeedforward.hpp:213
constexpr wpi::units::unit_t< Velocity > MaxAchievableVelocity(wpi::units::volt_t maxVoltage, wpi::units::unit_t< Acceleration > acceleration) const
Calculates the maximum achievable velocity given a maximum voltage supply and an acceleration.
Definition SimpleMotorFeedforward.hpp:128
constexpr wpi::units::unit_t< Acceleration > MinAchievableAcceleration(wpi::units::volt_t maxVoltage, wpi::units::unit_t< Velocity > velocity) const
Calculates the minimum achievable acceleration given a maximum voltage supply and a velocity.
Definition SimpleMotorFeedforward.hpp:181
constexpr wpi::units::unit_t< kv_unit > GetKv() const
Returns the velocity gain.
Definition SimpleMotorFeedforward.hpp:220
wpi::units::compound_unit< Velocity, wpi::units::inverse< wpi::units::seconds > > Acceleration
Definition SimpleMotorFeedforward.hpp:29
constexpr void SetKv(wpi::units::unit_t< kv_unit > kV)
Sets the velocity gain.
Definition SimpleMotorFeedforward.hpp:199
wpi::units::compound_unit< Distance, wpi::units::inverse< wpi::units::seconds > > Velocity
Definition SimpleMotorFeedforward.hpp:26
constexpr wpi::units::unit_t< ka_unit > GetKa() const
Returns the acceleration gain.
Definition SimpleMotorFeedforward.hpp:227
constexpr wpi::units::unit_t< Velocity > MinAchievableVelocity(wpi::units::volt_t maxVoltage, wpi::units::unit_t< Acceleration > acceleration) const
Calculates the minimum achievable velocity given a maximum voltage supply and an acceleration.
Definition SimpleMotorFeedforward.hpp:146
constexpr void SetKs(wpi::units::volt_t kS)
Sets the static gain.
Definition SimpleMotorFeedforward.hpp:192
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