3#include <frc/geometry/Rotation2d.h>
4#include <frc/geometry/Translation2d.h>
5#include <frc/geometry/Pose2d.h>
7#include <units/velocity.h>
8#include <units/acceleration.h>
9#include <units/length.h>
10#include <units/angle.h>
11#include <units/angular_velocity.h>
12#include <units/angular_acceleration.h>
13#include <units/math.h>
14#include <units/curvature.h>
18#define PI 3.14159265358979323846
20namespace pathplanner {
21namespace GeometryUtil {
22template<
class UnitType,
class = std::enable_if_t<
23 units::traits::is_unit_t<UnitType>::value>>
24constexpr UnitType unitLerp(UnitType
const startVal, UnitType
const endVal,
26 return startVal + (endVal - startVal) * t;
29constexpr double doubleLerp(
const double startVal,
const double endVal,
31 return startVal + (endVal - startVal) * t;
34constexpr frc::Rotation2d rotationLerp(frc::Rotation2d
const startVal,
35 frc::Rotation2d
const endVal,
double const t) {
36 return startVal + ((endVal - startVal) * t);
39constexpr frc::Translation2d translationLerp(frc::Translation2d
const startVal,
40 frc::Translation2d
const endVal,
double const t) {
41 return startVal + ((endVal - startVal) * t);
44constexpr frc::Translation2d quadraticLerp(frc::Translation2d
const a,
45 frc::Translation2d
const b, frc::Translation2d
const c,
47 frc::Translation2d
const p0 = translationLerp(a, b, t);
48 frc::Translation2d
const p1 = translationLerp(b, c, t);
49 return translationLerp(p0, p1, t);
52constexpr frc::Translation2d cubicLerp(frc::Translation2d
const a,
53 frc::Translation2d
const b, frc::Translation2d
const c,
54 frc::Translation2d
const d,
double const t) {
55 frc::Translation2d
const p0 = quadraticLerp(a, b, c, t);
56 frc::Translation2d
const p1 = quadraticLerp(b, c, d, t);
57 return translationLerp(p0, p1, t);
60constexpr frc::Rotation2d cosineInterpolate(frc::Rotation2d
const y1,
61 frc::Rotation2d
const y2,
double const mu) {
62 double const mu2 = (1 - frc::Rotation2d(units::radian_t { mu * PI }).Cos())
64 return frc::Rotation2d(y1.Radians() * (1 - mu2) + y2.Radians() * mu2);
67units::meter_t calculateRadius(
const frc::Translation2d a,
68 const frc::Translation2d b,
const frc::Translation2d c);
70template<
class UnitType,
class = std::enable_if_t<
71 units::traits::is_unit_t<UnitType>::value>>
72inline UnitType modulo(UnitType
const a, UnitType
const b) {
73 return a - (b * units::math::floor(a / b));
76template<
class UnitType,
class = std::enable_if_t<
77 units::traits::is_unit_t<UnitType>::value>>
78inline bool isFinite(UnitType
const u) {
79 return std::isfinite(u());
82template<
class UnitType,
class = std::enable_if_t<
83 units::traits::is_unit_t<UnitType>::value>>
84inline bool isNaN(UnitType
const u) {
85 return std::isnan(u());