blob: 3ad292d46c3a5e6ec92a97b46f13491cc2599b95 [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
5namespace y2020 {
6namespace actors {
7
Ravago Jones81e50632022-03-11 16:23:51 -08008constexpr double kFieldLength = 16.4592;
9constexpr double kFieldWidth = 8.2296;
Austin Schuhd0e9e062021-10-24 17:40:58 -070010
Stephan Massaltd021f972020-01-05 20:41:23 -080011void MaybeFlipSpline(
James Kuszmaul75a18c52021-03-10 22:02:07 -080012 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
13 *builder,
Stephan Massaltd021f972020-01-05 20:41:23 -080014 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset,
15 bool is_left) {
16 flatbuffers::Vector<float> *spline_y =
17 GetMutableTemporaryPointer(*builder->fbb(), spline_y_offset);
18
19 if (!is_left) {
20 for (size_t i = 0; i < spline_y->size(); i++) {
21 spline_y->Mutate(i, -spline_y->Get(i));
22 }
23 }
24}
25
Austin Schuhd0e9e062021-10-24 17:40:58 -070026flatbuffers::Offset<frc971::MultiSpline> FixSpline(
27 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
28 *builder,
29 flatbuffers::Offset<frc971::MultiSpline> spline_offset,
30 aos::Alliance alliance) {
31 frc971::MultiSpline *spline =
32 GetMutableTemporaryPointer(*builder->fbb(), spline_offset);
33 flatbuffers::Vector<float> *spline_x = spline->mutable_spline_x();
34 flatbuffers::Vector<float> *spline_y = spline->mutable_spline_y();
35
36 for (size_t ii = 0; ii < spline_x->size(); ++ii) {
37 spline_x->Mutate(ii, spline_x->Get(ii) - kFieldLength / 2.0);
38 }
39 for (size_t ii = 0; ii < spline_y->size(); ++ii) {
40 spline_y->Mutate(ii, kFieldWidth / 2.0 - spline_y->Get(ii));
41 }
42
43 if (alliance == aos::Alliance::kBlue) {
44 for (size_t ii = 0; ii < spline_x->size(); ++ii) {
45 spline_x->Mutate(ii, -spline_x->Get(ii));
46 }
47 for (size_t ii = 0; ii < spline_y->size(); ++ii) {
48 spline_y->Mutate(ii, -spline_y->Get(ii));
49 }
50 }
51 return spline_offset;
52}
53
Stephan Massaltd021f972020-01-05 20:41:23 -080054flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::BasicSSpline(
James Kuszmaul75a18c52021-03-10 22:02:07 -080055 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
56 *builder,
James Kuszmaulddd2ba62020-03-08 22:17:13 -070057 aos::Alliance alliance) {
Stephan Massaltd021f972020-01-05 20:41:23 -080058 flatbuffers::Offset<frc971::Constraint> longitudinal_constraint_offset;
59 flatbuffers::Offset<frc971::Constraint> lateral_constraint_offset;
60 flatbuffers::Offset<frc971::Constraint> voltage_constraint_offset;
61
62 {
63 frc971::Constraint::Builder longitudinal_constraint_builder =
64 builder->MakeBuilder<frc971::Constraint>();
65 longitudinal_constraint_builder.add_constraint_type(
66 frc971::ConstraintType::LONGITUDINAL_ACCELERATION);
Austin Schuhfd1715f2021-01-30 16:58:24 -080067 longitudinal_constraint_builder.add_value(1.0);
Stephan Massaltd021f972020-01-05 20:41:23 -080068 longitudinal_constraint_offset = longitudinal_constraint_builder.Finish();
69 }
70
71 {
72 frc971::Constraint::Builder lateral_constraint_builder =
73 builder->MakeBuilder<frc971::Constraint>();
74 lateral_constraint_builder.add_constraint_type(
75 frc971::ConstraintType::LATERAL_ACCELERATION);
Austin Schuhfd1715f2021-01-30 16:58:24 -080076 lateral_constraint_builder.add_value(1.0);
Stephan Massaltd021f972020-01-05 20:41:23 -080077 lateral_constraint_offset = lateral_constraint_builder.Finish();
78 }
79
80 {
81 frc971::Constraint::Builder voltage_constraint_builder =
82 builder->MakeBuilder<frc971::Constraint>();
83 voltage_constraint_builder.add_constraint_type(
84 frc971::ConstraintType::VOLTAGE);
Austin Schuhfd1715f2021-01-30 16:58:24 -080085 voltage_constraint_builder.add_value(2.0);
Stephan Massaltd021f972020-01-05 20:41:23 -080086 voltage_constraint_offset = voltage_constraint_builder.Finish();
87 }
88
89 flatbuffers::Offset<
90 flatbuffers::Vector<flatbuffers::Offset<frc971::Constraint>>>
91 constraints_offset =
92 builder->fbb()->CreateVector<flatbuffers::Offset<frc971::Constraint>>(
93 {longitudinal_constraint_offset, lateral_constraint_offset,
94 voltage_constraint_offset});
95
Austin Schuhfd1715f2021-01-30 16:58:24 -080096 const float startx = 0.0;
97 const float starty = 0.0;
98 std::vector<float> x_pos{0.0f + startx, 0.4f + startx, 0.4f + startx,
99 0.6f + startx, 0.6f + startx, 1.0f + startx};
milind-u0e203782021-10-30 21:57:20 -0700100 std::vector<float> y_pos{starty + 0.0f, starty + 0.0f, starty + 0.05f,
Austin Schuhfd1715f2021-01-30 16:58:24 -0800101 starty + 0.1f, starty + 0.15f, starty + 0.15f};
James Kuszmaulddd2ba62020-03-08 22:17:13 -0700102 if (alliance == aos::Alliance::kRed) {
103 for (size_t ii = 0; ii < x_pos.size(); ++ii) {
104 x_pos[ii] *= -1;
105 y_pos[ii] *= -1;
106 }
107 }
Stephan Massaltd021f972020-01-05 20:41:23 -0800108 flatbuffers::Offset<flatbuffers::Vector<float>> spline_x_offset =
James Kuszmaulddd2ba62020-03-08 22:17:13 -0700109 builder->fbb()->CreateVector<float>(x_pos);
Stephan Massaltd021f972020-01-05 20:41:23 -0800110 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset =
James Kuszmaulddd2ba62020-03-08 22:17:13 -0700111 builder->fbb()->CreateVector<float>(y_pos);
Stephan Massaltd021f972020-01-05 20:41:23 -0800112
113 frc971::MultiSpline::Builder multispline_builder =
114 builder->MakeBuilder<frc971::MultiSpline>();
115
116 multispline_builder.add_spline_count(1);
117 multispline_builder.add_constraints(constraints_offset);
118 multispline_builder.add_spline_x(spline_x_offset);
119 multispline_builder.add_spline_y(spline_y_offset);
120
121 return multispline_builder.Finish();
122}
123
Austin Schuhd0e9e062021-10-24 17:40:58 -0700124flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::TargetAligned1(
125 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
126 *builder,
127 aos::Alliance alliance) {
128 return FixSpline(builder,
129 aos::CopyFlatBuffer<frc971::MultiSpline>(target_aligned_1_,
130 builder->fbb()),
131 alliance);
132}
133
134flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::TargetAligned2(
135 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
136 *builder,
137 aos::Alliance alliance) {
138 return FixSpline(builder,
139 aos::CopyFlatBuffer<frc971::MultiSpline>(target_aligned_2_,
140 builder->fbb()),
141 alliance);
142}
143
milind-u0e203782021-10-30 21:57:20 -0700144flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::TargetAligned3(
145 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
146 *builder,
147 aos::Alliance alliance) {
148 return FixSpline(builder,
149 aos::CopyFlatBuffer<frc971::MultiSpline>(target_aligned_3_,
150 builder->fbb()),
151 alliance);
152}
153
Austin Schuh3653cf22021-11-12 11:54:51 -0800154flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::FarSideFender(
155 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
156 *builder,
157 aos::Alliance alliance) {
158 // I drew the spline on the wrong side of the field.
159 if (alliance == aos::Alliance::kBlue) {
160 alliance = aos::Alliance::kRed;
161 } else {
162 alliance = aos::Alliance::kBlue;
163 }
164 return FixSpline(builder,
165 aos::CopyFlatBuffer<frc971::MultiSpline>(far_side_fender_,
166 builder->fbb()),
167 alliance);
168}
169
Stephan Massaltd021f972020-01-05 20:41:23 -0800170flatbuffers::Offset<frc971::MultiSpline> AutonomousSplines::StraightLine(
James Kuszmaul75a18c52021-03-10 22:02:07 -0800171 aos::Sender<frc971::control_loops::drivetrain::SplineGoal>::Builder
172 *builder) {
Stephan Massaltd021f972020-01-05 20:41:23 -0800173 flatbuffers::Offset<flatbuffers::Vector<float>> spline_x_offset =
174 builder->fbb()->CreateVector<float>(
175 {-12.3, -11.9, -11.5, -11.1, -10.6, -10.0});
176 flatbuffers::Offset<flatbuffers::Vector<float>> spline_y_offset =
177 builder->fbb()->CreateVector<float>({1.25, 1.25, 1.25, 1.25, 1.25, 1.25});
178
179 frc971::MultiSpline::Builder multispline_builder =
180 builder->MakeBuilder<frc971::MultiSpline>();
181
182 multispline_builder.add_spline_count(1);
183 multispline_builder.add_spline_x(spline_x_offset);
184 multispline_builder.add_spline_y(spline_y_offset);
185
186 return multispline_builder.Finish();
187}
188
189} // namespace actors
190} // namespace y2020