blob: de665d91affd2434edd9b2f23db2e60d4976b001 [file] [log] [blame]
Maxwell Hendersonad312342023-01-10 12:07:47 -08001#ifndef Y2023_CONSTANTS_H_
2#define Y2023_CONSTANTS_H_
3
4#include <array>
5#include <cmath>
6#include <cstdint>
7
8#include "frc971/constants.h"
9#include "frc971/control_loops/pose.h"
10#include "frc971/control_loops/static_zeroing_single_dof_profiled_subsystem.h"
11#include "y2023/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
milind-u37385182023-02-20 15:07:28 -080012#include "y2023/control_loops/superstructure/arm/arm_constants.h"
milind-u051c7002023-02-20 16:28:18 -080013#include "y2023/control_loops/superstructure/roll/roll_plant.h"
14#include "y2023/control_loops/superstructure/wrist/wrist_plant.h"
Maxwell Hendersonad312342023-01-10 12:07:47 -080015
16namespace y2023 {
17namespace constants {
18
19constexpr uint16_t kCompTeamNumber = 971;
20constexpr uint16_t kPracticeTeamNumber = 9971;
21constexpr uint16_t kCodingRobotTeamNumber = 7971;
22
23struct Values {
24 static const int kZeroingSampleSize = 200;
25
milind-u32d29d32023-02-24 21:11:51 -080026 static const int kSuperstructureCANWriterPriority = 35;
Ravago Jones2060ee62023-02-03 18:12:24 -080027 static const int kDrivetrainWriterPriority = 35;
28 static const int kDrivetrainTxPriority = 36;
29 static const int kDrivetrainRxPriority = 36;
30
Maxwell Hendersonad312342023-01-10 12:07:47 -080031 static constexpr double kDrivetrainCyclesPerRevolution() { return 512.0; }
32 static constexpr double kDrivetrainEncoderCountsPerRevolution() {
33 return kDrivetrainCyclesPerRevolution() * 4;
34 }
35 static constexpr double kDrivetrainEncoderRatio() { return 1.0; }
36 static constexpr double kMaxDrivetrainEncoderPulsesPerSecond() {
37 return control_loops::drivetrain::kFreeSpeed / (2.0 * M_PI) *
38 control_loops::drivetrain::kHighOutputRatio /
39 constants::Values::kDrivetrainEncoderRatio() *
40 kDrivetrainEncoderCountsPerRevolution();
41 }
42
Ravago Jones2060ee62023-02-03 18:12:24 -080043 static constexpr double kDrivetrainSupplyCurrentLimit() { return 35.0; }
Austin Schuhe70cdeb2023-02-23 21:45:00 -080044 static constexpr double kDrivetrainStatorCurrentLimit() { return 60.0; }
Ravago Jones2060ee62023-02-03 18:12:24 -080045
Maxwell Hendersonad312342023-01-10 12:07:47 -080046 static double DrivetrainEncoderToMeters(int32_t in) {
47 return ((static_cast<double>(in) /
48 kDrivetrainEncoderCountsPerRevolution()) *
49 (2.0 * M_PI)) *
50 kDrivetrainEncoderRatio() * control_loops::drivetrain::kWheelRadius;
51 }
52
Ravago Jones2060ee62023-02-03 18:12:24 -080053 static double DrivetrainCANEncoderToMeters(double rotations) {
54 return (rotations * (2.0 * M_PI)) *
55 control_loops::drivetrain::kHighOutputRatio *
56 control_loops::drivetrain::kWheelRadius;
57 }
milind-u37385182023-02-20 15:07:28 -080058 static constexpr double kProximalEncoderCountsPerRevolution() {
59 return 4096.0;
60 }
61 static constexpr double kProximalEncoderRatio() { return (15.0 / 95.0); }
62 static constexpr double kMaxProximalEncoderPulsesPerSecond() {
63 return control_loops::superstructure::arm::kArmConstants.free_speed /
milind-u0a7d28d2023-02-20 17:44:37 -080064 (2.0 * M_PI) / control_loops::superstructure::arm::kArmConstants.g0 /
milind-u37385182023-02-20 15:07:28 -080065 kProximalEncoderRatio() * kProximalEncoderCountsPerRevolution();
66 }
67 static constexpr double kProximalPotRatio() {
Austin Schuh7dcc49b2023-02-21 17:35:10 -080068 return (36.0 / 24.0) * (15.0 / 95.0);
milind-u37385182023-02-20 15:07:28 -080069 }
70
milind-u051c7002023-02-20 16:28:18 -080071 static constexpr double kProximalPotRadiansPerVolt() {
72 return kProximalPotRatio() * (10.0 /*turns*/ / 5.0 /*volts*/) *
73 (2 * M_PI /*radians*/);
74 }
75
milind-u37385182023-02-20 15:07:28 -080076 static constexpr double kDistalEncoderCountsPerRevolution() { return 4096.0; }
Austin Schuhebf76ee2023-02-24 20:34:33 -080077 static constexpr double kDistalEncoderRatio() { return (15.0 / 96.0); }
milind-u37385182023-02-20 15:07:28 -080078 static constexpr double kMaxDistalEncoderPulsesPerSecond() {
79 return control_loops::superstructure::arm::kArmConstants.free_speed /
milind-u0a7d28d2023-02-20 17:44:37 -080080 (2.0 * M_PI) / control_loops::superstructure::arm::kArmConstants.g1 /
81 kDistalEncoderRatio() * kProximalEncoderCountsPerRevolution();
milind-u37385182023-02-20 15:07:28 -080082 }
83 static constexpr double kDistalPotRatio() {
Austin Schuhebf76ee2023-02-24 20:34:33 -080084 return (36.0 / 24.0) * (15.0 / 96.0);
milind-u37385182023-02-20 15:07:28 -080085 }
Ravago Jones2060ee62023-02-03 18:12:24 -080086
milind-u051c7002023-02-20 16:28:18 -080087 static constexpr double kDistalPotRadiansPerVolt() {
88 return kDistalPotRatio() * (10.0 /*turns*/ / 5.0 /*volts*/) *
89 (2 * M_PI /*radians*/);
90 }
91
92 // Roll joint
93 static constexpr double kRollJointEncoderCountsPerRevolution() {
94 return 4096.0;
95 }
96
97 static constexpr double kRollJointEncoderRatio() { return (18.0 / 48.0); }
98
99 static constexpr double kRollJointPotRatio() { return (18.0 / 48.0); }
100
101 static constexpr double kRollJointPotRadiansPerVolt() {
102 return kRollJointPotRatio() * (3.0 /*turns*/ / 5.0 /*volts*/) *
103 (2 * M_PI /*radians*/);
104 }
105
106 static constexpr double kMaxRollJointEncoderPulsesPerSecond() {
107 return control_loops::superstructure::roll::kFreeSpeed / (2.0 * M_PI) *
108 control_loops::superstructure::roll::kOutputRatio /
109 kRollJointEncoderRatio() * kRollJointEncoderCountsPerRevolution();
110 }
111
112 static constexpr ::frc971::constants::Range kRollJointRange() {
113 return ::frc971::constants::Range{
114 -1.05, // Back Hard
115 1.44, // Front Hard
116 -0.89, // Back Soft
117 1.26 // Front Soft
118 };
119 }
120
121 // Wrist
122 static constexpr double kWristEncoderCountsPerRevolution() { return 4096.0; }
123
124 static constexpr double kWristEncoderRatio() {
125 return (24.0 / 36.0) * (36.0 / 60.0);
126 }
127
128 static constexpr double kMaxWristEncoderPulsesPerSecond() {
129 return control_loops::superstructure::wrist::kFreeSpeed / (2.0 * M_PI) *
130 control_loops::superstructure::wrist::kOutputRatio /
131 kWristEncoderRatio() * kWristEncoderCountsPerRevolution();
132 }
133
134 static constexpr ::frc971::constants::Range kWristRange() {
135 return ::frc971::constants::Range{
Austin Schuh6dc925b2023-02-24 16:23:32 -0800136 .lower_hard = -0.10, // Back Hard
137 .upper_hard = 2.30, // Front Hard
138 .lower = 0.0, // Back Soft
Austin Schuh35a7f622023-02-25 19:00:20 -0800139 .upper = 2.2, // Front Soft
milind-u051c7002023-02-20 16:28:18 -0800140 };
141 }
142
milind-u18934eb2023-02-20 16:28:58 -0800143 // Rollers
144 static constexpr double kRollerSupplyCurrentLimit() { return 30.0; }
Austin Schuh23a90022023-02-24 22:13:39 -0800145 static constexpr double kRollerStatorCurrentLimit() { return 100.0; }
Maxwell Henderson589cf272023-02-22 15:56:40 -0800146
147 // Game object is fed into end effector for at least this time
148 static constexpr std::chrono::milliseconds kExtraIntakingTime() {
Maxwell Henderson8ca44562023-02-23 13:11:51 -0800149 return std::chrono::seconds(2);
Maxwell Henderson589cf272023-02-22 15:56:40 -0800150 }
151
152 // Game object is spit from end effector for at least this time
153 static constexpr std::chrono::milliseconds kExtraSpittingTime() {
Maxwell Henderson8ca44562023-02-23 13:11:51 -0800154 return std::chrono::seconds(2);
Maxwell Henderson589cf272023-02-22 15:56:40 -0800155 }
milind-u18934eb2023-02-20 16:28:58 -0800156
Maxwell Henderson5c47a462023-02-25 14:40:44 -0800157 // if true, tune down all the arm constants for testing.
158 static constexpr bool kArmGrannyMode() { return false; }
159
160 // the operating voltage.
161 static constexpr double kArmOperatingVoltage() {
162 return kArmGrannyMode() ? 6.0 : 12.0;
163 }
164 static constexpr double kArmDt() { return 0.00505; }
165 static constexpr std::chrono::nanoseconds kArmDtDuration() {
166 return std::chrono::duration_cast<std::chrono::nanoseconds>(
167 std::chrono::duration<double>(kArmDt()));
168 }
169 static constexpr double kArmAlpha0Max() {
170 return kArmGrannyMode() ? 15.0 : 15.0;
171 }
172 static constexpr double kArmAlpha1Max() {
173 return kArmGrannyMode() ? 10.0 : 10.0;
174 }
175 static constexpr double kArmAlpha2Max() {
176 return kArmGrannyMode() ? 90.0 : 90.0;
177 }
178
179 static constexpr double kArmVMax() { return kArmGrannyMode() ? 4.0 : 9.5; }
180 static constexpr double kArmPathlessVMax() { return 4.5; }
181 static constexpr double kArmGotoPathVMax() { return 4.5; }
182
Maxwell Hendersonad312342023-01-10 12:07:47 -0800183 struct PotConstants {
184 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
185 ::frc971::zeroing::RelativeEncoderZeroingEstimator>
186 subsystem_params;
187 double potentiometer_offset;
188 };
189
190 struct PotAndAbsEncoderConstants {
191 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
192 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator>
193 subsystem_params;
194 double potentiometer_offset;
195 };
milind-u37385182023-02-20 15:07:28 -0800196
Maxwell Henderson8ca44562023-02-23 13:11:51 -0800197 struct AbsEncoderConstants {
198 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
199 ::frc971::zeroing::AbsoluteEncoderZeroingEstimator>
200 subsystem_params;
201 };
202
milind-u37385182023-02-20 15:07:28 -0800203 struct ArmJointConstants {
204 ::frc971::constants::PotAndAbsoluteEncoderZeroingConstants zeroing;
205 double potentiometer_offset;
206 };
207
208 ArmJointConstants arm_proximal;
209 ArmJointConstants arm_distal;
milind-u18a901d2023-02-17 21:51:55 -0800210 ArmJointConstants roll_joint;
milind-u051c7002023-02-20 16:28:18 -0800211
Maxwell Henderson8ca44562023-02-23 13:11:51 -0800212 AbsEncoderConstants wrist;
Maxwell Hendersonad312342023-01-10 12:07:47 -0800213};
214
215// Creates and returns a Values instance for the constants.
216// Should be called before realtime because this allocates memory.
217// Only the first call to either of these will be used.
218Values MakeValues(uint16_t team);
219
220// Calls MakeValues with aos::network::GetTeamNumber()
221Values MakeValues();
222
223} // namespace constants
224} // namespace y2023
225
226#endif // Y2023_CONSTANTS_H_