blob: 8d806d788846963e77c4363edb9e824b723c8c9b [file] [log] [blame]
Brian Silverman17f503e2015-08-02 18:17:18 -07001#include "y2014/control_loops/claw/claw.q.h"
2#include "frc971/control_loops/control_loops.q.h"
3
4#include "aos/linux_code/init.h"
5#include "y2014/constants.h"
6
7namespace frc971 {
8
9typedef constants::Values::Claws Claws;
10
11class Sensor {
12 public:
13 Sensor(const double start_position,
14 const HallEffectStruct &initial_hall_effect)
15 : start_position_(start_position),
16 last_hall_effect_(initial_hall_effect),
17 last_posedge_count_(initial_hall_effect.posedge_count),
18 last_negedge_count_(initial_hall_effect.negedge_count) {
19 last_on_min_position_ = start_position;
20 last_on_max_position_ = start_position;
21 last_off_min_position_ = start_position;
22 last_off_max_position_ = start_position;
23 }
24
25 bool DoGetPositionOfEdge(
26 const control_loops::HalfClawPosition &claw_position,
27 const HallEffectStruct &hall_effect, Claws::AnglePair *limits) {
28 bool print = false;
29
30 if (hall_effect.posedge_count != last_posedge_count_) {
Brian Silvermand3efb182015-05-13 23:04:29 -040031 const double avg_off_position =
32 (last_off_min_position_ + last_off_max_position_) / 2.0;
33 if (hall_effect.posedge_value < avg_off_position) {
Brian Silverman17f503e2015-08-02 18:17:18 -070034 printf("Posedge upper current %f posedge %f avg_off %f [%f, %f]\n",
Brian Silvermand3efb182015-05-13 23:04:29 -040035 claw_position.position, hall_effect.posedge_value,
Brian Silverman17f503e2015-08-02 18:17:18 -070036 avg_off_position, last_off_min_position_,
37 last_off_max_position_);
Brian Silvermand3efb182015-05-13 23:04:29 -040038 limits->upper_decreasing_angle =
39 hall_effect.posedge_value - start_position_;
Brian Silverman17f503e2015-08-02 18:17:18 -070040 } else {
41 printf("Posedge lower current %f posedge %f avg_off %f [%f, %f]\n",
Brian Silvermand3efb182015-05-13 23:04:29 -040042 claw_position.position, hall_effect.posedge_value,
Brian Silverman17f503e2015-08-02 18:17:18 -070043 avg_off_position, last_off_min_position_,
44 last_off_max_position_);
45 limits->lower_angle =
Brian Silvermand3efb182015-05-13 23:04:29 -040046 hall_effect.posedge_value - start_position_;
Brian Silverman17f503e2015-08-02 18:17:18 -070047 }
48 print = true;
49 }
50 if (hall_effect.negedge_count != last_negedge_count_) {
Brian Silvermand3efb182015-05-13 23:04:29 -040051 const double avg_on_position =
52 (last_on_min_position_ + last_on_max_position_) / 2.0;
53 if (hall_effect.negedge_value > avg_on_position) {
Brian Silverman17f503e2015-08-02 18:17:18 -070054 printf("Negedge upper current %f negedge %f last_on %f [%f, %f]\n",
Brian Silvermand3efb182015-05-13 23:04:29 -040055 claw_position.position, hall_effect.negedge_value,
Brian Silverman17f503e2015-08-02 18:17:18 -070056 avg_on_position, last_on_min_position_,
57 last_on_max_position_);
58 limits->upper_angle =
Brian Silvermand3efb182015-05-13 23:04:29 -040059 hall_effect.negedge_value - start_position_;
Brian Silverman17f503e2015-08-02 18:17:18 -070060 } else {
61 printf("Negedge lower current %f negedge %f last_on %f [%f, %f]\n",
Brian Silvermand3efb182015-05-13 23:04:29 -040062 claw_position.position, hall_effect.negedge_value,
Brian Silverman17f503e2015-08-02 18:17:18 -070063 avg_on_position, last_on_min_position_,
64 last_on_max_position_);
Brian Silvermand3efb182015-05-13 23:04:29 -040065 limits->lower_decreasing_angle =
66 hall_effect.negedge_value - start_position_;
Brian Silverman17f503e2015-08-02 18:17:18 -070067 }
68 print = true;
69 }
70
71 if (hall_effect.current) {
72 if (!last_hall_effect_.current) {
73 last_on_min_position_ = last_on_max_position_ = claw_position.position;
74 } else {
75 last_on_min_position_ =
76 ::std::min(claw_position.position, last_on_min_position_);
77 last_on_max_position_ =
78 ::std::max(claw_position.position, last_on_max_position_);
79 }
80 } else {
81 if (last_hall_effect_.current) {
Brian Silvermand3efb182015-05-13 23:04:29 -040082 last_off_min_position_ = last_off_max_position_ =
83 claw_position.position;
Brian Silverman17f503e2015-08-02 18:17:18 -070084 } else {
85 last_off_min_position_ =
86 ::std::min(claw_position.position, last_off_min_position_);
87 last_off_max_position_ =
88 ::std::max(claw_position.position, last_off_max_position_);
89 }
90 }
91
92 last_hall_effect_ = hall_effect;
93 last_posedge_count_ = hall_effect.posedge_count;
94 last_negedge_count_ = hall_effect.negedge_count;
95
96 return print;
97 }
98
99 private:
100 const double start_position_;
101 HallEffectStruct last_hall_effect_;
102 int32_t last_posedge_count_;
103 int32_t last_negedge_count_;
104 double last_on_min_position_;
105 double last_off_min_position_;
106 double last_on_max_position_;
107 double last_off_max_position_;
108};
109
110class ClawSensors {
111 public:
112 ClawSensors(const double start_position,
113 const control_loops::HalfClawPosition &initial_claw_position)
114 : start_position_(start_position),
115 front_(start_position, initial_claw_position.front),
116 calibration_(start_position, initial_claw_position.calibration),
117 back_(start_position, initial_claw_position.back) {}
118
119 bool GetPositionOfEdge(const control_loops::HalfClawPosition &claw_position,
120 Claws::Claw *claw) {
121
122 bool print = false;
123 if (front_.DoGetPositionOfEdge(claw_position,
124 claw_position.front, &claw->front)) {
125 print = true;
126 } else if (calibration_.DoGetPositionOfEdge(claw_position,
127 claw_position.calibration,
128 &claw->calibration)) {
129 print = true;
130 } else if (back_.DoGetPositionOfEdge(claw_position,
131 claw_position.back, &claw->back)) {
132 print = true;
133 }
134
135 double position = claw_position.position - start_position_;
136
137 if (position > claw->upper_limit) {
138 claw->upper_hard_limit = claw->upper_limit = position;
139 print = true;
140 }
141 if (position < claw->lower_limit) {
142 claw->lower_hard_limit = claw->lower_limit = position;
143 print = true;
144 }
145 return print;
146 }
147
148 private:
149 const double start_position_;
150 Sensor front_;
151 Sensor calibration_;
152 Sensor back_;
153};
154
155int Main() {
156 control_loops::claw_queue_group.position.FetchNextBlocking();
157
158 const double top_start_position =
159 control_loops::claw_queue_group.position->top.position;
160 const double bottom_start_position =
161 control_loops::claw_queue_group.position->bottom.position;
162
163 ClawSensors top(top_start_position,
164 control_loops::claw_queue_group.position->top);
165 ClawSensors bottom(bottom_start_position,
166 control_loops::claw_queue_group.position->bottom);
167
168 Claws limits;
169
170 limits.claw_zeroing_off_speed = 0.5;
171 limits.claw_zeroing_speed = 0.1;
172 limits.claw_zeroing_separation = 0.1;
173
174 // claw separation that would be considered a collision
175 limits.claw_min_separation = 0.0;
176 limits.claw_max_separation = 0.0;
177
178 // We should never get closer/farther than these.
179 limits.soft_min_separation = 0.0;
180 limits.soft_max_separation = 0.0;
181
182 limits.upper_claw.lower_hard_limit = 0.0;
183 limits.upper_claw.upper_hard_limit = 0.0;
184 limits.upper_claw.lower_limit = 0.0;
185 limits.upper_claw.upper_limit = 0.0;
186 limits.upper_claw.front.lower_angle = 0.0;
187 limits.upper_claw.front.upper_angle = 0.0;
188 limits.upper_claw.front.lower_decreasing_angle = 0.0;
189 limits.upper_claw.front.upper_decreasing_angle = 0.0;
190 limits.upper_claw.calibration.lower_angle = 0.0;
191 limits.upper_claw.calibration.upper_angle = 0.0;
192 limits.upper_claw.calibration.lower_decreasing_angle = 0.0;
193 limits.upper_claw.calibration.upper_decreasing_angle = 0.0;
194 limits.upper_claw.back.lower_angle = 0.0;
195 limits.upper_claw.back.upper_angle = 0.0;
196 limits.upper_claw.back.lower_decreasing_angle = 0.0;
197 limits.upper_claw.back.upper_decreasing_angle = 0.0;
198
199 limits.lower_claw.lower_hard_limit = 0.0;
200 limits.lower_claw.upper_hard_limit = 0.0;
201 limits.lower_claw.lower_limit = 0.0;
202 limits.lower_claw.upper_limit = 0.0;
203 limits.lower_claw.front.lower_angle = 0.0;
204 limits.lower_claw.front.upper_angle = 0.0;
205 limits.lower_claw.front.lower_decreasing_angle = 0.0;
206 limits.lower_claw.front.upper_decreasing_angle = 0.0;
207 limits.lower_claw.calibration.lower_angle = 0.0;
208 limits.lower_claw.calibration.upper_angle = 0.0;
209 limits.lower_claw.calibration.lower_decreasing_angle = 0.0;
210 limits.lower_claw.calibration.upper_decreasing_angle = 0.0;
211 limits.lower_claw.back.lower_angle = 0.0;
212 limits.lower_claw.back.upper_angle = 0.0;
213 limits.lower_claw.back.lower_decreasing_angle = 0.0;
214 limits.lower_claw.back.upper_decreasing_angle = 0.0;
215
216 limits.claw_unimportant_epsilon = 0.01;
217 limits.start_fine_tune_pos = -0.2;
218 limits.max_zeroing_voltage = 4.0;
219
220 control_loops::ClawGroup::Position last_position =
221 *control_loops::claw_queue_group.position;
222
223 while (true) {
224 control_loops::claw_queue_group.position.FetchNextBlocking();
225 bool print = false;
226 if (top.GetPositionOfEdge(control_loops::claw_queue_group.position->top,
227 &limits.upper_claw)) {
228 print = true;
229 printf("Got an edge on the upper claw\n");
230 }
231 if (bottom.GetPositionOfEdge(
232 control_loops::claw_queue_group.position->bottom,
233 &limits.lower_claw)) {
234 print = true;
235 printf("Got an edge on the lower claw\n");
236 }
237 const double top_position =
238 control_loops::claw_queue_group.position->top.position -
239 top_start_position;
240 const double bottom_position =
241 control_loops::claw_queue_group.position->bottom.position -
242 bottom_start_position;
243 const double separation = top_position - bottom_position;
244 if (separation > limits.claw_max_separation) {
245 limits.soft_max_separation = limits.claw_max_separation = separation;
246 print = true;
247 }
248 if (separation < limits.claw_min_separation) {
249 limits.soft_min_separation = limits.claw_min_separation = separation;
250 print = true;
251 }
252
253 if (print) {
254 printf("{%f,\n", limits.claw_zeroing_off_speed);
255 printf("%f,\n", limits.claw_zeroing_speed);
256 printf("%f,\n", limits.claw_zeroing_separation);
257 printf("%f,\n", limits.claw_min_separation);
258 printf("%f,\n", limits.claw_max_separation);
259 printf("%f,\n", limits.soft_min_separation);
260 printf("%f,\n", limits.soft_max_separation);
261 printf(
262 "{%f, %f, %f, %f, {%f, %f, %f, %f}, {%f, %f, %f, %f}, {%f, %f, %f, "
263 "%f}},\n",
264 limits.upper_claw.lower_hard_limit,
265 limits.upper_claw.upper_hard_limit, limits.upper_claw.lower_limit,
266 limits.upper_claw.upper_limit, limits.upper_claw.front.lower_angle,
267 limits.upper_claw.front.upper_angle,
268 limits.upper_claw.front.lower_decreasing_angle,
269 limits.upper_claw.front.upper_decreasing_angle,
270 limits.upper_claw.calibration.lower_angle,
271 limits.upper_claw.calibration.upper_angle,
272 limits.upper_claw.calibration.lower_decreasing_angle,
273 limits.upper_claw.calibration.upper_decreasing_angle,
274 limits.upper_claw.back.lower_angle,
275 limits.upper_claw.back.upper_angle,
276 limits.upper_claw.back.lower_decreasing_angle,
277 limits.upper_claw.back.upper_decreasing_angle);
278
279 printf(
280 "{%f, %f, %f, %f, {%f, %f, %f, %f}, {%f, %f, %f, %f}, {%f, %f, %f, "
281 "%f}},\n",
282 limits.lower_claw.lower_hard_limit,
283 limits.lower_claw.upper_hard_limit, limits.lower_claw.lower_limit,
284 limits.lower_claw.upper_limit, limits.lower_claw.front.lower_angle,
285 limits.lower_claw.front.upper_angle,
286 limits.lower_claw.front.lower_decreasing_angle,
287 limits.lower_claw.front.upper_decreasing_angle,
288 limits.lower_claw.calibration.lower_angle,
289 limits.lower_claw.calibration.upper_angle,
290 limits.lower_claw.calibration.lower_decreasing_angle,
291 limits.lower_claw.calibration.upper_decreasing_angle,
292 limits.lower_claw.back.lower_angle,
293 limits.lower_claw.back.upper_angle,
294 limits.lower_claw.back.lower_decreasing_angle,
295 limits.lower_claw.back.upper_decreasing_angle);
296 printf("%f, // claw_unimportant_epsilon\n",
297 limits.claw_unimportant_epsilon);
298 printf("%f, // start_fine_tune_pos\n", limits.start_fine_tune_pos);
299 printf("%f,\n", limits.max_zeroing_voltage);
300 printf("}\n");
301 }
302
303 last_position = *control_loops::claw_queue_group.position;
304 }
305 return 0;
306}
307
308} // namespace frc971
309
310int main() {
311 ::aos::Init();
312 int returnvalue = ::frc971::Main();
313 ::aos::Cleanup();
314 return returnvalue;
315}