blob: 3e10956704e7488ac37a34950f67c176a2e656be [file] [log] [blame]
milind-u086d7262022-01-19 20:44:18 -08001#ifndef Y2022_CONTROL_LOOPS_SUPERSTRUCTURE_SUPERSTRUCTURE_H_
2#define Y2022_CONTROL_LOOPS_SUPERSTRUCTURE_SUPERSTRUCTURE_H_
3
milind-u086d7262022-01-19 20:44:18 -08004#include "aos/events/event_loop.h"
Nathan Leongdd728002024-02-03 15:26:53 -08005#include "frc971/control_loops/catapult/catapult.h"
Siddhant Kanwar0e37f592022-02-21 19:26:50 -08006#include "frc971/control_loops/control_loop.h"
Henry Speiser55aa3ba2022-02-21 23:21:12 -08007#include "frc971/control_loops/drivetrain/drivetrain_status_generated.h"
James Kuszmaulec635d22023-08-12 18:39:24 -07008#include "frc971/zeroing/pot_and_absolute_encoder.h"
milind-u086d7262022-01-19 20:44:18 -08009#include "y2022/constants.h"
Nathan Leongdd728002024-02-03 15:26:53 -080010#include "y2022/control_loops/superstructure/catapult/catapult_plant.h"
11#include "y2022/control_loops/superstructure/catapult/integral_catapult_plant.h"
Milind Upadhyay225156b2022-02-25 22:42:12 -080012#include "y2022/control_loops/superstructure/collision_avoidance.h"
Ravago Jones5da06352022-03-04 20:26:24 -080013#include "y2022/control_loops/superstructure/superstructure_can_position_generated.h"
milind-u086d7262022-01-19 20:44:18 -080014#include "y2022/control_loops/superstructure/superstructure_goal_generated.h"
15#include "y2022/control_loops/superstructure/superstructure_output_generated.h"
16#include "y2022/control_loops/superstructure/superstructure_position_generated.h"
17#include "y2022/control_loops/superstructure/superstructure_status_generated.h"
James Kuszmaul84083f42022-02-27 17:24:38 -080018#include "y2022/control_loops/superstructure/turret/aiming.h"
Ravago Jonesd51af7a2022-03-26 21:44:20 -070019#include "y2022/vision/ball_color_generated.h"
milind-u086d7262022-01-19 20:44:18 -080020
21namespace y2022 {
22namespace control_loops {
23namespace superstructure {
24
25class Superstructure
26 : public ::frc971::controls::ControlLoop<Goal, Position, Status, Output> {
27 public:
Siddhant Kanwar0e37f592022-02-21 19:26:50 -080028 using RelativeEncoderSubsystem =
29 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystem<
30 ::frc971::zeroing::RelativeEncoderZeroingEstimator,
31 ::frc971::control_loops::RelativeEncoderProfiledJointStatus>;
32
Henry Speiser55aa3ba2022-02-21 23:21:12 -080033 using PotAndAbsoluteEncoderSubsystem =
34 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystem<
35 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator,
36 ::frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus>;
37
Milind Upadhyay47e0d032022-03-05 23:06:25 -080038 static constexpr double kTurretGoalThreshold = 0.05;
milind-uc63d0942022-04-15 12:07:42 -070039 static constexpr double kTurretGoalLoadingThreshold = 0.70;
Milind Upadhyay47e0d032022-03-05 23:06:25 -080040 static constexpr double kCatapultGoalThreshold = 0.05;
Ravago Jones5da06352022-03-04 20:26:24 -080041 // potentiometer will be more noisy
42 static constexpr double kFlipperGoalThreshold = 0.05;
Ravago Jonesd51af7a2022-03-26 21:44:20 -070043 static constexpr double kDiscardingPosition = 0.35;
44 static constexpr double kDiscardingVelocity = 6.0;
Ravago Jones5da06352022-03-04 20:26:24 -080045
milind-u086d7262022-01-19 20:44:18 -080046 explicit Superstructure(::aos::EventLoop *event_loop,
Milind Upadhyay225156b2022-02-25 22:42:12 -080047 std::shared_ptr<const constants::Values> values,
milind-u086d7262022-01-19 20:44:18 -080048 const ::std::string &name = "/superstructure");
49
Henry Speiser55aa3ba2022-02-21 23:21:12 -080050 inline const PotAndAbsoluteEncoderSubsystem &intake_front() const {
51 return intake_front_;
52 }
53 inline const PotAndAbsoluteEncoderSubsystem &intake_back() const {
54 return intake_back_;
55 }
56 inline const PotAndAbsoluteEncoderSubsystem &turret() const {
57 return turret_;
58 }
59 inline const RelativeEncoderSubsystem &climber() const { return climber_; }
60
61 double robot_velocity() const;
62
milind-u086d7262022-01-19 20:44:18 -080063 protected:
64 virtual void RunIteration(const Goal *unsafe_goal, const Position *position,
65 aos::Sender<Output>::Builder *output,
66 aos::Sender<Status>::Builder *status) override;
67
68 private:
Austin Schuh39f26f62022-02-24 21:34:46 -080069 std::shared_ptr<const constants::Values> values_;
70
Siddhant Kanwar0e37f592022-02-21 19:26:50 -080071 RelativeEncoderSubsystem climber_;
Henry Speiser55aa3ba2022-02-21 23:21:12 -080072 PotAndAbsoluteEncoderSubsystem intake_front_;
73 PotAndAbsoluteEncoderSubsystem intake_back_;
74 PotAndAbsoluteEncoderSubsystem turret_;
Nathan Leongdd728002024-02-03 15:26:53 -080075 ::frc971::control_loops::catapult::Catapult catapult_;
Henry Speiser55aa3ba2022-02-21 23:21:12 -080076
Milind Upadhyay225156b2022-02-25 22:42:12 -080077 CollisionAvoidance collision_avoidance_;
78
Henry Speiser55aa3ba2022-02-21 23:21:12 -080079 aos::Fetcher<frc971::control_loops::drivetrain::Status>
80 drivetrain_status_fetcher_;
Ravago Jones5da06352022-03-04 20:26:24 -080081 aos::Fetcher<CANPosition> can_position_fetcher_;
Ravago Jonesd51af7a2022-03-26 21:44:20 -070082 aos::Fetcher<aos::JoystickState> joystick_state_fetcher_;
83 aos::Fetcher<y2022::vision::BallColor> ball_color_fetcher_;
Ravago Jones5da06352022-03-04 20:26:24 -080084
85 int prev_shot_count_ = 0;
86
James Kuszmaul84083f42022-02-27 17:24:38 -080087 turret::Aimer aimer_;
88
Ravago Jones5da06352022-03-04 20:26:24 -080089 bool flippers_open_ = false;
90 bool reseating_in_catapult_ = false;
91 bool fire_ = false;
Ravago Jonesd51af7a2022-03-26 21:44:20 -070092 bool discarding_ball_ = false;
93 aos::Alliance alliance_ = aos::Alliance::kInvalid;
94 aos::Alliance ball_color_ = aos::Alliance::kInvalid;
Ravago Jones5da06352022-03-04 20:26:24 -080095
James Kuszmaul40526952022-03-13 15:56:38 -070096 aos::monotonic_clock::time_point front_intake_beambreak_timer_ =
97 aos::monotonic_clock::min_time;
98 aos::monotonic_clock::time_point back_intake_beambreak_timer_ =
Ravago Jones5da06352022-03-04 20:26:24 -080099 aos::monotonic_clock::min_time;
100 aos::monotonic_clock::time_point transferring_timer_ =
101 aos::monotonic_clock::min_time;
102 aos::monotonic_clock::time_point loading_timer_ =
103 aos::monotonic_clock::min_time;
104 aos::monotonic_clock::time_point flipper_opening_start_time_ =
105 aos::monotonic_clock::min_time;
106 SuperstructureState state_ = SuperstructureState::IDLE;
James Kuszmaul40526952022-03-13 15:56:38 -0700107 bool front_intake_has_ball_ = false;
108 bool back_intake_has_ball_ = false;
Milind Upadhyay1612bbb2022-04-16 17:10:32 -0700109 bool transitioning_second_ball_ = false;
Austin Schuh92908812022-03-27 14:14:05 -0700110 std::optional<double> last_shot_angle_ = std::nullopt;
James Kuszmaul40526952022-03-13 15:56:38 -0700111 RequestedIntake turret_intake_state_ = RequestedIntake::kFront;
Siddhant Kanwar0e37f592022-02-21 19:26:50 -0800112
milind-u086d7262022-01-19 20:44:18 -0800113 DISALLOW_COPY_AND_ASSIGN(Superstructure);
milind-u086d7262022-01-19 20:44:18 -0800114};
115
116} // namespace superstructure
117} // namespace control_loops
118} // namespace y2022
119
120#endif // Y2022_CONTROL_LOOPS_SUPERSTRUCTURE_SUPERSTRUCTURE_H_