40 std::optional<PidGains>
pid{};
50 std::optional<PidGains>
pid = std::nullopt,
68 throw std::invalid_argument(
"MotorCalibration: ticks_to_rad must be > 0");
70 throw std::invalid_argument(
"MotorCalibration: vel_lpf_alpha must be in [0, 1]");
72 throw std::invalid_argument(
"MotorCalibration: bemf_offset must be finite");
74 throw std::invalid_argument(
"MotorCalibration: static_friction_pct must be finite and >= 0");
75 if (
pid && (!std::isfinite(
pid->kp) || !std::isfinite(
pid->ki) || !std::isfinite(
pid->kd)))
76 throw std::invalid_argument(
"MotorCalibration: pid gains must be finite");
88 [[nodiscard]]
double calculate(
double velocity,
double acceleration = 0.0)
const
90 double output =
config.kV * velocity +
config.kA * acceleration;
93 output +=
config.kS * std::copysign(1.0, velocity);
FeedforwardController(Feedforward ff={})
double calculate(double velocity, double acceleration=0.0) const
constexpr double kDefaultEncoderTicksPerRev
Feedforward terms for velocity and acceleration control.
double static_friction_pct
std::optional< PidGains > pid
MotorCalibration(double ticks_to_rad, double vel_lpf_alpha, std::optional< PidGains > pid=std::nullopt, double bemf_offset=0.0, double static_friction_pct=0.0)
MotorCalibration()=default
Basic PID gains without integrator and output shaping parameters.