12#include "units/angle.h"
13#include "units/angular_velocity.h"
14#include "units/math.h"
15#include "units/voltage.h"
27 using Acceleration = units::compound_unit<units::radians_per_second,
28 units::inverse<units::second>>;
30 units::compound_unit<units::volts,
31 units::inverse<units::radians_per_second>>;
33 units::compound_unit<units::volts, units::inverse<Acceleration>>;
48 units::volt_t kS, units::volt_t kG, units::unit_t<kv_unit> kV,
49 units::unit_t<ka_unit> kA = units::unit_t<ka_unit>(0),
50 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 = 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 = units::unit_t<ka_unit>{0};
66 "period must be a positive number, got {}!", dt.value());
85 [[deprecated(
"Use the current/next velocity overload instead.")]]
87 units::unit_t<Angle> angle, units::unit_t<Velocity> velocity,
88 units::unit_t<Acceleration> acceleration)
const {
89 return kS *
wpi::sgn(velocity) + kG * units::math::cos(angle) +
90 kV * velocity + kA * acceleration;
106 [[deprecated(
"Use the current/next velocity overload instead.")]]
107 units::volt_t
Calculate(units::unit_t<Angle> currentAngle,
108 units::unit_t<Velocity> currentVelocity,
109 units::unit_t<Velocity> nextVelocity,
110 units::second_t dt)
const {
111 return Calculate(currentAngle, currentVelocity, nextVelocity);
126 units::unit_t<Angle> currentAngle,
127 units::unit_t<Velocity> currentVelocity)
const {
128 return kS *
wpi::sgn(currentVelocity) +
129 kG * units::math::cos(currentAngle) + kV * currentVelocity;
144 units::volt_t
Calculate(units::unit_t<Angle> currentAngle,
145 units::unit_t<Velocity> currentVelocity,
146 units::unit_t<Velocity> nextVelocity)
const;
168 units::volt_t maxVoltage, units::unit_t<Angle> angle,
169 units::unit_t<Acceleration> acceleration) {
171 return (maxVoltage - kS - kG * units::math::cos(angle) -
193 units::volt_t maxVoltage, units::unit_t<Angle> angle,
194 units::unit_t<Acceleration> acceleration) {
196 return (-maxVoltage + kS - kG * units::math::cos(angle) -
218 units::volt_t maxVoltage, units::unit_t<Angle> angle,
219 units::unit_t<Velocity> velocity) {
220 return (maxVoltage - kS *
wpi::sgn(velocity) -
221 kG * units::math::cos(angle) - kV * velocity) /
242 units::volt_t maxVoltage, units::unit_t<Angle> angle,
243 units::unit_t<Velocity> velocity) {
244 return MaxAchievableAcceleration(-maxVoltage, angle, velocity);
252 constexpr void SetKs(units::volt_t kS) { this->kS = kS; }
259 constexpr void SetKg(units::volt_t kG) { this->kG = kG; }
266 constexpr void SetKv(units::unit_t<kv_unit> kV) { this->kV = kV; }
273 constexpr void SetKa(units::unit_t<ka_unit> kA) { this->kA = kA; }
280 constexpr units::volt_t
GetKs()
const {
return kS; }
287 constexpr units::volt_t
GetKg()
const {
return kG; }
294 constexpr units::unit_t<kv_unit>
GetKv()
const {
return kV; }
301 constexpr units::unit_t<ka_unit>
GetKa()
const {
return kA; }
311 units::unit_t<kv_unit> kV;
314 units::unit_t<ka_unit> kA;
317 units::second_t m_dt;
#define WPILIB_DLLEXPORT
Definition SymbolExports.h:36
A helper class that computes feedforward outputs for a simple arm (modeled as a motor acting against ...
Definition ArmFeedforward.h:23
units::compound_unit< units::volts, units::inverse< Acceleration > > ka_unit
Definition ArmFeedforward.h:32
units::compound_unit< units::radians_per_second, units::inverse< units::second > > Acceleration
Definition ArmFeedforward.h:27
constexpr units::unit_t< Acceleration > MaxAchievableAcceleration(units::volt_t maxVoltage, units::unit_t< Angle > angle, units::unit_t< Velocity > velocity)
Calculates the maximum achievable acceleration given a maximum voltage supply, a position,...
Definition ArmFeedforward.h:217
units::radians_per_second Velocity
Definition ArmFeedforward.h:26
units::volt_t Calculate(units::unit_t< Angle > currentAngle, units::unit_t< Velocity > currentVelocity, units::unit_t< Velocity > nextVelocity) const
Calculates the feedforward from the gains and setpoints assuming discrete control.
constexpr units::volt_t Calculate(units::unit_t< Angle > currentAngle, units::unit_t< Velocity > currentVelocity) const
Calculates the feedforward from the gains and setpoint assuming discrete control.
Definition ArmFeedforward.h:125
constexpr void SetKs(units::volt_t kS)
Sets the static gain.
Definition ArmFeedforward.h:252
constexpr units::volt_t GetKs() const
Returns the static gain.
Definition ArmFeedforward.h:280
constexpr units::volt_t Calculate(units::unit_t< Angle > angle, units::unit_t< Velocity > velocity, units::unit_t< Acceleration > acceleration) const
Calculates the feedforward from the gains and setpoints assuming continuous control.
Definition ArmFeedforward.h:86
constexpr ArmFeedforward(units::volt_t kS, units::volt_t kG, units::unit_t< kv_unit > kV, units::unit_t< ka_unit > kA=units::unit_t< ka_unit >(0), units::second_t dt=20_ms)
Creates a new ArmFeedforward with the specified gains.
Definition ArmFeedforward.h:47
constexpr units::unit_t< ka_unit > GetKa() const
Returns the acceleration gain.
Definition ArmFeedforward.h:301
constexpr units::unit_t< Acceleration > MinAchievableAcceleration(units::volt_t maxVoltage, units::unit_t< Angle > angle, units::unit_t< Velocity > velocity)
Calculates the minimum achievable acceleration given a maximum voltage supply, a position,...
Definition ArmFeedforward.h:241
units::volt_t Calculate(units::unit_t< Angle > currentAngle, units::unit_t< Velocity > currentVelocity, units::unit_t< Velocity > nextVelocity, units::second_t dt) const
Calculates the feedforward from the gains and setpoints assuming continuous control.
Definition ArmFeedforward.h:107
units::compound_unit< units::volts, units::inverse< units::radians_per_second > > kv_unit
Definition ArmFeedforward.h:29
constexpr void SetKg(units::volt_t kG)
Sets the gravity gain.
Definition ArmFeedforward.h:259
constexpr units::unit_t< kv_unit > GetKv() const
Returns the velocity gain.
Definition ArmFeedforward.h:294
constexpr void SetKa(units::unit_t< ka_unit > kA)
Sets the acceleration gain.
Definition ArmFeedforward.h:273
units::radians Angle
Definition ArmFeedforward.h:25
constexpr void SetKv(units::unit_t< kv_unit > kV)
Sets the velocity gain.
Definition ArmFeedforward.h:266
constexpr units::unit_t< Velocity > MinAchievableVelocity(units::volt_t maxVoltage, units::unit_t< Angle > angle, units::unit_t< Acceleration > acceleration)
Calculates the minimum achievable velocity given a maximum voltage supply, a position,...
Definition ArmFeedforward.h:192
constexpr units::unit_t< Velocity > MaxAchievableVelocity(units::volt_t maxVoltage, units::unit_t< Angle > angle, units::unit_t< Acceleration > acceleration)
Calculates the maximum achievable velocity given a maximum voltage supply, a position,...
Definition ArmFeedforward.h:167
constexpr units::volt_t GetKg() const
Returns the gravity gain.
Definition ArmFeedforward.h:287
static void ReportError(const S &format, Args &&... args)
Definition MathShared.h:48
static void ReportWarning(const S &format, Args &&... args)
Definition MathShared.h:57
Definition SystemServer.h:9
constexpr int sgn(T val)
Definition MathExtras.h:766