| #ifndef Y2015_CONSTANTS_H_ |
| #define Y2015_CONSTANTS_H_ |
| |
| #include <stdint.h> |
| |
| #include "frc971/control_loops/state_feedback_loop.h" |
| #include "frc971/shifter_hall_effect.h" |
| #include "frc971/constants.h" |
| |
| namespace frc971 { |
| namespace constants { |
| |
| // Has all of the numbers that change for both robots and makes it easy to |
| // retrieve the values for the current one. |
| |
| // Everything is in SI units (volts, radians, meters, seconds, etc). |
| // Some of these values are related to the conversion between raw values |
| // (encoder counts, voltage, etc) to scaled units (radians, meters, etc). |
| |
| // This structure contains current values for all of the things that change. |
| struct Values { |
| // Drivetrain Values ///// |
| |
| // The ratio from the encoder shaft to the drivetrain wheels. |
| double drivetrain_encoder_ratio; |
| // The ratio from the encoder shaft to the arm joint. |
| double arm_encoder_ratio; |
| // The ratio from the pot shaft to the arm joint. |
| double arm_pot_ratio; |
| // The ratio from the encoder shaft to the elevator output pulley. |
| double elev_encoder_ratio; |
| // The ratio from the pot shaft to the elevator output pulley. |
| double elev_pot_ratio; |
| // How far the elevator moves (meters) per radian on the output pulley. |
| double elev_distance_per_radian; |
| // The ratio from the encoder shaft to the claw joint. |
| double claw_encoder_ratio; |
| // The ratio from the pot shaft to the claw joint. |
| double claw_pot_ratio; |
| |
| // How tall a tote is in meters. |
| double tote_height; |
| |
| // The gear ratios from motor shafts to the drivetrain wheels for high and low |
| // gear. |
| double low_gear_ratio; |
| double high_gear_ratio; |
| ShifterHallEffect left_drive, right_drive; |
| bool clutch_transmission; |
| |
| double turn_width; |
| |
| ::std::function<StateFeedbackLoop<2, 2, 2>()> make_v_drivetrain_loop; |
| ::std::function<StateFeedbackLoop<4, 2, 2>()> make_drivetrain_loop; |
| |
| double drivetrain_done_distance; |
| double drivetrain_max_speed; |
| |
| // Superstructure Values ///// |
| |
| // Defines a range of motion for a subsystem. |
| // These are all absolute positions in scaled units. |
| struct Range { |
| double lower_hard_limit; |
| double upper_hard_limit; |
| double lower_limit; |
| double upper_limit; |
| }; |
| |
| struct Claw { |
| Range wrist; |
| ZeroingConstants zeroing; |
| // The value to add to potentiometer readings after they have been converted |
| // to radians so that the resulting value is 0 when the claw is at absolute |
| // 0 (horizontal straight out the front). |
| double potentiometer_offset; |
| |
| // Time between sending commands to claw opening pistons and them reaching |
| // the new state. |
| double piston_switch_time; |
| // How far on either side we look for the index pulse before we give up. |
| double zeroing_range; |
| }; |
| Claw claw; |
| |
| struct Fridge { |
| Range elevator; |
| Range arm; |
| |
| ZeroingConstants left_elev_zeroing; |
| ZeroingConstants right_elev_zeroing; |
| ZeroingConstants left_arm_zeroing; |
| ZeroingConstants right_arm_zeroing; |
| |
| // Values to add to scaled potentiometer readings so 0 lines up with the |
| // physical absolute 0. |
| double left_elevator_potentiometer_offset; |
| double right_elevator_potentiometer_offset; |
| double left_arm_potentiometer_offset; |
| double right_arm_potentiometer_offset; |
| |
| // How high the elevator has to be before we start zeroing the arm. |
| double arm_zeroing_height; |
| |
| // The length of the arm, from the axis of the bottom pivot to the axis of |
| // the top pivot. |
| double arm_length; |
| }; |
| Fridge fridge; |
| |
| double max_allowed_left_right_arm_difference; |
| double max_allowed_left_right_elevator_difference; |
| |
| struct ClawGeometry { |
| // Horizontal distance from the center of the grabber to the end. |
| double grabber_half_length; |
| // Vertical distance from the arm rotation center to the bottom of the |
| // grabber. Distance measured with arm vertical (theta = 0). |
| double grabber_delta_y; |
| // Vertical separation of the claw and arm rotation centers with the |
| // elevator at 0.0 and the arm angle set to zero. |
| double grabber_arm_vert_separation; |
| // Horizontal separation of the claw and arm rotation centers with the |
| // elevator at 0.0 and the arm angle set to zero. |
| double grabber_arm_horz_separation; |
| // Distance between the center of the claw to the top of the claw. |
| // The line drawn at this distance parallel to the claw centerline is used |
| // to determine if claw interfears with the grabber. |
| double claw_top_thickness; |
| // The grabber is safe at any height if it is behind this location. |
| double grabber_always_safe_h_min; |
| // The grabber is safe at any x if it is above this location. |
| double grabber_always_safe_x_max; |
| }; |
| ClawGeometry clawGeometry; |
| }; |
| |
| // Creates (once) a Values instance for ::aos::network::GetTeamNumber() and |
| // returns a reference to it. |
| const Values &GetValues(); |
| |
| // Creates Values instances for each team number it is called with and returns |
| // them. |
| const Values &GetValuesForTeam(uint16_t team_number); |
| |
| } // namespace constants |
| } // namespace frc971 |
| |
| #endif // Y2015_CONSTANTS_H_ |