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