15#include "units/angle.h"
16#include "units/base.h"
17#include "units/length.h"
18#include "units/math.h"
19#include "units/time.h"
20#include "units/velocity.h"
37 requires std::is_arithmetic_v<T> || units::traits::is_unit_t_v<T>
38constexpr T
ApplyDeadband(T value, T deadband, T maxMagnitude = T{1.0}) {
40 if constexpr (std::is_arithmetic_v<T>) {
43 magnitude = units::math::abs(value);
46 if (magnitude < deadband) {
71 return (1.0 + deadband / (maxMagnitude - deadband)) * (value - deadband);
93 return (1.0 + deadband / (maxMagnitude - deadband)) * (value + deadband);
108template <
typename T,
int N>
109 requires std::is_arithmetic_v<T> || units::traits::is_unit_t_v<T>
110Eigen::Vector<T, N>
ApplyDeadband(
const Eigen::Vector<T, N>& value, T deadband,
111 T maxMagnitude = T{1.0}) {
112 if constexpr (std::is_arithmetic_v<T>) {
113 if (value.norm() < T{1e-9}) {
114 return Eigen::Vector<T, N>::Zero();
116 return value.normalized() *
119 const Eigen::Vector<double, N> asDouble = value.template cast<double>();
120 const Eigen::Vector<double, N> processed =
121 ApplyDeadband(asDouble, deadband.value(), maxMagnitude.value());
122 return processed.template cast<T>();
145 requires std::is_arithmetic_v<T> || units::traits::is_unit_t_v<T>
147 T maxMagnitude = T{1.0}) {
148 if constexpr (std::is_arithmetic_v<T>) {
153 return units::math::copysign(
154 gcem::pow((units::math::abs(value) / maxMagnitude).value(), exponent) *
178template <
typename T,
int N>
179 requires std::is_arithmetic_v<T> || units::traits::is_unit_t_v<T>
181 double exponent, T maxMagnitude = T{1.0}) {
182 if constexpr (std::is_arithmetic_v<T>) {
183 if (value.norm() < T{1e-9}) {
184 return Eigen::Vector<T, N>::Zero();
186 return value.normalized() *
189 const Eigen::Vector<double, N> asDouble = value.template cast<double>();
190 const Eigen::Vector<double, N> processed =
192 return processed.template cast<T>();
205 T modulus = maximumInput - minimumInput;
208 int numMax = (input - minimumInput) / modulus;
209 input -= numMax * modulus;
212 int numMin = (input - maximumInput) / modulus;
213 input -= numMin * modulus;
229 requires std::is_arithmetic_v<T> || units::traits::is_unit_t_v<T>
230constexpr bool IsNear(T expected, T actual, T tolerance) {
231 if constexpr (std::is_arithmetic_v<T>) {
232 return std::abs(expected - actual) < tolerance;
234 return units::math::abs(expected - actual) < tolerance;
258 requires std::is_arithmetic_v<T> || units::traits::is_unit_t_v<T>
259constexpr bool IsNear(T expected, T actual, T tolerance, T min, T max) {
260 T errorBound = (max - min) / 2.0;
263 if constexpr (std::is_arithmetic_v<T>) {
264 return std::abs(error) < tolerance;
266 return units::math::abs(error) < tolerance;
278 units::radian_t{-std::numbers::pi},
279 units::radian_t{std::numbers::pi});
293constexpr std::signed_integral
auto FloorDiv(std::signed_integral
auto x,
294 std::signed_integral
auto y) {
298 if ((x < 0) != (y < 0) && rem != 0) {
315constexpr std::signed_integral
auto FloorMod(std::signed_integral
auto x,
316 std::signed_integral
auto y) {
332 units::meters_per_second_t maxVelocity) {
333 if (maxVelocity < 0_mps) {
335 "maxVelocity must be a non-negative number, got {}!", maxVelocity);
339 units::meter_t dist = diff.
Norm();
343 if (dist > maxVelocity * dt) {
346 return current + diff * (maxVelocity * dt / dist);
363 units::meters_per_second_t maxVelocity) {
364 if (maxVelocity < 0_mps) {
366 "maxVelocity must be a non-negative number, got {}!", maxVelocity);
370 units::meter_t dist = diff.
Norm();
374 if (dist > maxVelocity * dt) {
377 return current + diff * (maxVelocity * dt / dist);
#define WPILIB_DLLEXPORT
Definition SymbolExports.h:36
Represents a translation in 2D space.
Definition Translation2d.h:30
constexpr units::meter_t Norm() const
Returns the norm, or distance from the origin to the translation.
Definition Translation2d.h:124
Represents a translation in 3D space.
Definition Translation3d.h:31
constexpr units::meter_t Norm() const
Returns the norm, or distance from the origin to the translation.
Definition Translation3d.h:153
static void ReportError(const S &format, Args &&... args)
Definition MathShared.h:48
Definition SystemServer.h:9
constexpr T ApplyDeadband(T value, T deadband, T maxMagnitude=T{1.0})
Returns 0.0 if the given value is within the specified range around zero.
Definition MathUtil.h:38
constexpr std::signed_integral auto FloorMod(std::signed_integral auto x, std::signed_integral auto y)
Returns the floor modulus of the int arguments.
Definition MathUtil.h:315
WPILIB_DLLEXPORT constexpr units::radian_t AngleModulus(units::radian_t angle)
Wraps an angle to the range -π to π radians (-180 to 180 degrees).
Definition MathUtil.h:276
constexpr bool IsNear(T expected, T actual, T tolerance)
Checks if the given value matches an expected value within a certain tolerance.
Definition MathUtil.h:230
constexpr std::signed_integral auto FloorDiv(std::signed_integral auto x, std::signed_integral auto y)
Returns the largest (closest to positive infinity) int value that is less than or equal to the algebr...
Definition MathUtil.h:293
constexpr Translation2d SlewRateLimit(const Translation2d ¤t, const Translation2d &next, units::second_t dt, units::meters_per_second_t maxVelocity)
Limits translation velocity.
Definition MathUtil.h:329
constexpr T InputModulus(T input, T minimumInput, T maximumInput)
Returns modulus of input.
Definition MathUtil.h:204
constexpr T CopyDirectionPow(T value, double exponent, T maxMagnitude=T{1.0})
Raises the input to the power of the given exponent while preserving its sign.
Definition MathUtil.h:146
constexpr T abs(const T x) noexcept
Compile-time absolute value function.
Definition abs.hpp:40
constexpr T1 copysign(const T1 x, const T2 y) noexcept
Compile-time copy sign function.
Definition copysign.hpp:41
constexpr common_t< T1, T2 > pow(const T1 base, const T2 exp_term) noexcept
Compile-time power function.
Definition pow.hpp:82