blob: 07d10eeca4a3c81ce5c373d49978a859a7753365 [file] [log] [blame]
Stephan Massaltd021f972020-01-05 20:41:23 -08001#include "y2020/constants.h"
2
3#include <inttypes.h>
4
5#include <map>
6
7#if __has_feature(address_sanitizer)
8#include "sanitizer/lsan_interface.h"
9#endif
10
11#include "absl/base/call_once.h"
12#include "aos/logging/logging.h"
Stephan Massaltd021f972020-01-05 20:41:23 -080013#include "aos/network/team_number.h"
Brian Silverman1463c092020-10-30 17:28:24 -070014#include "aos/stl_mutex/stl_mutex.h"
ravago901c4262020-02-16 15:33:14 -080015#include "y2020/control_loops/superstructure/control_panel/integral_control_panel_plant.h"
Sabina Davisa587fbd2020-01-31 22:11:15 -080016#include "y2020/control_loops/superstructure/hood/integral_hood_plant.h"
Kai Tinkess10943cf2020-02-01 15:49:57 -080017#include "y2020/control_loops/superstructure/intake/integral_intake_plant.h"
18#include "y2020/control_loops/superstructure/turret/integral_turret_plant.h"
Sabina Davisa587fbd2020-01-31 22:11:15 -080019
Stephan Massaltd021f972020-01-05 20:41:23 -080020namespace y2020 {
21namespace constants {
22
23const int Values::kZeroingSampleSize;
24
25namespace {
26
27const uint16_t kCompTeamNumber = 971;
28const uint16_t kPracticeTeamNumber = 9971;
James Kuszmaul6535d562020-05-09 16:58:13 -070029const uint16_t kSpareRoborioTeamNumber = 6971;
Stephan Massaltd021f972020-01-05 20:41:23 -080030
31const Values *DoGetValuesForTeam(uint16_t team) {
32 Values *const r = new Values();
Sabina Davisa587fbd2020-01-31 22:11:15 -080033 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
Ravago Jones937587c2020-12-26 17:21:09 -080034 ::frc971::zeroing::AbsoluteAndAbsoluteEncoderZeroingEstimator>
35 *const hood = &r->hood;
Sabina Davisa587fbd2020-01-31 22:11:15 -080036
James Kuszmaul98154a22021-04-03 16:09:29 -070037 constexpr double kFeetToMeters = 0.0254 * 12.0;
38 // Approximate robot length, for converting estimates from the doc below.
39 // Rounded up from exact estimate, since I'm not sure if the original estimate
40 // includes bumpers.
41 constexpr double kRobotLength = 0.9;
42 // { distance_to_target, { hood_angle, accelerator_power, finisher_power }}
43 // Current settings based on
44 // https://docs.google.com/document/d/1NR9F-ntlSoqZ9LqDzLjn-c14t8ZrppawCCG7wQy47RU/edit
45 r->shot_interpolation_table = InterpolationTable<Values::ShotParams>(
46 {{7.6 * kFeetToMeters - kRobotLength, {0.115, 197.0, 175.0}},
47 {7.6 * kFeetToMeters + kRobotLength, {0.31, 265.0, 235.0}},
48 {12.6 * kFeetToMeters + kRobotLength, {0.4, 292.0, 260.0}},
49 {17.6 * kFeetToMeters + kRobotLength, {0.52, 365.0, 325.0}}});
50
Sabina Davisa587fbd2020-01-31 22:11:15 -080051 // Hood constants.
Austin Schuh2efe1682021-03-06 22:47:15 -080052 hood->zeroing_voltage = 2.0;
Sabina Davisa587fbd2020-01-31 22:11:15 -080053 hood->operating_voltage = 12.0;
54 hood->zeroing_profile_params = {0.5, 3.0};
55 hood->default_profile_params = {6.0, 30.0};
56 hood->range = Values::kHoodRange();
57 hood->make_integral_loop =
58 control_loops::superstructure::hood::MakeIntegralHoodLoop;
59 hood->zeroing_constants.average_filter_size = Values::kZeroingSampleSize;
Sabina Davisa587fbd2020-01-31 22:11:15 -080060 hood->zeroing_constants.zeroing_threshold = 0.0005;
61 hood->zeroing_constants.moving_buffer_size = 20;
62 hood->zeroing_constants.allowable_encoder_error = 0.9;
Ravago Jones937587c2020-12-26 17:21:09 -080063 hood->zeroing_constants.one_revolution_distance =
64 M_PI * 2.0 * constants::Values::kHoodEncoderRatio();
65 hood->zeroing_constants.single_turn_middle_position =
66 Values::kHoodRange().middle();
67 hood->zeroing_constants.single_turn_one_revolution_distance =
68 M_PI * 2.0 * constants::Values::kHoodSingleTurnEncoderRatio();
69 hood->zeroing_constants.measured_absolute_position = 0;
70 hood->zeroing_constants.single_turn_measured_absolute_position = 0;
Stephan Massaltd021f972020-01-05 20:41:23 -080071
Sabina Davise8d38992020-02-02 15:00:31 -080072 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
73 ::frc971::zeroing::AbsoluteEncoderZeroingEstimator> *const intake =
74 &r->intake;
75
76 // Intake constants.
77 intake->zeroing_voltage = 3.0;
78 intake->operating_voltage = 12.0;
79 intake->zeroing_profile_params = {0.5, 3.0};
80 intake->default_profile_params = {6.0, 30.0};
81 intake->range = Values::kIntakeRange();
82 intake->make_integral_loop =
83 control_loops::superstructure::intake::MakeIntegralIntakeLoop;
84 intake->zeroing_constants.average_filter_size = Values::kZeroingSampleSize;
85 intake->zeroing_constants.one_revolution_distance =
86 M_PI * 2.0 * constants::Values::kIntakeEncoderRatio();
87 intake->zeroing_constants.zeroing_threshold = 0.0005;
88 intake->zeroing_constants.moving_buffer_size = 20;
89 intake->zeroing_constants.allowable_encoder_error = 0.9;
90 intake->zeroing_constants.middle_position = Values::kIntakeRange().middle();
91
Kai Tinkess10943cf2020-02-01 15:49:57 -080092 Values::PotAndAbsEncoderConstants *const turret = &r->turret;
93 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
94 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator>
95 *const turret_params = &turret->subsystem_params;
96
ravago901c4262020-02-16 15:33:14 -080097 // Turret Constants
Kai Tinkess10943cf2020-02-01 15:49:57 -080098 turret_params->zeroing_voltage = 4.0;
James Kuszmaul519585d2020-03-08 22:32:48 -070099 turret_params->operating_voltage = 8.0;
Kai Tinkess10943cf2020-02-01 15:49:57 -0800100 // TODO(austin): Tune these.
101 turret_params->zeroing_profile_params = {0.5, 2.0};
102 turret_params->default_profile_params = {15.0, 40.0};
103 turret_params->range = Values::kTurretRange();
104 turret_params->make_integral_loop =
105 &control_loops::superstructure::turret::MakeIntegralTurretLoop;
106 turret_params->zeroing_constants.average_filter_size =
107 Values::kZeroingSampleSize;
108 turret_params->zeroing_constants.one_revolution_distance =
109 M_PI * 2.0 * constants::Values::kTurretEncoderRatio();
110 turret_params->zeroing_constants.zeroing_threshold = 0.0005;
111 turret_params->zeroing_constants.moving_buffer_size = 20;
112 turret_params->zeroing_constants.allowable_encoder_error = 0.9;
113
Austin Schuh9dcd5202020-02-20 20:06:04 -0800114 CHECK_LE(hood->range.range(),
Ravago Jones937587c2020-12-26 17:21:09 -0800115 hood->zeroing_constants.single_turn_one_revolution_distance);
Austin Schuh9dcd5202020-02-20 20:06:04 -0800116 CHECK_LE(intake->range.range(),
117 intake->zeroing_constants.one_revolution_distance);
118
Stephan Massaltd021f972020-01-05 20:41:23 -0800119 switch (team) {
120 // A set of constants for tests.
121 case 1:
James Kuszmaul6535d562020-05-09 16:58:13 -0700122 case kSpareRoborioTeamNumber:
Stephan Massaltd021f972020-01-05 20:41:23 -0800123 break;
124
125 case kCompTeamNumber:
Sabina Davisf7afd112020-02-23 13:42:14 -0800126 intake->zeroing_constants.measured_absolute_position =
127 1.42977866919024 - Values::kIntakeZero();
Kai Tinkess10943cf2020-02-01 15:49:57 -0800128
Austin Schuh2fb23642020-02-29 15:10:51 -0800129 turret->potentiometer_offset = 5.52519370141247 + 0.00853506822980376 +
130 0.0109413725126625 - 0.223719825811759;
Sabina Davisf7afd112020-02-23 13:42:14 -0800131 turret_params->zeroing_constants.measured_absolute_position =
Austin Schuh2fb23642020-02-29 15:10:51 -0800132 0.547478339799516;
Ravago Jones937587c2020-12-26 17:21:09 -0800133
Austin Schuh2efe1682021-03-06 22:47:15 -0800134 hood->zeroing_constants.measured_absolute_position = 0.0344482433884915;
135 hood->zeroing_constants.single_turn_measured_absolute_position =
136 0.31055891442198;
Stephan Massaltd021f972020-01-05 20:41:23 -0800137 break;
138
139 case kPracticeTeamNumber:
Sabina Davisa587fbd2020-01-31 22:11:15 -0800140 hood->zeroing_constants.measured_absolute_position = 0.0;
Kai Tinkess10943cf2020-02-01 15:49:57 -0800141
Austin Schuh31904ee2021-03-06 23:52:08 -0800142 intake->zeroing_constants.measured_absolute_position = 0.347;
Kai Tinkess10943cf2020-02-01 15:49:57 -0800143
Austin Schuh31904ee2021-03-06 23:52:08 -0800144 turret->potentiometer_offset = 5.3931926228241;
145 turret_params->zeroing_constants.measured_absolute_position = 4.22;
Stephan Massaltd021f972020-01-05 20:41:23 -0800146 break;
147
Austin Schuh83873c32020-02-22 14:58:39 -0800148 case Values::kCodingRobotTeamNumber:
Sabina Davisa587fbd2020-01-31 22:11:15 -0800149 hood->zeroing_constants.measured_absolute_position = 0.0;
Kai Tinkess10943cf2020-02-01 15:49:57 -0800150
Sabina Davise8d38992020-02-02 15:00:31 -0800151 intake->zeroing_constants.measured_absolute_position = 0.0;
Kai Tinkess10943cf2020-02-01 15:49:57 -0800152
153 turret->potentiometer_offset = 0.0;
154 turret_params->zeroing_constants.measured_absolute_position = 0.0;
Stephan Massaltd021f972020-01-05 20:41:23 -0800155 break;
156
157 default:
158 AOS_LOG(FATAL, "unknown team #%" PRIu16 "\n", team);
159 }
160
161 return r;
162}
163
164void DoGetValues(const Values **result) {
165 uint16_t team = ::aos::network::GetTeamNumber();
166 AOS_LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
167 *result = DoGetValuesForTeam(team);
168}
169
170} // namespace
171
172const Values &GetValues() {
173 static absl::once_flag once;
174 static const Values *result;
175 absl::call_once(once, DoGetValues, &result);
176 return *result;
177}
178
179const Values &GetValuesForTeam(uint16_t team_number) {
Brian Silverman1463c092020-10-30 17:28:24 -0700180 static aos::stl_mutex mutex;
181 std::unique_lock<aos::stl_mutex> locker(mutex);
Stephan Massaltd021f972020-01-05 20:41:23 -0800182
ravago901c4262020-02-16 15:33:14 -0800183 // IMPORTANT: This declaration has to stay after the mutex is locked to
184 // avoid race conditions.
Stephan Massaltd021f972020-01-05 20:41:23 -0800185 static ::std::map<uint16_t, const Values *> values;
186
187 if (values.count(team_number) == 0) {
188 values[team_number] = DoGetValuesForTeam(team_number);
189#if __has_feature(address_sanitizer)
190 __lsan_ignore_object(values[team_number]);
191#endif
192 }
193 return *values[team_number];
194}
195
196} // namespace constants
197} // namespace y2020