TrajoptLib
Library for generating time-optimal trajectories for FRC robots.
Loading...
Searching...
No Matches
swerve_trajectory_generator.hpp
1// Copyright (c) TrajoptLib contributors
2
3#pragma once
4
5#include <stdint.h>
6
7#include <cmath>
8#include <cstddef>
9#include <expected>
10#include <utility>
11#include <vector>
12
13#include <sleipnir/autodiff/variable.hpp>
14#include <sleipnir/optimization/problem.hpp>
15#include <sleipnir/optimization/solver/exit_status.hpp>
16
17#include "trajopt/geometry/translation2.hpp"
18#include "trajopt/path/path.hpp"
19#include "trajopt/path/path_builder.hpp"
20#include "trajopt/util/symbol_exports.hpp"
21
22namespace trajopt {
23
25struct TRAJOPT_DLLEXPORT SwerveDrivetrain {
27 double mass;
28
30 double moi;
31
34
37
40
42 double wheel_cof;
43
47 std::vector<Translation2d> modules;
48};
49
51struct TRAJOPT_DLLEXPORT SwerveSolution {
53 std::vector<double> dt;
54
56 std::vector<double> x;
57
59 std::vector<double> y;
60
62 std::vector<double> thetacos;
63
65 std::vector<double> thetasin;
66
68 std::vector<double> vx;
69
71 std::vector<double> vy;
72
74 std::vector<double> omega;
75
77 std::vector<double> ax;
78
80 std::vector<double> ay;
81
83 std::vector<double> alpha;
84
86 std::vector<std::vector<double>> module_fx;
87
89 std::vector<std::vector<double>> module_fy;
90};
91
93class TRAJOPT_DLLEXPORT SwerveTrajectorySample {
94 public:
96 double timestamp = 0.0;
97
99 double x = 0.0;
100
102 double y = 0.0;
103
105 double heading = 0.0;
106
108 double velocity_x = 0.0;
109
111 double velocity_y = 0.0;
112
114 double angular_velocity = 0.0;
115
117 double acceleration_x = 0.0;
118
120 double acceleration_y = 0.0;
121
124
126 std::vector<double> module_forces_x;
127
129 std::vector<double> module_forces_y;
130
131 SwerveTrajectorySample() = default;
132
165};
166
168class TRAJOPT_DLLEXPORT SwerveTrajectory {
169 public:
171 std::vector<SwerveTrajectorySample> samples;
172
173 SwerveTrajectory() = default;
174
178 explicit SwerveTrajectory(std::vector<SwerveTrajectorySample> samples)
179 : samples{std::move(samples)} {}
180
184 explicit SwerveTrajectory(const SwerveSolution& solution) {
185 double ts = 0.0;
186 for (size_t sample = 0; sample < solution.x.size(); ++sample) {
187 samples.emplace_back(
188 ts, solution.x[sample], solution.y[sample],
189 std::atan2(solution.thetasin[sample], solution.thetacos[sample]),
190 solution.vx[sample], solution.vy[sample], solution.omega[sample],
191 solution.ax[sample], solution.ay[sample], solution.alpha[sample],
192 solution.module_fx[sample], solution.module_fy[sample]);
193 ts += solution.dt[sample];
194 }
195 }
196};
197
199using SwervePath = Path<SwerveDrivetrain, SwerveSolution>;
200
204using SwervePathBuilder = PathBuilder<SwerveDrivetrain, SwerveSolution>;
205
208class TRAJOPT_DLLEXPORT SwerveTrajectoryGenerator {
209 public:
214 explicit SwerveTrajectoryGenerator(SwervePathBuilder path_builder,
215 int64_t handle = 0);
216
224 std::expected<SwerveSolution, slp::ExitStatus> generate(
225 bool diagnostics = false);
226
227 private:
229 SwervePath path;
230
232 std::vector<slp::Variable<double>> x;
233 std::vector<slp::Variable<double>> y;
234 std::vector<slp::Variable<double>> cosθ;
235 std::vector<slp::Variable<double>> sinθ;
236 std::vector<slp::Variable<double>> vx;
237 std::vector<slp::Variable<double>> vy;
238 std::vector<slp::Variable<double>> ω;
239 std::vector<slp::Variable<double>> ax;
240 std::vector<slp::Variable<double>> ay;
241 std::vector<slp::Variable<double>> α;
242
244 std::vector<std::vector<slp::Variable<double>>> Fx;
245 std::vector<std::vector<slp::Variable<double>>> Fy;
246
248 std::vector<slp::Variable<double>> dts;
249
251 std::vector<size_t> Ns;
252
253 slp::Problem<double> problem;
254
255 void apply_initial_guess(const SwerveSolution& solution);
256
257 SwerveSolution construct_swerve_solution();
258};
259
260} // namespace trajopt
std::expected< SwerveSolution, slp::ExitStatus > generate(bool diagnostics=false)
SwerveTrajectoryGenerator(SwervePathBuilder path_builder, int64_t handle=0)
double acceleration_y
The acceleration's y component.
Definition swerve_trajectory_generator.hpp:120
double timestamp
The timestamp.
Definition swerve_trajectory_generator.hpp:96
double acceleration_x
The acceleration's x component.
Definition swerve_trajectory_generator.hpp:117
double x
The x coordinate.
Definition swerve_trajectory_generator.hpp:99
double angular_acceleration
The angular acceleration.
Definition swerve_trajectory_generator.hpp:123
std::vector< double > module_forces_y
The force on each module in the Y direction.
Definition swerve_trajectory_generator.hpp:129
double angular_velocity
The angular velocity.
Definition swerve_trajectory_generator.hpp:114
double velocity_x
The velocity's x component.
Definition swerve_trajectory_generator.hpp:108
double velocity_y
The velocity's y component.
Definition swerve_trajectory_generator.hpp:111
double y
The y coordinate.
Definition swerve_trajectory_generator.hpp:102
SwerveTrajectorySample(double timestamp, double x, double y, double heading, double velocity_x, double velocity_y, double angular_velocity, double acceleration_x, double acceleration_y, double angular_acceleration, std::vector< double > module_forces_x, std::vector< double > module_forces_y)
Definition swerve_trajectory_generator.hpp:147
std::vector< double > module_forces_x
The force on each module in the X direction.
Definition swerve_trajectory_generator.hpp:126
double heading
The heading.
Definition swerve_trajectory_generator.hpp:105
SwerveTrajectory(std::vector< SwerveTrajectorySample > samples)
Definition swerve_trajectory_generator.hpp:178
SwerveTrajectory(const SwerveSolution &solution)
Definition swerve_trajectory_generator.hpp:184
std::vector< SwerveTrajectorySample > samples
The samples that make up the trajectory.
Definition swerve_trajectory_generator.hpp:171
A swerve drivetrain physical model.
Definition swerve_trajectory_generator.hpp:25
double mass
The mass of the robot (kg).
Definition swerve_trajectory_generator.hpp:27
double wheel_max_angular_velocity
Maximum angular velocity of each wheel (rad/s).
Definition swerve_trajectory_generator.hpp:36
double wheel_cof
The Coefficient of Friction (CoF) of the wheels.
Definition swerve_trajectory_generator.hpp:42
double wheel_radius
Radius of the wheels (m).
Definition swerve_trajectory_generator.hpp:33
std::vector< Translation2d > modules
Definition swerve_trajectory_generator.hpp:47
double wheel_max_torque
Maximum torque applied to each wheel (N−m).
Definition swerve_trajectory_generator.hpp:39
double moi
The moment of inertia of the robot about the origin (kg−m²).
Definition swerve_trajectory_generator.hpp:30
The swerve drive trajectory optimization solution.
Definition swerve_trajectory_generator.hpp:51
std::vector< double > ay
The y accelerations.
Definition swerve_trajectory_generator.hpp:80
std::vector< double > dt
Times between samples.
Definition swerve_trajectory_generator.hpp:53
std::vector< double > alpha
The angular accelerations.
Definition swerve_trajectory_generator.hpp:83
std::vector< double > thetacos
Heading cosine.
Definition swerve_trajectory_generator.hpp:62
std::vector< double > y
Y positions.
Definition swerve_trajectory_generator.hpp:59
std::vector< double > vy
The y velocities.
Definition swerve_trajectory_generator.hpp:71
std::vector< std::vector< double > > module_fy
The y forces for each module.
Definition swerve_trajectory_generator.hpp:89
std::vector< double > ax
The x accelerations.
Definition swerve_trajectory_generator.hpp:77
std::vector< double > vx
The x velocities.
Definition swerve_trajectory_generator.hpp:68
std::vector< double > omega
The angular velocities.
Definition swerve_trajectory_generator.hpp:74
std::vector< double > thetasin
Heading sine.
Definition swerve_trajectory_generator.hpp:65
std::vector< std::vector< double > > module_fx
The x forces for each module.
Definition swerve_trajectory_generator.hpp:86
std::vector< double > x
X positions.
Definition swerve_trajectory_generator.hpp:56