blob: 36076273efc99a519866bb8f62fe8e13fa1ed711 [file] [log] [blame]
Maxwell Hendersonad312342023-01-10 12:07:47 -08001#include "y2023/autonomous/auto_splines.h"
2
James Kuszmaul713c5ce2023-03-04 18:23:24 -08003#include "aos/flatbuffer_merge.h"
Philipp Schrader790cb542023-07-05 21:06:52 -07004#include "frc971/control_loops/control_loops_generated.h"
Maxwell Hendersonad312342023-01-10 12:07:47 -08005
Stephan Pleinesf63bde82024-01-13 15:59:33 -08006namespace y2023::autonomous {
Maxwell Hendersonad312342023-01-10 12:07:47 -08007
James Kuszmaul713c5ce2023-03-04 18:23:24 -08008namespace {
9flatbuffers::Offset<frc971::MultiSpline> FixSpline(
10 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
11 *builder,
12 flatbuffers::Offset<frc971::MultiSpline> spline_offset,
13 aos::Alliance alliance) {
14 frc971::MultiSpline *spline =
15 GetMutableTemporaryPointer(*builder->fbb(), spline_offset);
16 flatbuffers::Vector<float> *spline_x = spline->mutable_spline_x();
Maxwell Hendersonad312342023-01-10 12:07:47 -080017
James Kuszmaul713c5ce2023-03-04 18:23:24 -080018 // For 2023: The field is mirrored across the center line, and is not
19 // rotationally symmetric. As such, we only flip the X coordinates when
20 // changing side of the field.
21 if (alliance == aos::Alliance::kBlue) {
22 for (size_t ii = 0; ii < spline_x->size(); ++ii) {
23 spline_x->Mutate(ii, -spline_x->Get(ii));
Maxwell Hendersonad312342023-01-10 12:07:47 -080024 }
25 }
James Kuszmaul713c5ce2023-03-04 18:23:24 -080026 return spline_offset;
Maxwell Hendersonad312342023-01-10 12:07:47 -080027}
James Kuszmaul713c5ce2023-03-04 18:23:24 -080028} // namespace
Maxwell Hendersonad312342023-01-10 12:07:47 -080029
30flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::BasicSSpline(
James Kuszmaul713c5ce2023-03-04 18:23:24 -080031 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
32 *builder,
33 aos::Alliance alliance) {
Maxwell Hendersonad312342023-01-10 12:07:47 -080034 flatbuffers::Offset<frc971::Constraint> longitudinal_constraint_offset;
35 flatbuffers::Offset<frc971::Constraint> lateral_constraint_offset;
36 flatbuffers::Offset<frc971::Constraint> voltage_constraint_offset;
37
38 {
39 frc971::Constraint::Builder longitudinal_constraint_builder =
40 builder->MakeBuilder<frc971::Constraint>();
41 longitudinal_constraint_builder.add_constraint_type(
42 frc971::ConstraintType::LONGITUDINAL_ACCELERATION);
43 longitudinal_constraint_builder.add_value(1.0);
44 longitudinal_constraint_offset = longitudinal_constraint_builder.Finish();
45 }
46
47 {
48 frc971::Constraint::Builder lateral_constraint_builder =
49 builder->MakeBuilder<frc971::Constraint>();
50 lateral_constraint_builder.add_constraint_type(
51 frc971::ConstraintType::LATERAL_ACCELERATION);
52 lateral_constraint_builder.add_value(1.0);
53 lateral_constraint_offset = lateral_constraint_builder.Finish();
54 }
55
56 {
57 frc971::Constraint::Builder voltage_constraint_builder =
58 builder->MakeBuilder<frc971::Constraint>();
59 voltage_constraint_builder.add_constraint_type(
60 frc971::ConstraintType::VOLTAGE);
61 voltage_constraint_builder.add_value(6.0);
62 voltage_constraint_offset = voltage_constraint_builder.Finish();
63 }
64
65 flatbuffers::Offset<
66 flatbuffers::Vector<flatbuffers::Offset<frc971::Constraint>>>
67 constraints_offset =
68 builder->fbb()->CreateVector<flatbuffers::Offset<frc971::Constraint>>(
69 {longitudinal_constraint_offset, lateral_constraint_offset,
70 voltage_constraint_offset});
71
72 const float startx = 0.4;
73 const float starty = 3.4;
74 flatbuffers::Offset<flatbuffers::Vector<float>> spline_x_offset =
75 builder->fbb()->CreateVector<float>({0.0f + startx, 0.6f + startx,
76 0.6f + startx, 0.4f + startx,
77 0.4f + startx, 1.0f + startx});
78 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset =
79 builder->fbb()->CreateVector<float>({starty - 0.0f, starty - 0.0f,
80 starty - 0.3f, starty - 0.7f,
81 starty - 1.0f, starty - 1.0f});
82
83 frc971::MultiSpline::Builder multispline_builder =
84 builder->MakeBuilder<frc971::MultiSpline>();
85
86 multispline_builder.add_spline_count(1);
87 multispline_builder.add_constraints(constraints_offset);
88 multispline_builder.add_spline_x(spline_x_offset);
89 multispline_builder.add_spline_y(spline_y_offset);
90
James Kuszmaul713c5ce2023-03-04 18:23:24 -080091 return FixSpline(builder, multispline_builder.Finish(), alliance);
Maxwell Hendersonad312342023-01-10 12:07:47 -080092}
93
Maxwell Henderson64f37452023-03-11 13:39:21 -080094flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::TestSpline(
95 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
96 *builder,
97 aos::Alliance alliance) {
98 return FixSpline(
99 builder,
100 aos::CopyFlatBuffer<frc971::MultiSpline>(test_spline_, builder->fbb()),
101 alliance);
102}
103
104flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::Spline1(
105 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
106 *builder,
107 aos::Alliance alliance) {
108 return FixSpline(
109 builder,
110 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_1_, builder->fbb()),
111 alliance);
112}
113
114flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::Spline2(
115 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
116 *builder,
117 aos::Alliance alliance) {
118 return FixSpline(
119 builder,
120 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_2_, builder->fbb()),
121 alliance);
122}
123
124flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::Spline3(
125 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
126 *builder,
127 aos::Alliance alliance) {
128 return FixSpline(
129 builder,
130 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_3_, builder->fbb()),
131 alliance);
132}
133
134flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::Spline4(
135 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
136 *builder,
137 aos::Alliance alliance) {
138 return FixSpline(
139 builder,
140 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_4_, builder->fbb()),
141 alliance);
142}
143
Maxwell Henderson25378832023-04-07 14:37:41 -0700144flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::SplineCable1(
145 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
146 *builder,
147 aos::Alliance alliance) {
148 return FixSpline(
149 builder,
150 aos::CopyFlatBuffer<frc971::MultiSpline>(splinecable_1_, builder->fbb()),
151 alliance);
152}
153
154flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::SplineCable2(
155 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
156 *builder,
157 aos::Alliance alliance) {
158 return FixSpline(
159 builder,
160 aos::CopyFlatBuffer<frc971::MultiSpline>(splinecable_2_, builder->fbb()),
161 alliance);
162}
163
164flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::SplineCable3(
165 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
166 *builder,
167 aos::Alliance alliance) {
168 return FixSpline(
169 builder,
170 aos::CopyFlatBuffer<frc971::MultiSpline>(splinecable_3_, builder->fbb()),
171 alliance);
172}
173
174flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::SplineCable4(
175 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
176 *builder,
177 aos::Alliance alliance) {
178 return FixSpline(
179 builder,
180 aos::CopyFlatBuffer<frc971::MultiSpline>(splinecable_4_, builder->fbb()),
181 alliance);
182}
183
Maxwell Hendersonad312342023-01-10 12:07:47 -0800184flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::StraightLine(
James Kuszmaul713c5ce2023-03-04 18:23:24 -0800185 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
186 *builder,
187 aos::Alliance alliance) {
Maxwell Hendersonad312342023-01-10 12:07:47 -0800188 flatbuffers::Offset<flatbuffers::Vector<float>> spline_x_offset =
189 builder->fbb()->CreateVector<float>(
190 {-12.3, -11.9, -11.5, -11.1, -10.6, -10.0});
191 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset =
192 builder->fbb()->CreateVector<float>({1.25, 1.25, 1.25, 1.25, 1.25, 1.25});
193
194 frc971::MultiSpline::Builder multispline_builder =
195 builder->MakeBuilder<frc971::MultiSpline>();
196
197 multispline_builder.add_spline_count(1);
198 multispline_builder.add_spline_x(spline_x_offset);
199 multispline_builder.add_spline_y(spline_y_offset);
200
James Kuszmaul713c5ce2023-03-04 18:23:24 -0800201 return FixSpline(builder, multispline_builder.Finish(), alliance);
202}
203
Stephan Pleinesf63bde82024-01-13 15:59:33 -0800204} // namespace y2023::autonomous