9#include <frc/geometry/Pose2d.h>
10#include <frc/kinematics/ChassisSpeeds.h>
11#include <frc/system/NumericalIntegration.h>
12#include <units/acceleration.h>
13#include <units/angle.h>
14#include <units/angular_acceleration.h>
15#include <units/angular_velocity.h>
16#include <units/force.h>
17#include <units/length.h>
18#include <units/time.h>
19#include <units/velocity.h>
20#include <wpi/MathExtras.h>
21#include <wpi/json_fwd.h>
23#include "choreo/util/AllianceFlipperUtil.h"
55 units::meter_t
y, units::radian_t
heading,
56 units::meters_per_second_t
vl,
57 units::meters_per_second_t
vr,
58 units::radians_per_second_t
omega,
59 units::meters_per_second_squared_t
al,
60 units::meters_per_second_squared_t
ar,
61 units::radians_per_second_squared_t
alpha,
62 units::newton_t
fl, units::newton_t
fr)
89 return frc::Pose2d{
x,
y, frc::Rotation2d{
heading}};
98 return frc::ChassisSpeeds{(
vl +
vr) / 2.0, 0_mps,
omega};
130 units::second_t t)
const {
136 Eigen::Vector<double, 6> initialState{
x.value(),
y.value(),
141 std::function<Eigen::Vector<double, 6>(Eigen::Vector<double, 6>,
142 Eigen::Vector<double, 3>)>
143 f = [](Eigen::Vector<double, 6> state, Eigen::Vector<double, 3> input) {
155 auto θ = state(2, 0);
156 auto vl = state(3, 0);
157 auto vr = state(4, 0);
158 auto ω = state(5, 0);
159 auto al = input(0, 0);
160 auto ar = input(1, 0);
161 auto α = input(2, 0);
162 auto v = (
vl +
vr) / 2;
163 return Eigen::Vector<double, 6>{
164 v * std::cos(θ), v * std::sin(θ), ω,
al,
ar, α};
168 auto sample = frc::RKDP(
170 Eigen::Vector<double, 3>(
al.value(),
ar.value(),
alpha.value()), τ);
174 units::meter_t{sample(0, 0)},
175 units::meter_t{sample(1, 0)},
176 units::radian_t{sample(2, 0)},
177 units::meters_per_second_t{sample(3, 0)},
178 units::meters_per_second_t{sample(4, 0)},
179 units::radians_per_second_t{sample(5, 0)},
183 wpi::Lerp(
fl, endValue.
fl, scale),
184 wpi::Lerp(
fr, endValue.
fr, scale),
194 template <
int Year = util::kDefaultYear>
196 constexpr auto flipper = choreo::util::GetFlipperForYear<Year>();
197 if constexpr (flipper.isMirrored) {
215 constexpr double epsilon = 1e-6;
217 auto compare_units = [epsilon](
const auto& a,
const auto& b) {
219 std::remove_const_t<std::remove_reference_t<
decltype(a)>>;
220 return units::math::abs(a - b) < UnitType(epsilon);
224 compare_units(
x, other.
x) && compare_units(
y, other.
y) &&
226 compare_units(
vl, other.
vl) && compare_units(
vr, other.
vr) &&
227 compare_units(
omega, other.
omega) && compare_units(
al, other.
al) &&
228 compare_units(
ar, other.
ar) && compare_units(
alpha, other.
alpha) &&
229 compare_units(
fl, other.
fl) && compare_units(
fr, other.
fr);
236 units::meter_t
x = 0_m;
239 units::meter_t
y = 0_m;
245 units::meters_per_second_t
vl = 0_mps;
248 units::meters_per_second_t
vr = 0_mps;
251 units::radians_per_second_t
omega = 0_rad_per_s;
254 units::meters_per_second_squared_t
al = 0_mps_sq;
257 units::meters_per_second_squared_t
ar = 0_mps_sq;
260 units::radians_per_second_squared_t
alpha = 0_rad_per_s_sq;
263 units::newton_t
fl = 0_N;
266 units::newton_t
fr = 0_N;
274#include "choreo/trajectory/struct/DifferentialSampleStruct.h"
Definition DifferentialSample.h:30
units::newton_t fl
The force of the left wheels.
Definition DifferentialSample.h:263
units::meter_t y
The Y position of the sample relative to the blue alliance wall origin.
Definition DifferentialSample.h:239
constexpr bool operator==(const DifferentialSample &other) const
Definition DifferentialSample.h:214
units::second_t timestamp
The timestamp of this sample relative to the beginning of the trajectory.
Definition DifferentialSample.h:233
constexpr DifferentialSample(units::second_t timestamp, units::meter_t x, units::meter_t y, units::radian_t heading, units::meters_per_second_t vl, units::meters_per_second_t vr, units::radians_per_second_t omega, units::meters_per_second_squared_t al, units::meters_per_second_squared_t ar, units::radians_per_second_squared_t alpha, units::newton_t fl, units::newton_t fr)
Definition DifferentialSample.h:54
units::radians_per_second_squared_t alpha
The chassis angular acceleration.
Definition DifferentialSample.h:260
constexpr DifferentialSample Flipped() const
Definition DifferentialSample.h:195
units::radian_t heading
The heading of the sample, with 0 being in the +X direction.
Definition DifferentialSample.h:242
units::newton_t fr
The force of the right wheels.
Definition DifferentialSample.h:266
units::radians_per_second_t omega
The chassis angular velocity.
Definition DifferentialSample.h:251
units::second_t GetTimestamp() const
Definition DifferentialSample.h:81
units::meters_per_second_t vr
The velocity of the right wheels.
Definition DifferentialSample.h:248
constexpr DifferentialSample()=default
constexpr frc::Pose2d GetPose() const
Definition DifferentialSample.h:88
constexpr frc::ChassisSpeeds GetChassisSpeeds() const
Definition DifferentialSample.h:97
units::meters_per_second_t vl
The velocity of the left wheels.
Definition DifferentialSample.h:245
units::meters_per_second_squared_t al
The acceleration of the left wheels.
Definition DifferentialSample.h:254
constexpr DifferentialSample OffsetBy(units::second_t timeStampOffset) const
Definition DifferentialSample.h:107
units::meter_t x
The X position of the sample relative to the blue alliance wall origin.
Definition DifferentialSample.h:236
units::meters_per_second_squared_t ar
The acceleration of the right wheels.
Definition DifferentialSample.h:257
DifferentialSample Interpolate(const DifferentialSample &endValue, units::second_t t) const
Definition DifferentialSample.h:129