3596 |
kaklik |
1 |
{ |
|
|
2 |
"metadata": { |
|
|
3 |
"name": "" |
|
|
4 |
}, |
|
|
5 |
"nbformat": 3, |
|
|
6 |
"nbformat_minor": 0, |
|
|
7 |
"worksheets": [ |
|
|
8 |
{ |
|
|
9 |
"cells": [ |
|
|
10 |
{ |
|
|
11 |
"cell_type": "markdown", |
|
|
12 |
"metadata": {}, |
|
|
13 |
"source": [ |
|
|
14 |
"Uk\u00e1zka pou\u017eit\u00ed n\u00e1stroje IPython na manipulaci se senzorov\u00fdmi daty\n", |
|
|
15 |
"=======\n", |
|
|
16 |
"\n", |
3662 |
kaklik |
17 |
"P\u0159\u00edklad vyu\u017e\u00edv\u00e1 modulovou stavebnici MLAB a jej\u00ed knihovnu [pymlab](https://github.com/MLAB-project/MLAB-I2c-modules). Sn\u00edma\u010d je k po\u010d\u00edta\u010di p\u0159ipojen\u00fd p\u0159es rozhradn\u00ed USB a data jsou vy\u010d\u00edt\u00e1na p\u0159es [I\u00b2C](http://wiki.mlab.cz/doku.php?id=cs:i2c)\n", |
3596 |
kaklik |
18 |
"\n", |
3662 |
kaklik |
19 |
"Pou\u017eit\u00fd sn\u00edma\u010d [HMC5883L](http://www.magneticsensors.com/three-axis-digital-compass.php) m\u00e1 n\u00e1sleduj\u00edc\u00ed katalogov\u00e9 parametry: \n", |
|
|
20 |
"\n", |
|
|
21 |
"* M\u011b\u0159\u00edc\u00ed rozsah +/- 800 uT\n", |
|
|
22 |
"* Rozli\u0161en\u00ed typicky 5 uT\n", |
|
|
23 |
"* \u010cetnost m\u011b\u0159en\u00ed 75 Hz\n", |
|
|
24 |
"\n", |
3596 |
kaklik |
25 |
"Zprovozn\u011bn\u00ed demo k\u00f3du\n", |
|
|
26 |
"---------------------\n", |
|
|
27 |
"\n", |
|
|
28 |
"Nejd\u0159\u00edve zjist\u00edme zda m\u00e1me p\u0159\u00edstup pro z\u00e1pis a \u010dten\u00ed do syst\u00e9mov\u00e9ho za\u0159\u00edzen\u00ed. A jak\u00e9 \u010d\u00edslo m\u00e1 I\u00b2C sb\u011brnice na kterou m\u00e1me p\u0159ipojen\u00e1 \u010didla. \n" |
|
|
29 |
] |
|
|
30 |
}, |
|
|
31 |
{ |
|
|
32 |
"cell_type": "code", |
|
|
33 |
"collapsed": false, |
|
|
34 |
"input": [ |
|
|
35 |
"!i2cdetect -l" |
|
|
36 |
], |
|
|
37 |
"language": "python", |
|
|
38 |
"metadata": {}, |
|
|
39 |
"outputs": [ |
|
|
40 |
{ |
|
|
41 |
"output_type": "stream", |
|
|
42 |
"stream": "stdout", |
|
|
43 |
"text": [ |
3662 |
kaklik |
44 |
"i2c-0\ti2c \ti915 gmbus ssc \tI2C adapter\r\n", |
|
|
45 |
"i2c-1\ti2c \ti915 gmbus vga \tI2C adapter\r\n", |
|
|
46 |
"i2c-2\ti2c \ti915 gmbus panel \tI2C adapter\r\n", |
|
|
47 |
"i2c-3\ti2c \ti915 gmbus dpc \tI2C adapter\r\n", |
|
|
48 |
"i2c-4\ti2c \ti915 gmbus dpb \tI2C adapter\r\n", |
|
|
49 |
"i2c-5\ti2c \ti915 gmbus dpd \tI2C adapter\r\n", |
|
|
50 |
"i2c-6\ti2c \tDPDDC-B \tI2C adapter\r\n", |
|
|
51 |
"i2c-7\ti2c \ti2c-tiny-usb at bus 001 device 006\tI2C adapter\r\n" |
3596 |
kaklik |
52 |
] |
|
|
53 |
} |
|
|
54 |
], |
|
|
55 |
"prompt_number": 1 |
|
|
56 |
}, |
|
|
57 |
{ |
|
|
58 |
"cell_type": "markdown", |
|
|
59 |
"metadata": {}, |
|
|
60 |
"source": [ |
|
|
61 |
"Proto\u017ee pro p\u0159ipojen\u00ed \u010didel k po\u010d\u00edta\u010di pou\u017e\u00edv\u00e1me adapt\u00e9r i2c-tiny-usb. Vid\u00edme, \u017ee sb\u011brnice m\u00e1 aktu\u00e1ln\u011b ozna\u010den\u00ed nap\u0159\u00edklad i2c-8. \n", |
|
|
62 |
"\n", |
|
|
63 |
"V p\u0159\u00edpad\u011b, \u017ee v\u00fd\u0161e uveden\u00fd p\u0159\u00edklad vr\u00e1t\u00ed chybu, nebo pojmenov\u00e1n\u00ed \"unknown\" tak nem\u00e1me p\u0159\u00edstup k syst\u00e9mov\u00fdm rozhran\u00edm. Ten z\u00edsk\u00e1me vytvo\u0159en\u00edm souboru s n\u00e1sleduj\u00edc\u00edm obsahem ve slo\u017ece: /etc/udev/rules.d/i2c-devices.rules" |
|
|
64 |
] |
|
|
65 |
}, |
|
|
66 |
{ |
|
|
67 |
"cell_type": "raw", |
|
|
68 |
"metadata": {}, |
|
|
69 |
"source": [ |
|
|
70 |
"KERNEL==\"i2c-[0-9]*\", GROUP=\"i2c\"" |
|
|
71 |
] |
|
|
72 |
}, |
|
|
73 |
{ |
|
|
74 |
"cell_type": "markdown", |
|
|
75 |
"metadata": {}, |
|
|
76 |
"source": [ |
|
|
77 |
"Toto ozna\u010den\u00ed budeme je\u0161t\u011b d\u00e1le pot\u0159ebovat, proto si jej ulo\u017e\u00edme da prom\u011bnn\u00e9. " |
|
|
78 |
] |
|
|
79 |
}, |
|
|
80 |
{ |
|
|
81 |
"cell_type": "code", |
|
|
82 |
"collapsed": false, |
|
|
83 |
"input": [ |
3662 |
kaklik |
84 |
"port = 7" |
3596 |
kaklik |
85 |
], |
|
|
86 |
"language": "python", |
|
|
87 |
"metadata": {}, |
|
|
88 |
"outputs": [], |
3662 |
kaklik |
89 |
"prompt_number": 2 |
3596 |
kaklik |
90 |
}, |
|
|
91 |
{ |
|
|
92 |
"cell_type": "markdown", |
|
|
93 |
"metadata": {}, |
|
|
94 |
"source": [ |
|
|
95 |
"Budeme pokra\u010dovat na\u010dten\u00edm pot\u0159ebn\u00fdch modul\u016f pro zach\u00e1zen\u00ed s I\u00b2C sn\u00edma\u010di." |
|
|
96 |
] |
|
|
97 |
}, |
|
|
98 |
{ |
|
|
99 |
"cell_type": "code", |
|
|
100 |
"collapsed": false, |
|
|
101 |
"input": [ |
|
|
102 |
"import time\n", |
|
|
103 |
"import datetime\n", |
|
|
104 |
"import sys\n", |
|
|
105 |
"\n", |
|
|
106 |
"from pymlab import config\n", |
|
|
107 |
"import matplotlib.pyplot as plt\n", |
|
|
108 |
"import numpy as np" |
|
|
109 |
], |
|
|
110 |
"language": "python", |
|
|
111 |
"metadata": {}, |
|
|
112 |
"outputs": [], |
|
|
113 |
"prompt_number": 3 |
|
|
114 |
}, |
|
|
115 |
{ |
|
|
116 |
"cell_type": "markdown", |
|
|
117 |
"metadata": {}, |
|
|
118 |
"source": [ |
|
|
119 |
"Nyn\u00ed si nadefinujeme strukturu p\u0159ipojen\u00ed jednotliv\u00fdch \u010didel na I\u00b2C sb\u011brnici." |
|
|
120 |
] |
|
|
121 |
}, |
|
|
122 |
{ |
|
|
123 |
"cell_type": "code", |
|
|
124 |
"collapsed": false, |
|
|
125 |
"input": [ |
|
|
126 |
"cfg = config.Config(\n", |
3642 |
kaklik |
127 |
" i2c = {\n", |
|
|
128 |
" \"port\": port,\n", |
|
|
129 |
" },\n", |
3596 |
kaklik |
130 |
" bus = [\n", |
|
|
131 |
" {\n", |
|
|
132 |
" \"type\": \"i2chub\",\n", |
|
|
133 |
" \"address\": 0x72,\n", |
|
|
134 |
" \n", |
|
|
135 |
" \"children\": [\n", |
3662 |
kaklik |
136 |
" {\"name\": \"mag\", \"type\": \"mag01\", \"gauss\": 0.88, \"channel\": 1, }, \n", |
3596 |
kaklik |
137 |
" ],\n", |
|
|
138 |
" },\n", |
|
|
139 |
" ],\n", |
|
|
140 |
")" |
|
|
141 |
], |
|
|
142 |
"language": "python", |
|
|
143 |
"metadata": {}, |
|
|
144 |
"outputs": [], |
3662 |
kaklik |
145 |
"prompt_number": 4 |
3596 |
kaklik |
146 |
}, |
|
|
147 |
{ |
|
|
148 |
"cell_type": "markdown", |
|
|
149 |
"metadata": {}, |
|
|
150 |
"source": [ |
|
|
151 |
"Tuto strukturu inicializujeme, aby jsme dos\u00e1hli definovan\u00e9 konfigurace \u010didel." |
|
|
152 |
] |
|
|
153 |
}, |
|
|
154 |
{ |
|
|
155 |
"cell_type": "code", |
|
|
156 |
"collapsed": false, |
|
|
157 |
"input": [ |
|
|
158 |
"cfg.initialize()\n", |
|
|
159 |
"mag_sensor = cfg.get_device(\"mag\")\n", |
|
|
160 |
"time.sleep(0.5)" |
|
|
161 |
], |
|
|
162 |
"language": "python", |
|
|
163 |
"metadata": {}, |
3662 |
kaklik |
164 |
"outputs": [ |
|
|
165 |
{ |
|
|
166 |
"output_type": "stream", |
|
|
167 |
"stream": "stderr", |
|
|
168 |
"text": [ |
|
|
169 |
"WARNING:pymlab.sensors.iic:HID device does not exist, we will try SMBus directly...\n" |
|
|
170 |
] |
|
|
171 |
} |
|
|
172 |
], |
|
|
173 |
"prompt_number": 5 |
3596 |
kaklik |
174 |
}, |
|
|
175 |
{ |
|
|
176 |
"cell_type": "markdown", |
|
|
177 |
"metadata": {}, |
|
|
178 |
"source": [ |
3662 |
kaklik |
179 |
"Nyn\u00ed u\u017e m\u016f\u017eeme p\u0159\u00edmo komunikovat se za\u0159\u00edzen\u00edm pojmenovan\u00fdm jako mag_sensor. A vy\u010d\u00edst z n\u011bj sadu dat." |
3596 |
kaklik |
180 |
] |
|
|
181 |
}, |
|
|
182 |
{ |
|
|
183 |
"cell_type": "code", |
|
|
184 |
"collapsed": false, |
|
|
185 |
"input": [ |
3662 |
kaklik |
186 |
"import sys\n", |
|
|
187 |
"import time\n", |
|
|
188 |
"from IPython.display import clear_output\n", |
3596 |
kaklik |
189 |
"\n", |
3662 |
kaklik |
190 |
"MEASUREMENTS = 500\n", |
|
|
191 |
"#x = np.zeros(MEASUREMENTS)\n", |
|
|
192 |
"#y = np.zeros(MEASUREMENTS)\n", |
|
|
193 |
"#z = np.zeros(MEASUREMENTS)\n", |
|
|
194 |
"list_meas = []\n", |
3596 |
kaklik |
195 |
"\n", |
|
|
196 |
"for n in range(MEASUREMENTS):\n", |
3662 |
kaklik |
197 |
"# mag_sensor.route() #V p\u0159\u00edpad\u011b v\u00edce \u010didel je pot\u0159eba ke ka\u017ed\u00e9mu p\u0159ed jeho pou\u017eit\u00edm nechat vyroutovat cesutu na sb\u011brnici.\n", |
|
|
198 |
" clear_output()\n", |
|
|
199 |
" (x, y, z) = mag_sensor.axes()\n", |
|
|
200 |
" list_meas.append([x, y, z])\n", |
|
|
201 |
" print (n, list_meas[n])\n", |
|
|
202 |
" sys.stdout.flush()" |
3596 |
kaklik |
203 |
], |
|
|
204 |
"language": "python", |
|
|
205 |
"metadata": {}, |
3642 |
kaklik |
206 |
"outputs": [ |
|
|
207 |
{ |
|
|
208 |
"output_type": "stream", |
|
|
209 |
"stream": "stdout", |
|
|
210 |
"text": [ |
3662 |
kaklik |
211 |
"(499, [-111.69, -413.90999999999997, -388.36])\n" |
3642 |
kaklik |
212 |
] |
3662 |
kaklik |
213 |
} |
|
|
214 |
], |
|
|
215 |
"prompt_number": 6 |
|
|
216 |
}, |
|
|
217 |
{ |
|
|
218 |
"cell_type": "markdown", |
|
|
219 |
"metadata": {}, |
|
|
220 |
"source": [ |
|
|
221 |
"V\u00fdstupn\u00ed jsou v jednotk\u00e1ch miliGauss a m\u011b\u0159\u00edc\u00ed rozsah je nastaven\u00fd na 0.88 Gauss. Viz konfigurace \u010didel naho\u0159e.\n", |
|
|
222 |
"Nam\u011b\u0159en\u00e9 hodnoty n\u00e1sledn\u011b ulo\u017e\u00edme do souboru. " |
|
|
223 |
] |
|
|
224 |
}, |
|
|
225 |
{ |
|
|
226 |
"cell_type": "code", |
|
|
227 |
"collapsed": false, |
|
|
228 |
"input": [ |
|
|
229 |
"np.savez(\"calibration_data_3Dset\", data=list_meas)" |
|
|
230 |
], |
|
|
231 |
"language": "python", |
|
|
232 |
"metadata": {}, |
|
|
233 |
"outputs": [], |
|
|
234 |
"prompt_number": 141 |
|
|
235 |
}, |
|
|
236 |
{ |
|
|
237 |
"cell_type": "markdown", |
|
|
238 |
"metadata": {}, |
|
|
239 |
"source": [ |
|
|
240 |
"Zpracov\u00e1n\u00ed dat\n", |
|
|
241 |
"-----------\n", |
|
|
242 |
"\n", |
|
|
243 |
"V dal\u0161\u00ed \u010d\u00e1sti budeme pracovat s daty v ulo\u017een\u00e9m souboru, kter\u00fd na\u010dteme do pol\u00ed x, y, z. " |
|
|
244 |
] |
|
|
245 |
}, |
|
|
246 |
{ |
|
|
247 |
"cell_type": "code", |
|
|
248 |
"collapsed": false, |
|
|
249 |
"input": [ |
|
|
250 |
"data = np.load('./calibration_data_3Dset.npz')\n", |
|
|
251 |
"list_meas = data['data']" |
|
|
252 |
], |
|
|
253 |
"language": "python", |
|
|
254 |
"metadata": {}, |
|
|
255 |
"outputs": [], |
|
|
256 |
"prompt_number": 142 |
|
|
257 |
}, |
|
|
258 |
{ |
|
|
259 |
"cell_type": "markdown", |
|
|
260 |
"metadata": {}, |
|
|
261 |
"source": [ |
|
|
262 |
"Nam\u011b\u0159en\u00e9 hodnoty vykresl\u00edme do 3D grafu." |
|
|
263 |
] |
|
|
264 |
}, |
|
|
265 |
{ |
|
|
266 |
"cell_type": "code", |
|
|
267 |
"collapsed": false, |
|
|
268 |
"input": [ |
|
|
269 |
"from mpl_toolkits.mplot3d.axes3d import Axes3D\n", |
|
|
270 |
"#%pylab qt\n", |
|
|
271 |
"%pylab inline\n", |
|
|
272 |
"fig = plt.figure()\n", |
|
|
273 |
"ax = Axes3D(fig)\n", |
|
|
274 |
"#plt.subplot(121)\n", |
|
|
275 |
"p = ax.scatter((list_meas)[1],(list_meas)[5],(list_meas)[3])\n", |
|
|
276 |
"#p = ax.plot3D(list_meas)\n", |
|
|
277 |
"#plt.subplot(122)\n", |
|
|
278 |
"#p = ax.scatter(x, y, z)\n" |
|
|
279 |
], |
|
|
280 |
"language": "python", |
|
|
281 |
"metadata": {}, |
|
|
282 |
"outputs": [ |
3642 |
kaklik |
283 |
{ |
|
|
284 |
"output_type": "stream", |
|
|
285 |
"stream": "stdout", |
|
|
286 |
"text": [ |
3662 |
kaklik |
287 |
"Populating the interactive namespace from numpy and matplotlib\n" |
3642 |
kaklik |
288 |
] |
|
|
289 |
}, |
|
|
290 |
{ |
3662 |
kaklik |
291 |
"metadata": {}, |
|
|
292 |
"output_type": "display_data", |
|
|
293 |
"png": "iVBORw0KGgoAAAANSUhEUgAAAb4AAAEuCAYAAADx63eqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsfXm8HUWZ9tNnP3dLwmaA+GEgGNkCARJiQsIAEkQ2WYKi\niWYEHNEZQFYNERVZFEcCg0TZFAbQYRhDQD7RsEYQEiQgYQn7Fww6gIbc7Zx7lj6nvz+ub6dO3eq9\nuvss9fx++UFubndVb/XUuzzvqxmGYUBBQUFBQaFDkIh7AgoKCgoKClFCEZ+CgoKCQkdBEZ+CgoKC\nQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdB\nEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+C\ngoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKCQkdBEZ+CgoKC\nQkdBEZ+CgoKCQkdBEZ+CgoKCQkchFfcEFBTCRL1eh67rKJVKSKVSSCaTSCaTSCQS0DQNmqbFPUUF\nBYWIoYhPoS1Rr9dRKpUAAIZhoFaroV6vwzAM878sESpCVFDoHCjiU2gr1Ot1VKtV1Ot1DA0Noaen\nxySyZDIJAOa/JxIJ1Ot11Gq1MechIkylUkgkEooQFRTaCIr4FFoehmHAMAyT0ABA0zQYhgFd11Eu\nl1Gr1UwCo983DAOapiGRSIw5HxFipVIxf06/qwhRQaG1oRmGYcQ9CQUFP7AiPACoVCooFApIJBLI\n5/Pm71LMj37fMAyTwNg/IjJjCZOFIkQFhdaCIj6FloOIwFjCGxkZMd2Y3d3dSCaTqFar5u9Uq1XU\najXkcjnzXPyfIIRIZJzNZpFIJMxYoiJEBYXmgHJ1KrQMeMJjCaRcLqNUKiGRSKC7uxupVAqDg4OO\nBEOxP4r/8WPRH7Iq7QiRXKaGYaBUKkHTNNTrdZTL5TFjKkJUUIgPivgUmh6UlUmZmSLCSyaT6O7u\nRjqdHnMs/ZeOofifHYISIjumVQxRRIh8hil7PgUFBTlQxKfQtKDkFF3XAaCB8EqlkqnN6+npQSo1\n9lVmrSdZlpQdIRIxk/u1WCwCwBjrkEiNPx4AarWaeb38mGz8MJlMKutQQcEnFPEpNB2IRHRdR7FY\n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\n", |
3642 |
kaklik |
294 |
"text": [ |
3662 |
kaklik |
295 |
"<matplotlib.figure.Figure at 0x7f3f8205d590>" |
3642 |
kaklik |
296 |
] |
3662 |
kaklik |
297 |
} |
|
|
298 |
], |
|
|
299 |
"prompt_number": 143 |
|
|
300 |
}, |
|
|
301 |
{ |
|
|
302 |
"cell_type": "markdown", |
|
|
303 |
"metadata": {}, |
|
|
304 |
"source": [ |
|
|
305 |
"Pro lep\u0161\u00ed zobrazen\u00ed jednotliv\u00fdch zkreslen\u00ed vykresl\u00edme i 2D pr\u016fm\u011bt dat." |
|
|
306 |
] |
|
|
307 |
}, |
|
|
308 |
{ |
|
|
309 |
"cell_type": "code", |
|
|
310 |
"collapsed": false, |
|
|
311 |
"input": [ |
|
|
312 |
"plt.plot(x, z,'.')" |
|
|
313 |
], |
|
|
314 |
"language": "python", |
|
|
315 |
"metadata": {}, |
|
|
316 |
"outputs": [ |
3642 |
kaklik |
317 |
{ |
3662 |
kaklik |
318 |
"metadata": {}, |
|
|
319 |
"output_type": "pyout", |
|
|
320 |
"prompt_number": 144, |
3642 |
kaklik |
321 |
"text": [ |
3662 |
kaklik |
322 |
"[<matplotlib.lines.Line2D at 0x7f3f820aa790>]" |
3642 |
kaklik |
323 |
] |
|
|
324 |
}, |
|
|
325 |
{ |
3662 |
kaklik |
326 |
"metadata": {}, |
|
|
327 |
"output_type": "display_data", |
|
|
328 |
"png": "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\nbcOvzczMvJktxNXV823YsMH69+9vwWDQsrKyrFu3brZ48eJG11y8eNFqamoa/r179+5tuudYtGS+\nRD6/q82dO9fmzZvX6GeJfH5Xu958iXJ+Tc22bNkyGzx4sFVUVFxzjYezizZfrGfX4rh/99131qdP\nHzty5EjDz+rr661Xr1529uxZMzObMWOGvf/++42uW7p0qZWUlJiZ2UcffWSvvPJKS7cQV9eb75/C\n4fB172xnz55tS5YsMTOzQ4cOWXZ2dlz32VItnS+Rz6++vt4GDx5sv//+u5mZvfPOO/bWW281ui6R\nz6858yXC+TX1e/Ptt9+2MWPGXPOnkSsS+ezMbjxfrGfX4jcxjR49WkeOHFGvXr0kSWlpadq4caN2\n7typ4uJiderUSZmZmVq+fLnat2+vp556Slu3blVtba1efPFFnTt3TsnJySotLVW3bt1asoW4amq+\nK3bt2qXVq1ertLRUkhrmi0Qimjhxov744w916NBBq1atUkZGxi2ZIZqWzpfo57d582YtWrRIycnJ\nuu+++7R27Vp17tzZzfndaL5EOL/rzbZ69Wrdf//9GjhwoJKTkyVJ48eP19SpU12cXXPmi/XseIcq\nADjEm5gAwCHiDgAOEXcAcIi4A4BDxB0AHCLuAOAQcQcAh4g7ADj0P+4RIHXcWDIzAAAAAElFTkSu\nQmCC\n", |
3642 |
kaklik |
329 |
"text": [ |
3662 |
kaklik |
330 |
"<matplotlib.figure.Figure at 0x7f3f81d6bad0>" |
3642 |
kaklik |
331 |
] |
3662 |
kaklik |
332 |
} |
|
|
333 |
], |
|
|
334 |
"prompt_number": 144 |
|
|
335 |
}, |
|
|
336 |
{ |
|
|
337 |
"cell_type": "markdown", |
|
|
338 |
"metadata": {}, |
|
|
339 |
"source": [ |
|
|
340 |
"Z grafu je vid\u011bt, \u017ee se uplat\u0148uj\u00ed oba zn\u00e1m\u00e9 deforma\u010dn\u00ed jevy - soft-iron a hard-iron. Pokus\u00edme se je proto kompenzovat. Nejd\u0159\u00edve zkus\u00edme odstranit Hard-iron efekty zp\u016fsobuj\u00edc\u00ed offsety." |
|
|
341 |
] |
|
|
342 |
}, |
|
|
343 |
{ |
|
|
344 |
"cell_type": "code", |
|
|
345 |
"collapsed": false, |
|
|
346 |
"input": [ |
|
|
347 |
"xoffset = (min(x) + max(x))/2\n", |
|
|
348 |
"print xoffset" |
|
|
349 |
], |
|
|
350 |
"language": "python", |
|
|
351 |
"metadata": {}, |
|
|
352 |
"outputs": [ |
3642 |
kaklik |
353 |
{ |
3662 |
kaklik |
354 |
"ename": "TypeError", |
|
|
355 |
"evalue": "'float' object is not iterable", |
|
|
356 |
"output_type": "pyerr", |
|
|
357 |
"traceback": [ |
|
|
358 |
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", |
|
|
359 |
"\u001b[0;32m<ipython-input-145-8671977becc2>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mxoffset\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mmin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmax\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0;32mprint\u001b[0m \u001b[0mxoffset\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", |
|
|
360 |
"\u001b[0;31mTypeError\u001b[0m: 'float' object is not iterable" |
3642 |
kaklik |
361 |
] |
|
|
362 |
} |
|
|
363 |
], |
3662 |
kaklik |
364 |
"prompt_number": 145 |
3596 |
kaklik |
365 |
}, |
|
|
366 |
{ |
|
|
367 |
"cell_type": "code", |
|
|
368 |
"collapsed": false, |
|
|
369 |
"input": [ |
3662 |
kaklik |
370 |
"zoffset = (min(z) + max(z))/2\n", |
|
|
371 |
"print zoffset" |
3596 |
kaklik |
372 |
], |
|
|
373 |
"language": "python", |
|
|
374 |
"metadata": {}, |
3662 |
kaklik |
375 |
"outputs": [] |
3596 |
kaklik |
376 |
}, |
|
|
377 |
{ |
|
|
378 |
"cell_type": "code", |
|
|
379 |
"collapsed": false, |
|
|
380 |
"input": [ |
3662 |
kaklik |
381 |
"plt.plot(x-xoffset, z-zoffset,'.')" |
3596 |
kaklik |
382 |
], |
|
|
383 |
"language": "python", |
|
|
384 |
"metadata": {}, |
3662 |
kaklik |
385 |
"outputs": [] |
|
|
386 |
}, |
|
|
387 |
{ |
|
|
388 |
"cell_type": "markdown", |
|
|
389 |
"metadata": {}, |
|
|
390 |
"source": [ |
|
|
391 |
"D\u00e1le pot\u0159ebujeme kompenzovat soft-iron efekty. K tomu mus\u00edme pracovat s nam\u011b\u0159en\u00fdmi daty, jako s elipsou a naj\u00edt jej\u00ed hlavn\u00ed a vedlej\u0161\u00ed poloosu. Postup je trochu komplikovan\u011bj\u0161\u00ed, proto adoptujeme k\u00f3d z [PaparazziUAV](http://wiki.paparazziuav.org/wiki/ImuCalibration). Ten pomoc\u00ed fitov\u00e1n\u00ed elipsoindu najde korek\u010dn\u00ed parametry citlivosti pro jednotliv\u00e9 osy. Zanedb\u00e1v\u00e1 ale p\u0159\u00edpadnou rotaci elipsoidu popsanou v \u010dl\u00e1nku [Compensating for Tilt, Hard-Iron, and Soft-Iron Effects](http://www.sensorsmag.com/sensors/motion-velocity-displacement/compensating-tilt-hard-iron-and-soft-iron-effects-6475)" |
|
|
392 |
] |
|
|
393 |
}, |
|
|
394 |
{ |
|
|
395 |
"cell_type": "code", |
|
|
396 |
"collapsed": false, |
|
|
397 |
"input": [ |
|
|
398 |
"import scipy\n", |
|
|
399 |
"from scipy import optimize\n", |
|
|
400 |
"\n", |
|
|
401 |
"import calibration_utils\n", |
|
|
402 |
"\n", |
|
|
403 |
"sensor_ref = 1.\n", |
|
|
404 |
"sensor_res = 0.73\n", |
|
|
405 |
"noise_window = 10\n", |
|
|
406 |
"noise_threshold = 1000" |
3642 |
kaklik |
407 |
], |
3662 |
kaklik |
408 |
"language": "python", |
|
|
409 |
"metadata": {}, |
|
|
410 |
"outputs": [], |
|
|
411 |
"prompt_number": 146 |
3596 |
kaklik |
412 |
}, |
|
|
413 |
{ |
3662 |
kaklik |
414 |
"cell_type": "markdown", |
|
|
415 |
"metadata": {}, |
|
|
416 |
"source": [ |
|
|
417 |
"Uprav\u00edme strukuturu pole m\u011b\u0159en\u00fdch hodnot do sn\u00e1ze indexovateln\u00e9ho form\u00e1tu." |
|
|
418 |
] |
|
|
419 |
}, |
|
|
420 |
{ |
3596 |
kaklik |
421 |
"cell_type": "code", |
|
|
422 |
"collapsed": false, |
|
|
423 |
"input": [ |
3662 |
kaklik |
424 |
"measurements = np.array(list_meas)" |
3596 |
kaklik |
425 |
], |
|
|
426 |
"language": "python", |
|
|
427 |
"metadata": {}, |
|
|
428 |
"outputs": [], |
3662 |
kaklik |
429 |
"prompt_number": 147 |
3596 |
kaklik |
430 |
}, |
|
|
431 |
{ |
3662 |
kaklik |
432 |
"cell_type": "markdown", |
|
|
433 |
"metadata": {}, |
|
|
434 |
"source": [ |
|
|
435 |
"Spo\u010d\u00edt\u00e1me medi\u00e1n magnitudy zm\u011b\u0159en\u00fdch vektor\u016f. A nastav\u00edme podle n\u011bj rozhodovac\u00ed \u00farove\u0148 pro filtraci a ofiltrujeme nam\u011b\u0159en\u00e1 kalibra\u010dn\u00ed data. " |
|
|
436 |
] |
|
|
437 |
}, |
|
|
438 |
{ |
3596 |
kaklik |
439 |
"cell_type": "code", |
|
|
440 |
"collapsed": false, |
|
|
441 |
"input": [ |
3662 |
kaklik |
442 |
"meas_median=scipy.median(scipy.array([scipy.linalg.norm(v) for v in measurements]))\n", |
|
|
443 |
"noise_threshold = meas_median * 0.8\n", |
|
|
444 |
"print noise_threshold\n", |
|
|
445 |
"flt_meas, flt_idx = calibration_utils.filter_meas(measurements, noise_window, noise_threshold)\n", |
|
|
446 |
"print(\"remaining \"+str(len(flt_meas))+\" after filtering\")" |
3596 |
kaklik |
447 |
], |
|
|
448 |
"language": "python", |
|
|
449 |
"metadata": {}, |
|
|
450 |
"outputs": [], |
|
|
451 |
"prompt_number": "*" |
|
|
452 |
}, |
|
|
453 |
{ |
|
|
454 |
"cell_type": "code", |
|
|
455 |
"collapsed": false, |
|
|
456 |
"input": [ |
3662 |
kaklik |
457 |
"flt_meas = measurements" |
3596 |
kaklik |
458 |
], |
|
|
459 |
"language": "python", |
|
|
460 |
"metadata": {}, |
|
|
461 |
"outputs": [], |
|
|
462 |
"prompt_number": "*" |
|
|
463 |
}, |
|
|
464 |
{ |
3662 |
kaklik |
465 |
"cell_type": "markdown", |
|
|
466 |
"metadata": {}, |
|
|
467 |
"source": [ |
|
|
468 |
"Spo\u010d\u00edt\u00e1me odhad elipsoidu z nam\u011b\u0159en\u00fdch minim\u00e1ln\u00edch a maxim\u00e1ln\u00edch hodnot." |
|
|
469 |
] |
|
|
470 |
}, |
|
|
471 |
{ |
3596 |
kaklik |
472 |
"cell_type": "code", |
|
|
473 |
"collapsed": false, |
|
|
474 |
"input": [ |
3662 |
kaklik |
475 |
" p0 = calibration_utils.get_min_max_guess(flt_meas, sensor_ref)\n", |
|
|
476 |
" cp0, np0 = calibration_utils.scale_measurements(flt_meas, p0)\n", |
|
|
477 |
" print(\"initial guess : avg \"+str(np0.mean())+\" std \"+str(np0.std()))\n", |
|
|
478 |
"\n", |
|
|
479 |
" def err_func(p, meas, y):\n", |
|
|
480 |
" cp, np = calibration_utils.scale_measurements(meas, p)\n", |
|
|
481 |
" err = y*scipy.ones(len(meas)) - np\n", |
|
|
482 |
" return err" |
3596 |
kaklik |
483 |
], |
|
|
484 |
"language": "python", |
|
|
485 |
"metadata": {}, |
3662 |
kaklik |
486 |
"outputs": [ |
|
|
487 |
{ |
|
|
488 |
"output_type": "stream", |
|
|
489 |
"stream": "stdout", |
|
|
490 |
"text": [ |
|
|
491 |
"initial guess : avg 0.999920050427 std 0.0671243703038\n" |
|
|
492 |
] |
|
|
493 |
} |
|
|
494 |
], |
|
|
495 |
"prompt_number": 150 |
|
|
496 |
}, |
|
|
497 |
{ |
|
|
498 |
"cell_type": "markdown", |
|
|
499 |
"metadata": {}, |
|
|
500 |
"source": [ |
|
|
501 |
"Optimalizujeme odhad fitov\u00e1n\u00edm elipsoidu." |
|
|
502 |
] |
|
|
503 |
}, |
|
|
504 |
{ |
|
|
505 |
"cell_type": "code", |
|
|
506 |
"collapsed": false, |
|
|
507 |
"input": [ |
|
|
508 |
" p1, cov, info, msg, success = optimize.leastsq(err_func, p0[:], args=(flt_meas, sensor_ref), full_output=1)\n", |
|
|
509 |
" if not success in [1, 2, 3, 4]:\n", |
|
|
510 |
" print(\"Optimization error: \", msg)\n", |
|
|
511 |
" print(\"Please try to provide a clean logfile.\")\n", |
|
|
512 |
" sys.exit(1)\n", |
|
|
513 |
"\n", |
|
|
514 |
" cp1, np1 = calibration_utils.scale_measurements(flt_meas, p1)\n", |
|
|
515 |
" print(\"optimized guess : avg \"+str(np1.mean())+\" std \"+str(np1.std()))" |
|
|
516 |
], |
|
|
517 |
"language": "python", |
|
|
518 |
"metadata": {}, |
|
|
519 |
"outputs": [ |
|
|
520 |
{ |
|
|
521 |
"output_type": "stream", |
|
|
522 |
"stream": "stdout", |
|
|
523 |
"text": [ |
|
|
524 |
"optimized guess : avg 0.999137645687 std 0.0293532050592\n" |
|
|
525 |
] |
|
|
526 |
} |
|
|
527 |
], |
|
|
528 |
"prompt_number": 151 |
|
|
529 |
}, |
|
|
530 |
{ |
|
|
531 |
"cell_type": "markdown", |
|
|
532 |
"metadata": {}, |
|
|
533 |
"source": [ |
|
|
534 |
"Vykresl\u00edme v\u00fdsledek filtrace a fitov\u00e1n\u00ed. " |
|
|
535 |
] |
|
|
536 |
}, |
|
|
537 |
{ |
|
|
538 |
"cell_type": "code", |
|
|
539 |
"collapsed": false, |
|
|
540 |
"input": [ |
|
|
541 |
"%pylab qt\n", |
|
|
542 |
"calibration_utils.plot_results(False, measurements, flt_idx, flt_meas, cp0, np0, cp1, np1, sensor_ref)\n", |
|
|
543 |
"calibration_utils.plot_mag_3d(flt_meas, cp1, p1)" |
|
|
544 |
], |
|
|
545 |
"language": "python", |
|
|
546 |
"metadata": {}, |
|
|
547 |
"outputs": [ |
|
|
548 |
{ |
|
|
549 |
"output_type": "stream", |
|
|
550 |
"stream": "stdout", |
|
|
551 |
"text": [ |
|
|
552 |
"Populating the interactive namespace from numpy and matplotlib\n" |
|
|
553 |
] |
|
|
554 |
}, |
|
|
555 |
{ |
|
|
556 |
"output_type": "stream", |
|
|
557 |
"stream": "stderr", |
|
|
558 |
"text": [ |
|
|
559 |
"WARNING: pylab import has clobbered these variables: ['cov', 'info']\n", |
|
|
560 |
"`%pylab --no-import-all` prevents importing * from pylab and numpy\n" |
|
|
561 |
] |
|
|
562 |
} |
|
|
563 |
], |
|
|
564 |
"prompt_number": 152 |
|
|
565 |
}, |
|
|
566 |
{ |
|
|
567 |
"cell_type": "markdown", |
|
|
568 |
"metadata": {}, |
|
|
569 |
"source": [ |
|
|
570 |
"Nyn\u00ed m\u016f\u017eeme z\u00edskan\u00e9 scale faktory a offsety pou\u017e\u00edt na kompenzaci libovoln\u00e9ho m\u011b\u0159en\u00ed a n\u00e1sledn\u011b vypo\u010d\u00edtat polohov\u00e9 \u00fahly platformy ve sf\u00e9rick\u00fdch sou\u0159adnic\u00edch." |
|
|
571 |
] |
|
|
572 |
}, |
|
|
573 |
{ |
|
|
574 |
"cell_type": "code", |
|
|
575 |
"collapsed": false, |
|
|
576 |
"input": [ |
|
|
577 |
"for n in range(MEASUREMENTS):\n", |
|
|
578 |
" m = mag_sensor.axes()\n", |
|
|
579 |
" sm = (m - p1[0:3])*p1[3:6]\n", |
|
|
580 |
" r = norm(sm)\n", |
|
|
581 |
" theta = np.arccos(sm[2]/r)\n", |
|
|
582 |
" phi = np.arctan2(sm[1],sm[0])\n", |
|
|
583 |
" clear_output()\n", |
|
|
584 |
" print (r,(theta*180)/pi,(phi*180)/pi)\n", |
|
|
585 |
" sys.stdout.flush()" |
|
|
586 |
], |
|
|
587 |
"language": "python", |
|
|
588 |
"metadata": {}, |
3596 |
kaklik |
589 |
"outputs": [], |
|
|
590 |
"prompt_number": "*" |
|
|
591 |
}, |
|
|
592 |
{ |
|
|
593 |
"cell_type": "code", |
|
|
594 |
"collapsed": false, |
|
|
595 |
"input": [], |
|
|
596 |
"language": "python", |
|
|
597 |
"metadata": {}, |
3662 |
kaklik |
598 |
"outputs": [ |
|
|
599 |
{ |
|
|
600 |
"metadata": {}, |
|
|
601 |
"output_type": "pyout", |
|
|
602 |
"prompt_number": 92, |
|
|
603 |
"text": [ |
|
|
604 |
"583.14932841582277" |
|
|
605 |
] |
|
|
606 |
} |
|
|
607 |
], |
|
|
608 |
"prompt_number": 92 |
|
|
609 |
}, |
|
|
610 |
{ |
|
|
611 |
"cell_type": "code", |
|
|
612 |
"collapsed": false, |
|
|
613 |
"input": [], |
|
|
614 |
"language": "python", |
|
|
615 |
"metadata": {}, |
|
|
616 |
"outputs": [] |
3596 |
kaklik |
617 |
} |
|
|
618 |
], |
|
|
619 |
"metadata": {} |
|
|
620 |
} |
|
|
621 |
] |
|
|
622 |
} |