PathPlannerLib
Loading...
Searching...
No Matches
DriveFeedforwards.h
1#pragma once
2
3#include <units/acceleration.h>
4#include <units/force.h>
5#include <units/current.h>
6#include <vector>
7#include <stdexcept>
8#include "pathplanner/lib/util/GeometryUtil.h"
9#include "pathplanner/lib/util/FlippingUtil.h"
10
11namespace pathplanner {
13public:
14 std::vector<units::meters_per_second_squared_t> accelerations;
15 std::vector<units::newton_t> linearForces;
16 std::vector<units::ampere_t> torqueCurrents;
17 std::vector<units::newton_t> robotRelativeForcesX;
18 std::vector<units::newton_t> robotRelativeForcesY;
19
26 static inline DriveFeedforwards zeros(const size_t numModules) {
27 return DriveFeedforwards { std::vector
28 < units::meters_per_second_squared_t > (numModules, 0_mps_sq),
29 std::vector < units::newton_t > (numModules, 0_N), std::vector
30 < units::ampere_t > (numModules, 0_A), std::vector
31 < units::newton_t > (numModules, 0_N), std::vector
32 < units::newton_t > (numModules, 0_N) };
33 }
34
35 inline DriveFeedforwards interpolate(const DriveFeedforwards &endVal,
36 const double t) const {
37 return DriveFeedforwards { interpolateVector(accelerations,
38 endVal.accelerations, t), interpolateVector(linearForces,
39 endVal.linearForces, t), interpolateVector(torqueCurrents,
40 endVal.torqueCurrents, t), interpolateVector(
41 robotRelativeForcesX, endVal.robotRelativeForcesX, t),
42 interpolateVector(robotRelativeForcesY,
43 endVal.robotRelativeForcesY, t) };
44 }
45
52 inline DriveFeedforwards reverse() const {
53 if (accelerations.size() != 2) {
54 throw std::runtime_error(
55 "Feedforwards should only be reversed for differential drive trains");
56 }
57
58 return DriveFeedforwards { std::vector<
59 units::meters_per_second_squared_t> { -accelerations[1],
60 -accelerations[0] }, std::vector<units::newton_t> {
61 -linearForces[1], -linearForces[0] }, std::vector<
62 units::ampere_t> { -torqueCurrents[1], -torqueCurrents[0] },
63 std::vector<units::newton_t> { -robotRelativeForcesX[1],
64 -robotRelativeForcesX[0] },
65 std::vector<units::newton_t> { -robotRelativeForcesY[1],
66 -robotRelativeForcesY[0] } };
67 }
68
75 inline DriveFeedforwards flip() const {
77 accelerations), FlippingUtil::flipFeedforwards(linearForces),
78 FlippingUtil::flipFeedforwards(torqueCurrents),
79 FlippingUtil::flipFeedforwardXs(robotRelativeForcesX),
80 FlippingUtil::flipFeedforwardYs(robotRelativeForcesY) };
81 }
82
83private:
84 template<class UnitType, class = std::enable_if_t<
85 units::traits::is_unit_t<UnitType>::value>>
86 static constexpr std::vector<UnitType> interpolateVector(
87 const std::vector<UnitType> &a, const std::vector<UnitType> &b,
88 const double t) {
89 std::vector<UnitType> ret;
90 for (size_t i = 0; i < a.size(); i++) {
91 ret.emplace_back(GeometryUtil::unitLerp(a[i], b[i], t));
92 }
93 return ret;
94 }
95};
96}
static std::vector< UnitType > flipFeedforwardYs(const std::vector< UnitType > &feedforwardYs)
Definition: FlippingUtil.h:135
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
Definition: DriveFeedforwards.h:12
DriveFeedforwards reverse() const
Definition: DriveFeedforwards.h:52
DriveFeedforwards flip() const
Definition: DriveFeedforwards.h:75
static DriveFeedforwards zeros(const size_t numModules)
Definition: DriveFeedforwards.h:26