blob: c2c876e9729f99d41c06b4b10be70b1d86c24d5a [file] [log] [blame]
Comran Morshed5323ecb2015-12-26 20:50:55 +00001#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_CONSTANTS_H_
2#define FRC971_CONTROL_LOOPS_DRIVETRAIN_CONSTANTS_H_
3
4#include <functional>
5
6#include "frc971/shifter_hall_effect.h"
7#include "frc971/control_loops/state_feedback_loop.h"
8
9namespace frc971 {
10namespace control_loops {
11namespace drivetrain {
12
13enum class ShifterType : int32_t {
14 HALL_EFFECT_SHIFTER = 0, // Detect when inbetween gears.
Adam Snaider18f44172016-10-22 15:30:21 -070015 SIMPLE_SHIFTER = 1, // Switch gears without speedmatch logic.
16 NO_SHIFTER = 2, // Only one gear ratio.
Comran Morshed5323ecb2015-12-26 20:50:55 +000017};
18
Comran Morshed76ca8f52016-02-21 17:26:28 +000019enum class LoopType : int32_t {
Adam Snaider18f44172016-10-22 15:30:21 -070020 OPEN_LOOP = 0, // Only use open loop logic.
Comran Morshed76ca8f52016-02-21 17:26:28 +000021 CLOSED_LOOP = 1, // Add in closed loop calculation.
22};
23
Campbell Crowley2527ed22017-02-17 21:10:02 -080024enum class GyroType : int32_t {
25 SPARTAN_GYRO = 0, // Use the gyro on the spartan board.
26 IMU_X_GYRO = 1, // Use the x-axis of the gyro on the IMU.
27 IMU_Y_GYRO = 2, // Use the y-axis of the gyro on the IMU.
28 IMU_Z_GYRO = 3, // Use the z-axis of the gyro on the IMU.
29 FLIPPED_SPARTAN_GYRO = 4, // Use the gyro on the spartan board.
30};
31
Diana Burgessd0180f12018-03-21 21:24:17 -070032enum class IMUType : int32_t {
33 IMU_X = 0, // Use the x-axis of the IMU.
34 IMU_Y = 1, // Use the y-axis of the IMU.
35};
36
Comran Morshed5323ecb2015-12-26 20:50:55 +000037struct DrivetrainConfig {
38 // Shifting method we are using.
39 ShifterType shifter_type;
40
Comran Morshed76ca8f52016-02-21 17:26:28 +000041 // Type of loop to use.
42 LoopType loop_type;
43
Campbell Crowley2527ed22017-02-17 21:10:02 -080044 // Type of gyro to use.
45 GyroType gyro_type;
46
Diana Burgessd0180f12018-03-21 21:24:17 -070047 // Type of IMU to use.
48 IMUType imu_type;
49
Comran Morshed5323ecb2015-12-26 20:50:55 +000050 // Polydrivetrain functions returning various controller loops with plants.
51 ::std::function<StateFeedbackLoop<4, 2, 2>()> make_drivetrain_loop;
52 ::std::function<StateFeedbackLoop<2, 2, 2>()> make_v_drivetrain_loop;
Diana Burgessd0180f12018-03-21 21:24:17 -070053 ::std::function<StateFeedbackLoop<7, 2, 4>()> make_kf_drivetrain_loop;
Comran Morshed5323ecb2015-12-26 20:50:55 +000054
Adam Snaider18f44172016-10-22 15:30:21 -070055 double dt; // Control loop time step.
Comran Morshed5323ecb2015-12-26 20:50:55 +000056 double robot_radius; // Robot radius, in meters.
57 double wheel_radius; // Wheel radius, in meters.
Adam Snaider18f44172016-10-22 15:30:21 -070058 double v; // Motor velocity constant.
Comran Morshed5323ecb2015-12-26 20:50:55 +000059
Austin Schuh09fa9bb2016-02-16 11:47:40 -080060 // Gear ratios, from wheel to motor shaft.
Comran Morshed5323ecb2015-12-26 20:50:55 +000061 double high_gear_ratio;
62 double low_gear_ratio;
63
64 // Hall effect constants. Unused if not applicable to shifter type.
65 constants::ShifterHallEffect left_drive;
66 constants::ShifterHallEffect right_drive;
Adam Snaiderbc918b62016-02-27 21:03:39 -080067
68 // Variable that holds the default gear ratio. We use this in ZeroOutputs().
69 // (ie. true means high gear is default).
70 bool default_high_gear;
Austin Schuh889fee82016-04-13 22:16:36 -070071
72 double down_offset;
Adam Snaider94a52372016-10-19 20:06:01 -070073
74 double wheel_non_linearity;
75
76 double quickturn_wheel_multiplier;
Austin Schuhd91c0d22016-10-15 21:24:28 -070077
Austin Schuhe8a54c02018-03-05 00:25:58 -080078 double wheel_multiplier;
79
Austin Schuhd91c0d22016-10-15 21:24:28 -070080 // Converts the robot state to a linear distance position, velocity.
81 static Eigen::Matrix<double, 2, 1> LeftRightToLinear(
82 const Eigen::Matrix<double, 7, 1> &left_right) {
83 Eigen::Matrix<double, 2, 1> linear;
84 linear(0, 0) = (left_right(0, 0) + left_right(2, 0)) / 2.0;
85 linear(1, 0) = (left_right(1, 0) + left_right(3, 0)) / 2.0;
86 return linear;
87 }
88 // Converts the robot state to an anglular distance, velocity.
89 Eigen::Matrix<double, 2, 1> LeftRightToAngular(
90 const Eigen::Matrix<double, 7, 1> &left_right) const {
91 Eigen::Matrix<double, 2, 1> angular;
92 angular(0, 0) =
93 (left_right(2, 0) - left_right(0, 0)) / (this->robot_radius * 2.0);
94 angular(1, 0) =
95 (left_right(3, 0) - left_right(1, 0)) / (this->robot_radius * 2.0);
96 return angular;
97 }
98
99 // Converts the linear and angular position, velocity to the top 4 states of
100 // the robot state.
101 Eigen::Matrix<double, 4, 1> AngularLinearToLeftRight(
102 const Eigen::Matrix<double, 2, 1> &linear,
103 const Eigen::Matrix<double, 2, 1> &angular) const {
104 Eigen::Matrix<double, 2, 1> scaled_angle =
105 angular * this->robot_radius;
106 Eigen::Matrix<double, 4, 1> state;
107 state(0, 0) = linear(0, 0) - scaled_angle(0, 0);
108 state(1, 0) = linear(1, 0) - scaled_angle(1, 0);
109 state(2, 0) = linear(0, 0) + scaled_angle(0, 0);
110 state(3, 0) = linear(1, 0) + scaled_angle(1, 0);
111 return state;
112 }
Comran Morshed5323ecb2015-12-26 20:50:55 +0000113};
114
115} // namespace drivetrain
116} // namespace control_loops
117} // namespace frc971
118
119#endif // FRC971_CONTROL_LOOPS_DRIVETRAIN_CONSTANTS_H_