milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 1 | #include "y2022/control_loops/superstructure/superstructure.h" |
| 2 | |
| 3 | #include "aos/events/event_loop.h" |
| 4 | |
| 5 | namespace y2022 { |
| 6 | namespace control_loops { |
| 7 | namespace superstructure { |
| 8 | |
| 9 | using frc971::control_loops::AbsoluteEncoderProfiledJointStatus; |
| 10 | using frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus; |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 11 | using frc971::control_loops::RelativeEncoderProfiledJointStatus; |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 12 | |
| 13 | Superstructure::Superstructure(::aos::EventLoop *event_loop, |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 14 | std::shared_ptr<const constants::Values> values, |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 15 | const ::std::string &name) |
| 16 | : frc971::controls::ControlLoop<Goal, Position, Status, Output>(event_loop, |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 17 | name), |
Austin Schuh | 39f26f6 | 2022-02-24 21:34:46 -0800 | [diff] [blame] | 18 | values_(values), |
| 19 | climber_(values_->climber.subsystem_params), |
| 20 | intake_front_(values_->intake_front.subsystem_params), |
| 21 | intake_back_(values_->intake_back.subsystem_params), |
| 22 | turret_(values_->turret.subsystem_params), |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 23 | drivetrain_status_fetcher_( |
| 24 | event_loop->MakeFetcher<frc971::control_loops::drivetrain::Status>( |
Austin Schuh | 39f26f6 | 2022-02-24 21:34:46 -0800 | [diff] [blame] | 25 | "/drivetrain")), |
| 26 | catapult_(*values_) { |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 27 | event_loop->SetRuntimeRealtimePriority(30); |
| 28 | } |
| 29 | |
| 30 | void Superstructure::RunIteration(const Goal *unsafe_goal, |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 31 | const Position *position, |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 32 | aos::Sender<Output>::Builder *output, |
| 33 | aos::Sender<Status>::Builder *status) { |
Austin Schuh | 39f26f6 | 2022-02-24 21:34:46 -0800 | [diff] [blame] | 34 | OutputT output_struct; |
| 35 | |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 36 | if (WasReset()) { |
| 37 | AOS_LOG(ERROR, "WPILib reset, restarting\n"); |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 38 | intake_front_.Reset(); |
| 39 | intake_back_.Reset(); |
| 40 | turret_.Reset(); |
| 41 | climber_.Reset(); |
Austin Schuh | 39f26f6 | 2022-02-24 21:34:46 -0800 | [diff] [blame] | 42 | catapult_.Reset(); |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 43 | } |
| 44 | |
| 45 | drivetrain_status_fetcher_.Fetch(); |
| 46 | const float velocity = robot_velocity(); |
| 47 | |
| 48 | double roller_speed_compensated_front = 0; |
| 49 | double roller_speed_compensated_back = 0; |
| 50 | double transfer_roller_speed = 0; |
| 51 | |
| 52 | if (unsafe_goal != nullptr) { |
| 53 | roller_speed_compensated_front = |
| 54 | unsafe_goal->roller_speed_front() + |
| 55 | std::max(velocity * unsafe_goal->roller_speed_compensation(), 0.0); |
| 56 | |
| 57 | roller_speed_compensated_back = |
| 58 | unsafe_goal->roller_speed_back() - |
| 59 | std::min(velocity * unsafe_goal->roller_speed_compensation(), 0.0); |
| 60 | |
| 61 | transfer_roller_speed = unsafe_goal->transfer_roller_speed(); |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 62 | } |
| 63 | |
Austin Schuh | 39f26f6 | 2022-02-24 21:34:46 -0800 | [diff] [blame] | 64 | |
| 65 | const flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus> |
| 66 | catapult_status_offset = catapult_.Iterate( |
| 67 | unsafe_goal, position, |
| 68 | output != nullptr ? &(output_struct.catapult_voltage) : nullptr, |
| 69 | status->fbb()); |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 70 | |
| 71 | flatbuffers::Offset<RelativeEncoderProfiledJointStatus> |
| 72 | climber_status_offset = climber_.Iterate( |
| 73 | unsafe_goal != nullptr ? unsafe_goal->climber() : nullptr, |
| 74 | position->climber(), |
| 75 | output != nullptr ? &(output_struct.climber_voltage) : nullptr, |
| 76 | status->fbb()); |
| 77 | |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 78 | flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus> |
| 79 | intake_status_offset_front = intake_front_.Iterate( |
| 80 | unsafe_goal != nullptr ? unsafe_goal->intake_front() : nullptr, |
| 81 | position->intake_front(), |
| 82 | output != nullptr ? &(output_struct.intake_voltage_front) : nullptr, |
| 83 | status->fbb()); |
| 84 | |
| 85 | flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus> |
| 86 | intake_status_offset_back = intake_back_.Iterate( |
| 87 | unsafe_goal != nullptr ? unsafe_goal->intake_back() : nullptr, |
| 88 | position->intake_back(), |
| 89 | output != nullptr ? &(output_struct.intake_voltage_back) : nullptr, |
| 90 | status->fbb()); |
| 91 | |
| 92 | flatbuffers::Offset<PotAndAbsoluteEncoderProfiledJointStatus> |
| 93 | turret_status_offset = turret_.Iterate( |
| 94 | unsafe_goal != nullptr ? unsafe_goal->turret() : nullptr, |
| 95 | position->turret(), |
| 96 | output != nullptr ? &(output_struct.turret_voltage) : nullptr, |
| 97 | status->fbb()); |
| 98 | |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 99 | if (output != nullptr) { |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 100 | output_struct.roller_voltage_front = roller_speed_compensated_front; |
| 101 | output_struct.roller_voltage_back = roller_speed_compensated_back; |
| 102 | output_struct.transfer_roller_voltage = transfer_roller_speed; |
| 103 | |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 104 | output->CheckOk(output->Send(Output::Pack(*output->fbb(), &output_struct))); |
| 105 | } |
| 106 | |
| 107 | Status::Builder status_builder = status->MakeBuilder<Status>(); |
| 108 | |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 109 | const bool zeroed = intake_front_.zeroed() && intake_back_.zeroed() && |
Austin Schuh | 39f26f6 | 2022-02-24 21:34:46 -0800 | [diff] [blame] | 110 | turret_.zeroed() && climber_.zeroed() && catapult_.zeroed(); |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 111 | const bool estopped = intake_front_.estopped() || intake_back_.estopped() || |
Austin Schuh | 39f26f6 | 2022-02-24 21:34:46 -0800 | [diff] [blame] | 112 | turret_.estopped() || climber_.estopped() || catapult_.estopped(); |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 113 | |
| 114 | status_builder.add_zeroed(zeroed); |
| 115 | status_builder.add_estopped(estopped); |
| 116 | |
| 117 | status_builder.add_intake_front(intake_status_offset_front); |
| 118 | status_builder.add_intake_back(intake_status_offset_back); |
| 119 | status_builder.add_turret(turret_status_offset); |
Siddhant Kanwar | 0e37f59 | 2022-02-21 19:26:50 -0800 | [diff] [blame] | 120 | status_builder.add_climber(climber_status_offset); |
Austin Schuh | 39f26f6 | 2022-02-24 21:34:46 -0800 | [diff] [blame] | 121 | status_builder.add_catapult(catapult_status_offset); |
| 122 | status_builder.add_solve_time(catapult_.solve_time()); |
| 123 | status_builder.add_mpc_active(catapult_.mpc_active()); |
Austin Schuh | 80fc275 | 2022-02-25 13:33:56 -0800 | [diff] [blame^] | 124 | status_builder.add_shot_count(catapult_.shot_count()); |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 125 | |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 126 | (void)status->Send(status_builder.Finish()); |
| 127 | } |
| 128 | |
Henry Speiser | 55aa3ba | 2022-02-21 23:21:12 -0800 | [diff] [blame] | 129 | double Superstructure::robot_velocity() const { |
| 130 | return (drivetrain_status_fetcher_.get() != nullptr |
| 131 | ? drivetrain_status_fetcher_->robot_speed() |
| 132 | : 0.0); |
| 133 | } |
| 134 | |
milind-u | 086d726 | 2022-01-19 20:44:18 -0800 | [diff] [blame] | 135 | } // namespace superstructure |
| 136 | } // namespace control_loops |
| 137 | } // namespace y2022 |