blob: 28aa996b503854648db2f4d89796edccc8079153 [file] [log] [blame]
Stephan Massaltd021f972020-01-05 20:41:23 -08001#include "y2020/actors/auto_splines.h"
2
3#include "frc971/control_loops/control_loops_generated.h"
4
Stephan Pleinesf63bde82024-01-13 15:59:33 -08005namespace y2020::actors {
Stephan Massaltd021f972020-01-05 20:41:23 -08006
Ravago Jones81e50632022-03-11 16:23:51 -08007constexpr double kFieldLength = 16.4592;
8constexpr double kFieldWidth = 8.2296;
Austin Schuhd0e9e062021-10-24 17:40:58 -07009
Stephan Massaltd021f972020-01-05 20:41:23 -080010void MaybeFlipSpline(
James Kuszmaul75a18c52021-03-10 22:02:07 -080011 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
12 *builder,
Stephan Massaltd021f972020-01-05 20:41:23 -080013 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset,
14 bool is_left) {
15 flatbuffers::Vector<float> *spline_y =
16 GetMutableTemporaryPointer(*builder->fbb(), spline_y_offset);
17
18 if (!is_left) {
19 for (size_t i = 0; i < spline_y->size(); i++) {
20 spline_y->Mutate(i, -spline_y->Get(i));
21 }
22 }
23}
24
Austin Schuhd0e9e062021-10-24 17:40:58 -070025flatbuffers::Offset<frc971::MultiSpline> FixSpline(
26 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
27 *builder,
28 flatbuffers::Offset<frc971::MultiSpline> spline_offset,
29 aos::Alliance alliance) {
30 frc971::MultiSpline *spline =
31 GetMutableTemporaryPointer(*builder->fbb(), spline_offset);
32 flatbuffers::Vector<float> *spline_x = spline->mutable_spline_x();
33 flatbuffers::Vector<float> *spline_y = spline->mutable_spline_y();
34
35 for (size_t ii = 0; ii < spline_x->size(); ++ii) {
36 spline_x->Mutate(ii, spline_x->Get(ii) - kFieldLength / 2.0);
37 }
38 for (size_t ii = 0; ii < spline_y->size(); ++ii) {
39 spline_y->Mutate(ii, kFieldWidth / 2.0 - spline_y->Get(ii));
40 }
41
42 if (alliance == aos::Alliance::kBlue) {
43 for (size_t ii = 0; ii < spline_x->size(); ++ii) {
44 spline_x->Mutate(ii, -spline_x->Get(ii));
45 }
46 for (size_t ii = 0; ii < spline_y->size(); ++ii) {
47 spline_y->Mutate(ii, -spline_y->Get(ii));
48 }
49 }
50 return spline_offset;
51}
52
Stephan Massaltd021f972020-01-05 20:41:23 -080053flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::BasicSSpline(
James Kuszmaul75a18c52021-03-10 22:02:07 -080054 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
55 *builder,
James Kuszmaulddd2ba62020-03-08 22:17:13 -070056 aos::Alliance alliance) {
Stephan Massaltd021f972020-01-05 20:41:23 -080057 flatbuffers::Offset<frc971::Constraint> longitudinal_constraint_offset;
58 flatbuffers::Offset<frc971::Constraint> lateral_constraint_offset;
59 flatbuffers::Offset<frc971::Constraint> voltage_constraint_offset;
60
61 {
62 frc971::Constraint::Builder longitudinal_constraint_builder =
63 builder->MakeBuilder<frc971::Constraint>();
64 longitudinal_constraint_builder.add_constraint_type(
65 frc971::ConstraintType::LONGITUDINAL_ACCELERATION);
Austin Schuhfd1715f2021-01-30 16:58:24 -080066 longitudinal_constraint_builder.add_value(1.0);
Stephan Massaltd021f972020-01-05 20:41:23 -080067 longitudinal_constraint_offset = longitudinal_constraint_builder.Finish();
68 }
69
70 {
71 frc971::Constraint::Builder lateral_constraint_builder =
72 builder->MakeBuilder<frc971::Constraint>();
73 lateral_constraint_builder.add_constraint_type(
74 frc971::ConstraintType::LATERAL_ACCELERATION);
Austin Schuhfd1715f2021-01-30 16:58:24 -080075 lateral_constraint_builder.add_value(1.0);
Stephan Massaltd021f972020-01-05 20:41:23 -080076 lateral_constraint_offset = lateral_constraint_builder.Finish();
77 }
78
79 {
80 frc971::Constraint::Builder voltage_constraint_builder =
81 builder->MakeBuilder<frc971::Constraint>();
82 voltage_constraint_builder.add_constraint_type(
83 frc971::ConstraintType::VOLTAGE);
Austin Schuhfd1715f2021-01-30 16:58:24 -080084 voltage_constraint_builder.add_value(2.0);
Stephan Massaltd021f972020-01-05 20:41:23 -080085 voltage_constraint_offset = voltage_constraint_builder.Finish();
86 }
87
88 flatbuffers::Offset<
89 flatbuffers::Vector<flatbuffers::Offset<frc971::Constraint>>>
90 constraints_offset =
91 builder->fbb()->CreateVector<flatbuffers::Offset<frc971::Constraint>>(
92 {longitudinal_constraint_offset, lateral_constraint_offset,
93 voltage_constraint_offset});
94
Austin Schuhfd1715f2021-01-30 16:58:24 -080095 const float startx = 0.0;
96 const float starty = 0.0;
97 std::vector<float> x_pos{0.0f + startx, 0.4f + startx, 0.4f + startx,
98 0.6f + startx, 0.6f + startx, 1.0f + startx};
milind-u0e203782021-10-30 21:57:20 -070099 std::vector<float> y_pos{starty + 0.0f, starty + 0.0f, starty + 0.05f,
Austin Schuhfd1715f2021-01-30 16:58:24 -0800100 starty + 0.1f, starty + 0.15f, starty + 0.15f};
James Kuszmaulddd2ba62020-03-08 22:17:13 -0700101 if (alliance == aos::Alliance::kRed) {
102 for (size_t ii = 0; ii < x_pos.size(); ++ii) {
103 x_pos[ii] *= -1;
104 y_pos[ii] *= -1;
105 }
106 }
Stephan Massaltd021f972020-01-05 20:41:23 -0800107 flatbuffers::Offset<flatbuffers::Vector<float>> spline_x_offset =
James Kuszmaulddd2ba62020-03-08 22:17:13 -0700108 builder->fbb()->CreateVector<float>(x_pos);
Stephan Massaltd021f972020-01-05 20:41:23 -0800109 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset =
James Kuszmaulddd2ba62020-03-08 22:17:13 -0700110 builder->fbb()->CreateVector<float>(y_pos);
Stephan Massaltd021f972020-01-05 20:41:23 -0800111
112 frc971::MultiSpline::Builder multispline_builder =
113 builder->MakeBuilder<frc971::MultiSpline>();
114
115 multispline_builder.add_spline_count(1);
116 multispline_builder.add_constraints(constraints_offset);
117 multispline_builder.add_spline_x(spline_x_offset);
118 multispline_builder.add_spline_y(spline_y_offset);
119
120 return multispline_builder.Finish();
121}
122
Austin Schuhd0e9e062021-10-24 17:40:58 -0700123flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::TargetAligned1(
124 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
125 *builder,
126 aos::Alliance alliance) {
127 return FixSpline(builder,
128 aos::CopyFlatBuffer<frc971::MultiSpline>(target_aligned_1_,
129 builder->fbb()),
130 alliance);
131}
132
133flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::TargetAligned2(
134 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
135 *builder,
136 aos::Alliance alliance) {
137 return FixSpline(builder,
138 aos::CopyFlatBuffer<frc971::MultiSpline>(target_aligned_2_,
139 builder->fbb()),
140 alliance);
141}
142
milind-u0e203782021-10-30 21:57:20 -0700143flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::TargetAligned3(
144 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
145 *builder,
146 aos::Alliance alliance) {
147 return FixSpline(builder,
148 aos::CopyFlatBuffer<frc971::MultiSpline>(target_aligned_3_,
149 builder->fbb()),
150 alliance);
151}
152
Austin Schuh3653cf22021-11-12 11:54:51 -0800153flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::FarSideFender(
154 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
155 *builder,
156 aos::Alliance alliance) {
157 // I drew the spline on the wrong side of the field.
158 if (alliance == aos::Alliance::kBlue) {
159 alliance = aos::Alliance::kRed;
160 } else {
161 alliance = aos::Alliance::kBlue;
162 }
163 return FixSpline(builder,
164 aos::CopyFlatBuffer<frc971::MultiSpline>(far_side_fender_,
165 builder->fbb()),
166 alliance);
167}
168
Stephan Massaltd021f972020-01-05 20:41:23 -0800169flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::StraightLine(
James Kuszmaul75a18c52021-03-10 22:02:07 -0800170 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
171 *builder) {
Stephan Massaltd021f972020-01-05 20:41:23 -0800172 flatbuffers::Offset<flatbuffers::Vector<float>> spline_x_offset =
173 builder->fbb()->CreateVector<float>(
174 {-12.3, -11.9, -11.5, -11.1, -10.6, -10.0});
175 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset =
176 builder->fbb()->CreateVector<float>({1.25, 1.25, 1.25, 1.25, 1.25, 1.25});
177
178 frc971::MultiSpline::Builder multispline_builder =
179 builder->MakeBuilder<frc971::MultiSpline>();
180
181 multispline_builder.add_spline_count(1);
182 multispline_builder.add_spline_x(spline_x_offset);
183 multispline_builder.add_spline_y(spline_y_offset);
184
185 return multispline_builder.Finish();
186}
187
Stephan Pleinesf63bde82024-01-13 15:59:33 -0800188} // namespace y2020::actors