PathPlannerLib
Loading...
Searching...
No Matches
FlippingUtil.h
1#pragma once
2
3#include <frc/geometry/Translation2d.h>
4#include <frc/geometry/Rotation2d.h>
5#include <frc/geometry/Pose2d.h>
6#include <frc/kinematics/ChassisSpeeds.h>
7#include <vector>
8
9namespace pathplanner {
11public:
12 enum FieldSymmetry {
13 kRotational, kMirrored
14 };
15
16 static FieldSymmetry symmetryType;
17 static units::meter_t fieldSizeX;
18 static units::meter_t fieldSizeY;
19
26 static inline frc::Translation2d flipFieldPosition(
27 const frc::Translation2d &pos) {
28 switch (symmetryType) {
29 case kRotational:
30 return frc::Translation2d(fieldSizeX - pos.X(),
31 fieldSizeY - pos.Y());
32 case kMirrored:
33 default:
34 return frc::Translation2d(fieldSizeX - pos.X(), pos.Y());
35 }
36 }
37
44 static inline frc::Rotation2d flipFieldRotation(
45 const frc::Rotation2d &rotation) {
46 switch (symmetryType) {
47 case kRotational:
48 return rotation - frc::Rotation2d(180_deg);
49 case kMirrored:
50 default:
51 return frc::Rotation2d(180_deg) - rotation;
52 }
53 }
54
61 static inline frc::Pose2d flipFieldPose(const frc::Pose2d &pose) {
62 return frc::Pose2d(flipFieldPosition(pose.Translation()),
63 flipFieldRotation(pose.Rotation()));
64 }
65
73 static inline frc::ChassisSpeeds flipFieldSpeeds(
74 const frc::ChassisSpeeds &fieldSpeeds) {
75 switch (symmetryType) {
76 case kRotational:
77 return frc::ChassisSpeeds { -fieldSpeeds.vx, -fieldSpeeds.vy,
78 fieldSpeeds.omega };
79 case kMirrored:
80 default:
81 return frc::ChassisSpeeds { -fieldSpeeds.vx, fieldSpeeds.vy,
82 -fieldSpeeds.omega };
83 }
84 }
85
93 template<class UnitType, class = std::enable_if_t<
94 units::traits::is_unit_t<UnitType>::value>>
95 static inline std::vector<UnitType> flipFeedforwards(
96 const std::vector<UnitType> &feedforwards) {
97 switch (symmetryType) {
98 case kRotational:
99 return feedforwards;
100 case kMirrored:
101 default:
102 if (feedforwards.size() == 4) {
103 return std::vector<UnitType> { feedforwards[1], feedforwards[0],
104 feedforwards[3], feedforwards[2] };
105 } else if (feedforwards.size() == 2) {
106 return std::vector<UnitType> { feedforwards[1], feedforwards[0] };
107 }
108 return feedforwards; // idk
109 }
110 }
111
119 template<class UnitType, class = std::enable_if_t<
120 units::traits::is_unit_t<UnitType>::value>>
121 static inline std::vector<UnitType> flipFeedforwardXs(
122 const std::vector<UnitType> &feedforwardXs) {
123 return flipFeedforwards(feedforwardXs);
124 }
125
133 template<class UnitType, class = std::enable_if_t<
134 units::traits::is_unit_t<UnitType>::value>>
135 static inline std::vector<UnitType> flipFeedforwardYs(
136 const std::vector<UnitType> &feedforwardYs) {
137 auto flippedFeedforwardYs = flipFeedforwards(feedforwardYs);
138 switch (symmetryType) {
139 case kRotational:
140 return flippedFeedforwardYs;
141 case kMirrored:
142 default:
143 // Y directions also need to be inverted
144 for (auto &feedforwardY : flippedFeedforwardYs) {
145 feedforwardY *= -1;
146 }
147 return flippedFeedforwardYs;
148 }
149 }
150};
151}
Definition: FlippingUtil.h:10
static frc::Rotation2d flipFieldRotation(const frc::Rotation2d &rotation)
Definition: FlippingUtil.h:44
static frc::Pose2d flipFieldPose(const frc::Pose2d &pose)
Definition: FlippingUtil.h:61
static frc::ChassisSpeeds flipFieldSpeeds(const frc::ChassisSpeeds &fieldSpeeds)
Definition: FlippingUtil.h:73
static std::vector< UnitType > flipFeedforwardYs(const std::vector< UnitType > &feedforwardYs)
Definition: FlippingUtil.h:135
static frc::Translation2d flipFieldPosition(const frc::Translation2d &pos)
Definition: FlippingUtil.h:26
static std::vector< UnitType > flipFeedforwards(const std::vector< UnitType > &feedforwards)
Definition: FlippingUtil.h:95
static std::vector< UnitType > flipFeedforwardXs(const std::vector< UnitType > &feedforwardXs)
Definition: FlippingUtil.h:121