blob: 25277e950bcccaa64cf00341fac624b7feec1783 [file] [log] [blame]
Ariv Diggi0af59c02023-10-07 13:15:39 -07001#include "y2023_bot3/autonomous/auto_splines.h"
2
3#include "aos/flatbuffer_merge.h"
4#include "frc971/control_loops/control_loops_generated.h"
5
6namespace y2023_bot3 {
7namespace autonomous {
8
9namespace {
10flatbuffers::Offset<frc971::MultiSpline> FixSpline(
11 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
12 *builder,
13 flatbuffers::Offset<frc971::MultiSpline> spline_offset,
14 aos::Alliance alliance) {
15 frc971::MultiSpline *spline =
16 GetMutableTemporaryPointer(*builder->fbb(), spline_offset);
17 flatbuffers::Vector<float> *spline_x = spline->mutable_spline_x();
18
19 // For 2023: The field is mirrored across the center line, and is not
20 // rotationally symmetric. As such, we only flip the X coordinates when
21 // changing side of the field.
22 if (alliance == aos::Alliance::kBlue) {
23 for (size_t ii = 0; ii < spline_x->size(); ++ii) {
24 spline_x->Mutate(ii, -spline_x->Get(ii));
25 }
26 }
27 return spline_offset;
28}
29} // namespace
30
31flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::BasicSSpline(
32 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
33 *builder,
34 aos::Alliance alliance) {
35 flatbuffers::Offset<frc971::Constraint> longitudinal_constraint_offset;
36 flatbuffers::Offset<frc971::Constraint> lateral_constraint_offset;
37 flatbuffers::Offset<frc971::Constraint> voltage_constraint_offset;
38
39 {
40 frc971::Constraint::Builder longitudinal_constraint_builder =
41 builder->MakeBuilder<frc971::Constraint>();
42 longitudinal_constraint_builder.add_constraint_type(
43 frc971::ConstraintType::LONGITUDINAL_ACCELERATION);
44 longitudinal_constraint_builder.add_value(1.0);
45 longitudinal_constraint_offset = longitudinal_constraint_builder.Finish();
46 }
47
48 {
49 frc971::Constraint::Builder lateral_constraint_builder =
50 builder->MakeBuilder<frc971::Constraint>();
51 lateral_constraint_builder.add_constraint_type(
52 frc971::ConstraintType::LATERAL_ACCELERATION);
53 lateral_constraint_builder.add_value(1.0);
54 lateral_constraint_offset = lateral_constraint_builder.Finish();
55 }
56
57 {
58 frc971::Constraint::Builder voltage_constraint_builder =
59 builder->MakeBuilder<frc971::Constraint>();
60 voltage_constraint_builder.add_constraint_type(
61 frc971::ConstraintType::VOLTAGE);
62 voltage_constraint_builder.add_value(6.0);
63 voltage_constraint_offset = voltage_constraint_builder.Finish();
64 }
65
66 flatbuffers::Offset<
67 flatbuffers::Vector<flatbuffers::Offset<frc971::Constraint>>>
68 constraints_offset =
69 builder->fbb()->CreateVector<flatbuffers::Offset<frc971::Constraint>>(
70 {longitudinal_constraint_offset, lateral_constraint_offset,
71 voltage_constraint_offset});
72
73 const float startx = 0.4;
74 const float starty = 3.4;
75 flatbuffers::Offset<flatbuffers::Vector<float>> spline_x_offset =
76 builder->fbb()->CreateVector<float>({0.0f + startx, 0.6f + startx,
77 0.6f + startx, 0.4f + startx,
78 0.4f + startx, 1.0f + startx});
79 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset =
80 builder->fbb()->CreateVector<float>({starty - 0.0f, starty - 0.0f,
81 starty - 0.3f, starty - 0.7f,
82 starty - 1.0f, starty - 1.0f});
83
84 frc971::MultiSpline::Builder multispline_builder =
85 builder->MakeBuilder<frc971::MultiSpline>();
86
87 multispline_builder.add_spline_count(1);
88 multispline_builder.add_constraints(constraints_offset);
89 multispline_builder.add_spline_x(spline_x_offset);
90 multispline_builder.add_spline_y(spline_y_offset);
91
92 return FixSpline(builder, multispline_builder.Finish(), alliance);
93}
94
95flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::TestSpline(
96 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
97 *builder,
98 aos::Alliance alliance) {
99 return FixSpline(
100 builder,
101 aos::CopyFlatBuffer<frc971::MultiSpline>(test_spline_, builder->fbb()),
102 alliance);
103}
104
Filip Kujawaef687152023-11-14 22:11:32 -0800105flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::Spline1(
106 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
107 *builder,
108 aos::Alliance alliance) {
109 return FixSpline(
110 builder,
111 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_1_, builder->fbb()),
112 alliance);
113}
114
115flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::Spline2(
116 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
117 *builder,
118 aos::Alliance alliance) {
119 return FixSpline(
120 builder,
121 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_2_, builder->fbb()),
122 alliance);
123}
124
125flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::Spline3(
126 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
127 *builder,
128 aos::Alliance alliance) {
129 return FixSpline(
130 builder,
131 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_3_, builder->fbb()),
132 alliance);
133}
134
135flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::Spline4(
136 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
137 *builder,
138 aos::Alliance alliance) {
139 return FixSpline(
140 builder,
141 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_4_, builder->fbb()),
142 alliance);
143}
144
145flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::SplineMiddle1(
146 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
147 *builder,
148 aos::Alliance alliance) {
149 return FixSpline(builder,
150 aos::CopyFlatBuffer<frc971::MultiSpline>(spline_middle_1_,
151 builder->fbb()),
152 alliance);
153}
154
Ariv Diggi0af59c02023-10-07 13:15:39 -0700155flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::StraightLine(
156 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
157 *builder,
158 aos::Alliance alliance) {
159 flatbuffers::Offset<flatbuffers::Vector<float>> spline_x_offset =
160 builder->fbb()->CreateVector<float>(
161 {-12.3, -11.9, -11.5, -11.1, -10.6, -10.0});
162 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset =
163 builder->fbb()->CreateVector<float>({1.25, 1.25, 1.25, 1.25, 1.25, 1.25});
164
165 frc971::MultiSpline::Builder multispline_builder =
166 builder->MakeBuilder<frc971::MultiSpline>();
167
168 multispline_builder.add_spline_count(1);
169 multispline_builder.add_spline_x(spline_x_offset);
170 multispline_builder.add_spline_y(spline_y_offset);
171
172 return FixSpline(builder, multispline_builder.Finish(), alliance);
173}
174
175} // namespace autonomous
176} // namespace y2023_bot3