blob: bf94b085a168b649090214f99d5ea5a651b1a9a8 [file] [log] [blame]
milind-u086d7262022-01-19 20:44:18 -08001#include "y2022/control_loops/superstructure/superstructure.h"
2
3#include "aos/events/event_loop.h"
Milind Upadhyay225156b2022-02-25 22:42:12 -08004#include "y2022/control_loops/superstructure/collision_avoidance.h"
milind-u086d7262022-01-19 20:44:18 -08005
6namespace y2022 {
7namespace control_loops {
8namespace superstructure {
9
10using frc971::control_loops::AbsoluteEncoderProfiledJointStatus;
11using frc971::control_loops::PotAndAbsoluteEncoderProfiledJointStatus;
Henry Speiser55aa3ba2022-02-21 23:21:12 -080012using frc971::control_loops::RelativeEncoderProfiledJointStatus;
milind-u086d7262022-01-19 20:44:18 -080013
14Superstructure::Superstructure(::aos::EventLoop *event_loop,
Henry Speiser55aa3ba2022-02-21 23:21:12 -080015 std::shared_ptr<const constants::Values> values,
milind-u086d7262022-01-19 20:44:18 -080016 const ::std::string &name)
17 : frc971::controls::ControlLoop<Goal, Position, Status, Output>(event_loop,
Siddhant Kanwar0e37f592022-02-21 19:26:50 -080018 name),
Austin Schuh39f26f62022-02-24 21:34:46 -080019 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 Speiser55aa3ba2022-02-21 23:21:12 -080024 drivetrain_status_fetcher_(
25 event_loop->MakeFetcher<frc971::control_loops::drivetrain::Status>(
Austin Schuh39f26f62022-02-24 21:34:46 -080026 "/drivetrain")),
27 catapult_(*values_) {
milind-u086d7262022-01-19 20:44:18 -080028 event_loop->SetRuntimeRealtimePriority(30);
29}
30
31void Superstructure::RunIteration(const Goal *unsafe_goal,
Siddhant Kanwar0e37f592022-02-21 19:26:50 -080032 const Position *position,
milind-u086d7262022-01-19 20:44:18 -080033 aos::Sender<Output>::Builder *output,
34 aos::Sender<Status>::Builder *status) {
Austin Schuh39f26f62022-02-24 21:34:46 -080035 OutputT output_struct;
36
milind-u086d7262022-01-19 20:44:18 -080037 if (WasReset()) {
38 AOS_LOG(ERROR, "WPILib reset, restarting\n");
Henry Speiser55aa3ba2022-02-21 23:21:12 -080039 intake_front_.Reset();
40 intake_back_.Reset();
41 turret_.Reset();
42 climber_.Reset();
Austin Schuh39f26f62022-02-24 21:34:46 -080043 catapult_.Reset();
Henry Speiser55aa3ba2022-02-21 23:21:12 -080044 }
45
Milind Upadhyay225156b2022-02-25 22:42:12 -080046 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 Speiser55aa3ba2022-02-21 23:21:12 -080059 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-u086d7262022-01-19 20:44:18 -080076 }
77
Austin Schuh39f26f62022-02-24 21:34:46 -080078
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 Kanwar0e37f592022-02-21 19:26:50 -080084
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 Speiser55aa3ba2022-02-21 23:21:12 -080092 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 Kanwar0e37f592022-02-21 19:26:50 -0800113 if (output != nullptr) {
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800114 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-u086d7262022-01-19 20:44:18 -0800118 output->CheckOk(output->Send(Output::Pack(*output->fbb(), &output_struct)));
119 }
120
121 Status::Builder status_builder = status->MakeBuilder<Status>();
122
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800123 const bool zeroed = intake_front_.zeroed() && intake_back_.zeroed() &&
Austin Schuh39f26f62022-02-24 21:34:46 -0800124 turret_.zeroed() && climber_.zeroed() && catapult_.zeroed();
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800125 const bool estopped = intake_front_.estopped() || intake_back_.estopped() ||
Austin Schuh39f26f62022-02-24 21:34:46 -0800126 turret_.estopped() || climber_.estopped() || catapult_.estopped();
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800127
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 Kanwar0e37f592022-02-21 19:26:50 -0800134 status_builder.add_climber(climber_status_offset);
Austin Schuh39f26f62022-02-24 21:34:46 -0800135 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 Schuh80fc2752022-02-25 13:33:56 -0800138 status_builder.add_shot_count(catapult_.shot_count());
milind-u086d7262022-01-19 20:44:18 -0800139
milind-u086d7262022-01-19 20:44:18 -0800140 (void)status->Send(status_builder.Finish());
141}
142
Henry Speiser55aa3ba2022-02-21 23:21:12 -0800143double Superstructure::robot_velocity() const {
144 return (drivetrain_status_fetcher_.get() != nullptr
145 ? drivetrain_status_fetcher_->robot_speed()
146 : 0.0);
147}
148
milind-u086d7262022-01-19 20:44:18 -0800149} // namespace superstructure
150} // namespace control_loops
151} // namespace y2022