PathPlannerLib
Loading...
Searching...
No Matches
GeometryUtil.h
1#pragma once
2
3#include <frc/geometry/Rotation2d.h>
4#include <frc/geometry/Translation2d.h>
5#include <frc/geometry/Pose2d.h>
6#include <units/time.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>
15#include <math.h>
16#include <type_traits>
17
18#define PI 3.14159265358979323846
19
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,
25 double const t) {
26 return startVal + (endVal - startVal) * t;
27}
28
29constexpr double doubleLerp(const double startVal, const double endVal,
30 const double t) {
31 return startVal + (endVal - startVal) * t;
32}
33
34constexpr frc::Rotation2d rotationLerp(frc::Rotation2d const startVal,
35 frc::Rotation2d const endVal, double const t) {
36 return startVal + ((endVal - startVal) * t);
37}
38
39constexpr frc::Translation2d translationLerp(frc::Translation2d const startVal,
40 frc::Translation2d const endVal, double const t) {
41 return startVal + ((endVal - startVal) * t);
42}
43
44constexpr frc::Translation2d quadraticLerp(frc::Translation2d const a,
45 frc::Translation2d const b, frc::Translation2d const c,
46 double const t) {
47 frc::Translation2d const p0 = translationLerp(a, b, t);
48 frc::Translation2d const p1 = translationLerp(b, c, t);
49 return translationLerp(p0, p1, t);
50}
51
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);
58}
59
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())
63 / 2;
64 return frc::Rotation2d(y1.Radians() * (1 - mu2) + y2.Radians() * mu2);
65}
66
67units::meter_t calculateRadius(const frc::Translation2d a,
68 const frc::Translation2d b, const frc::Translation2d c);
69
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));
74}
75
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());
80}
81
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());
86}
87}
88}