blob: 11a5a4b6f0899a11b226cdc72fa264be063985fd [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001close all;
2load 'drivetrain_spin_low'
3load 'drivetrain_strait_low'
4m = 68;
5rb = 0.617998644 / 2.0;
6J = 7;
7stall_current = 133.0;
8R = 12.0 / stall_current / 4 / 0.43;
9Km = (12.0 - R * 2.7) / (4650.0 / 60.0 * 2.0 * pi);
10Kt = 0.008;
11r = 0.04445; % 3.5 inches diameter
12G_low = 60.0 / 15.0 * 50.0 / 15.0;
13G_high = 45.0 / 30.0 * 50.0 / 15.0;
14dt = 0.01;
15
16G = G_low;
17
18msp = (1.0 / m + rb ^ 2.0 / J);
19msn = (1.0 / m - rb ^ 2.0 / J);
20tc = -Km * Kt * G ^ 2.0 / (R * r ^ 2.0);
21mp = G * Kt / (R * r);
22
23A = [0 1 0 0; 0 msp*tc 0 msn*tc; 0 0 0 1; 0 msn*tc 0 msp*tc];
24B = [0 0; msp * mp msn * mp; 0 0; msn * mp msp * mp];
25C = [1 0 0 0; 0 0 1 0];
26D = [0 0; 0 0];
27
28dm = c2d(ss(A, B, C, D), dt);
29
30hp = .8;
31lp = .85;
32K = place(dm.a, dm.b, [hp, hp, lp, lp]);
33
34hlp = 0.07;
35llp = 0.09;
36L = place(dm.a', dm.c', [hlp, hlp, llp, llp])';
37
38% Plot what we computed
39
40fd = fopen('/home/aschuh/frc971/2012/trunk/src/atom_code/control_loops/Drivetrain.mat', 'w');
41n = 1;
42sm = [];
43writeMatHeader(fd, size(dm.a, 1), size(dm.b, 2));
44writeMat(fd, dm.a, 'A');
45writeMat(fd, dm.b, 'B');
46writeMat(fd, dm.c, 'C');
47writeMat(fd, dm.d, 'D');
48writeMat(fd, L, 'L');
49writeMat(fd, K, 'K');
50writeMat(fd, [12; 12], 'U_max');
51writeMat(fd, [-12; -12], 'U_min');
52writeMatFooter(fd);
53fclose(fd);
54
55full_model = dss([dm.a (-dm.b * K); eye(4) (dm.a - dm.b * K - L * dm.c)], [0, 0; 0, 0; 0, 0; 0, 0; L], [C, [0, 0, 0, 0; 0, 0, 0, 0]], 0, eye(8), 0.01);
56
57n = 1;
58sm_strait = [];
59t = drivetrain_strait_low(1, 1) + dt * (n - 1);
60x = [drivetrain_strait_low(1, 2); 0; drivetrain_strait_low(1, 3); 0];
61while t < drivetrain_strait_low(end, 1)
62 sm_strait(n, 1) = t;
63 sm_strait(n, 2) = (x(1,1) + x(3,1)) / 2.0;
64 t = t + dt;
65 x = dm.a * x + dm.b * [drivetrain_strait_low(n, 4); drivetrain_strait_low(n, 5)];
66 n = n + 1;
67end
68
69figure;
70plot(drivetrain_strait_low(:, 1), (drivetrain_strait_low(:, 2) + drivetrain_strait_low(:, 3)) / 2.0, sm_strait(:, 1), sm_strait(:, 2));
71legend('actual', 'sim');
72
73n = 1;
74sm_spin = [];
75t = drivetrain_spin_low(1, 1) + dt * (n - 1);
76x = [drivetrain_spin_low(1, 2); 0; drivetrain_spin_low(1, 3); 0];
77while t < drivetrain_spin_low(end, 1)
78 sm_spin(n, 1) = t;
79 sm_spin(n, 2) = (x(1,1) - x(3,1)) / 2.0;
80 t = t + dt;
81 x = dm.a * x + dm.b * [drivetrain_spin_low(n, 4); drivetrain_spin_low(n, 5)];
82 n = n + 1;
83end
84
85figure;
86plot(drivetrain_spin_low(:, 1), (drivetrain_spin_low(:, 2) - drivetrain_spin_low(:, 3)) / 2.0, sm_spin(:, 1), sm_spin(:, 2));
87legend('actual', 'sim');
88
89%figure;
90%nyquist(full_model);
91
92
93%%
94t = 0;
95x = [0; 0; 0; 0;];
96while t < logging(end, 1)
97 sm(n, 1) = t;
98 sm(n, 2) = x(1,1);
99 sm(n, 3) = x(3,1);
100 t = t + dt;
101 x = dm.a * x + dm.b * [12.0; 12.0];
102 n = n + 1;
103end
104
105figure;
106plot(logging(:, 1), logging(:, 2), sm(:, 1), sm(:, 2));
107legend('actual', 'sim');
108
109%% Simulation of a small turn angle with a large distance to travel
110tf = 2;
111x = [0; 0; 0.1; 0;];
112r = [10; 0; 10; 0];
113
114smt = zeros(tf / dt, 8);
115t = 0;
116xhat = x;
117n = 1;
118% 1 means scale
119% 2 means just limit to 12 volts
120% 3 means preserve the difference in power
121captype = 1;
122while n <= size(smt, 1)
123 smt(n, 1) = t;
124 smt(n, 2) = x(1,1);
125 smt(n, 3) = x(3,1);
126 t = t + dt;
127
128 u = K * (r - xhat);
129 smt(n, 4) = u(1,1);
130 smt(n, 5) = u(2,1);
131
132 if captype == 1
133 if sum(abs(u) > 12.0)
134 % We have a problem!
135 % Check to see if it's a big steering power problem,
136 % or a big drive error.
137 turnPower = (u(1, 1) - u(2, 1));
138 drivePower = (u(1, 1) + u(2, 1));
139 scaleFactor = 12.0 / max(abs(u));
140 smt(n, 8) = 1.0 / scaleFactor;
141 % Only start scaling the turn power up if we are far out of
142 % range.
143 if abs(turnPower) < 0.5 * abs(drivePower)
144 % Turn power is swamped.
145 deltaTurn = turnPower / 2.0 / scaleFactor * 0.5;
146 u(1, 1) = u(1, 1) + deltaTurn;
147 u(2, 1) = u(2, 1) - deltaTurn;
148 scaleFactor = 12.0 / max(abs(u));
149 else
150 if 0.5 * abs(turnPower) > abs(drivePower)
151 % Drive power is swamped.
152 deltaDrive = drivePower / 2.0 / scaleFactor * 0.5;
153 u(1, 1) = u(1, 1) + deltaDrive;
154 u(2, 1) = u(2, 1) + deltaDrive;
155 scaleFactor = 12.0 / max(abs(u));
156 end
157 end
158 u = u * scaleFactor;
159 end
160 else
161 if captype == 2
162 if u(1, 1) > 12.0
163 u(1, 1) = 12.0;
164 end
165 if u(1, 1) < -12.0
166 u(1, 1) = -12.0;
167 end
168 if u(2, 1) > 12.0
169 u(2, 1) = 12.0;
170 end
171 if u(2, 1) < -12.0
172 u(2, 1) = -12.0;
173 end
174 else
175 if captype == 3
176 if u(1, 1) > 12.0
177 u(2, 1) = u(2, 1) - (u(1, 1) - 12.0);
178 else
179 if u(1, 1) < -12.0
180 u(2, 1) = u(2, 1) - (u(1, 1) + 12.0);
181 end
182 end
183 if u(2, 1) > 12.0
184 u(1, 1) = u(1, 1) - (u(2, 1) - 12.0);
185 else
186 if u(2, 1) < -12.0
187 u(1, 1) = u(1, 1) - (u(2, 1) + 12.0);
188 end
189 end
190 if u(1, 1) > 12.0
191 u(1, 1) = 12.0;
192 end
193 if u(1, 1) < -12.0
194 u(1, 1) = -12.0;
195 end
196 if u(2, 1) > 12.0
197 u(2, 1) = 12.0;
198 end
199 if u(2, 1) < -12.0
200 u(2, 1) = -12.0;
201 end
202 end
203 end
204
205 end
206 smt(n, 6) = u(1,1);
207 smt(n, 7) = u(2,1);
208 xhat = dm.a * xhat + dm.b * u + L * (dm.c * x - dm.c * xhat);
209 x = dm.a * x + dm.b * u;
210
211 n = n + 1;
212end
213
214figure;
215subplot(6, 1, 1);
216plot(smt(:, 1), smt(:, 2) + smt(:, 3));
217legend('dist');
218subplot(6, 1, 2);
219plot(smt(:, 1), smt(:, 2) - smt(:, 3));
220legend('angle');
221subplot(3, 1, 2);
222plot(smt(:, 1), smt(:, 4), smt(:, 1), smt(:, 5));
223legend('lu', 'ru');
224subplot(3, 1, 3);
225plot(smt(:, 1), smt(:, 6), smt(:, 1), smt(:, 7));
226legend('lu_{real}', 'ru_{real}');
227
228%figure;
229%plot(smt(:, 1), smt(:, 8))
230%legend('Scale Factor');
231