Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
| 
                    2018:accel-roll-pitch [2019/01/14 21:51] Ondrej Vörös  | 
                
                    2018:accel-roll-pitch [2019/01/14 23:58] (aktuální) Ondrej Vörös  | 
            ||
|---|---|---|---|
| Řádek 15: | Řádek 15: | ||
| Derotačná matica bude počítaná pomocou Matlabu, pretože obsahuje goniometrické funkcie. | Derotačná matica bude počítaná pomocou Matlabu, pretože obsahuje goniometrické funkcie. | ||
| - | Program bude možno ovládať cez UART konzolu (vložiť derotačnú maticu, kompenzovať výpočet náklonu). | + | Program bude možné ovládať cez UART konzolu (vložiť derotačnú maticu, kompenzovať výpočet náklonu). | 
| {{https://www.novatel.com/assets/Web-Phase-2-2012/Solution-Pages/AttitudePlane.png }} | {{https://www.novatel.com/assets/Web-Phase-2-2012/Solution-Pages/AttitudePlane.png }} | ||
| Řádek 62: | Řádek 62: | ||
| hodnotám zrýchlenia v ose x otáča znamienko (otáčame x-ovú os), keďže výpočet derotačnej matice podľa | hodnotám zrýchlenia v ose x otáča znamienko (otáčame x-ovú os), keďže výpočet derotačnej matice podľa | ||
| [[https://www.st.com/resource/en/design_tip/dm00358510.pdf|DT0076]]  aj podľa | [[https://www.st.com/resource/en/design_tip/dm00358510.pdf|DT0076]]  aj podľa | ||
| - | [[ttps://www.mathworks.com/help/phased/ref/rotx.html| funkcií MATLABU]] prebieha v pravotočivom súradnicovom | + | [[https://www.mathworks.com/help/phased/ref/rotx.html| funkcií MATLABU]] prebieha v pravotočivom súradnicovom | 
| systéme. | systéme. | ||
| {{ 2018:accel-roll-pitch:sur_system-na-doske.png?400 }} | {{ 2018:accel-roll-pitch:sur_system-na-doske.png?400 }} | ||
| - | Priečny náklon je definovaný ako rotácia okolo osi x a pozdĺžny náklon ako rotácia okolo osi y. Náklon | + | Priečny náklon je definovaný ako rotácia okolo osi x (použité hodnoty zrýchlenia  v osi y) a pozdĺžny náklon | 
| - | v jednotlivých smeroch je indikovaný aj pomocou štyroch LED diód umiestených  na vývojovej doske do kríža | + | ako rotácia okolo osi y (použité hodnoty zrýchlenia  v osi x). Náklon v jednotlivých smeroch je indikovaný aj | 
| - | po stranách akceleremetru.  | + | pomocou štyroch LED diód umiestených  na vývojovej doske do kríža po stranách akceleremetru (funkcia ''tilt_light''). | 
| <code c> | <code c> | ||
| - | if ((HAL_GetTick() - tick) >= per_meas) { // period of measurement | + | while (1) | 
| - | BSP_ACCELERO_GetXYZ(buffer); | + | { | 
| - | accX = buffer[0]; | + | if ((HAL_GetTick() - tick) >= per_meas) { // period of measurement | 
| - | accY = buffer[1]; | + | BSP_ACCELERO_GetXYZ(buffer); | 
| - | accZ = buffer[2]; | + | accX = buffer[0]; | 
| + | accY = buffer[1]; | ||
| + | accZ = buffer[2]; | ||
| - | //printf("zrychlenie:\t%4.1f\t%4.1f\t%4.1f\n", accX, accY, accZ); | + | tilt_light(accX, accY); | 
| - | tilt_light(accX, accY); | + | pitch = get_degree_tilt(-accX, max_xval); //pitch- acceleration around axis y --> accX , -accX --turning around axis X to get right-rotated coordinate system | 
| + | roll = get_degree_tilt(accY, max_yval); // get roll- acceleration around axis x --> accY | ||
| - | pitch = get_degree_tilt(-accX, max_xval); //pitch- acceleration around axis y --> accX , -accX --turning around axis X to get right-rotated coordinate system | + | printf("roll,pitch:\t%2.1f%c\t%2.1f%c\n", roll, deg_sign, pitch, deg_sign); | 
| - | roll = get_degree_tilt(accY, max_yval); // get roll- acceleration around axis x --> accY | + | |
| - | printf("roll,pitch:\t%2.1f%c\t%2.1f%c\n", roll, deg_sign, pitch, deg_sign); | + | tick = HAL_GetTick(); | 
| - | + | } | |
| - | tick = HAL_GetTick(); | + | ... | 
| } | } | ||
| </code> | </code> | ||
| ==== Výpočet derotačnej matice a kompenzácia náklonu ==== | ==== Výpočet derotačnej matice a kompenzácia náklonu ==== | ||
| + | Derotačná matica je inverzná alebo transponovaná rotačná matica. Rotačné matice pre rotáciu okolo jednotlivých osí | ||
| + | sú [[https://www.mathworks.com/help/phased/ref/rotx.html|definované]] takto: | ||
| + | |||
| + | Rx = [1 0 0; 0 cos(roll) -sin(roll); 0 sin(roll) cos(roll)];  % rotacna matica okolo osi x- counterclockwise | ||
| + | Ry = [cos(pitch) 0 sin(pitch); 0 1 0; -sin(pitch) 0 cos(pitch)]; % rotacna matica okolo osi y- counterclockwise | ||
| + | Rz = [cos(yaw) -sin(yaw) 0; sin(yaw) cos(yaw) 0; 0 0 1]; % rotacna matica okolo osi z- counterclockwise | ||
| + | |||
| + | Keďže pomocou akcelerometru nie je možné počítať uhol kurzu (otočenie okolo osi z- yaw), rotačnú maticu ''Rz'' | ||
| + | nevyužijeme. Ako derotačnú maticu sme použili ''M = Rx*Ry'' (bola určená experimentálne, aby vektor zrýchlenia | ||
| + | [1000 0 0] pri rotácii o 90° pozdĺžneho náklonu-pitch sa otočil do polohy [0 0 1000]- nasmerovanie osi z | ||
| + | do smeru gravitačného zrýchlenia). Rovnako, pri použití rotačnej matice M sa vektor zrýchlenia [0 -1000 0] | ||
| + | pri rotácii o 90° priečneho náklonu-roll otočí do polohy [0 0 1000]. | ||
| + | |||
| + | Derotovanie dátového vektora (v našom prípade vektoru zrýchlenia) prebieha vynásobením vektoru s derotačnou maticou. | ||
| + | Následne možno z derotovaného vektoru znovu vypočítať uhly náklonu. | ||
| + | |||
| + | accXr = M(1,1)*accX + M(1,2)*accY + M(1,3)*accZ | ||
| + | accYr = M(2,1)*accX + M(2,2)*accY + M(2,3)*accZ | ||
| + | accZr = M(3,1)*accX + M(3,2)*accY + M(3,3)*accZ | ||
| ==== Štruktúra programu ==== | ==== Štruktúra programu ==== | ||
| + | Štruktúra programu je nasledovná, v nekonečnej smyčke prebieha výpočet a zobrazovanie náklonu v časovom intervale | ||
| + | jedna sekunda a tiež spracovanie znakov z kruhového zásobníka prijímaných sériovým rozhraním UART. K ovládaniu | ||
| + | programu cez sériové rozhranie slúžia dva príkazy:  | ||
| + | * ''COMPENSATE'' - spustenie kompenzovaného výpočtu náklonu (30 meraní s periódou 1 sekunda) | ||
| + | * ''MATRIX m11 m12 m13 m21 m22 m23 m31 m32 m33'' - zadanie derotačnej matice (zadanie prvkov matice po riadkoch) | ||
| + | ----- | ||
| - | ---- | ||
| ====== Záver ====== | ====== Záver ====== | ||
| - | [[https://drive.google.com/open?id=1P0V9NppeeiWWQ49n4yWtXbpKTopOQkus|zdrojové súbory]] | + | Výsledkom riešenia projektu je meranie pozdĺžneho a priečneho náklonu. Tiež bola implementovaná derotácia dátového | 
| + | vektoru zrýchlenia pre ľubovoľnú polohu akcelerometru voči referenčnej rovine. Kompenzácia dát derotáciou | ||
| + | dátového vektoru zrýchlenia podľa hodnôt náklonu akcelerometru vo zvolenej polohe nie je žiaľ presná (nepresnosť | ||
| + | kolíše v závislosti na zvolenej polohe akcelerometru) a nepodarilo sa mi prísť (kvôli nedostatku času) na to, | ||
| + | kde môže byť chyba. | ||
| + | [[https://drive.google.com/open?id=16A5mXGF80x7sn3EjSTIg6NrUqWS896O5|zdrojové súbory]] | ||
| [[https://drive.google.com/open?id=17qJpzuhK15dT8O1v8BeUGPA5j-lbc9JG|videoukážka]] | [[https://drive.google.com/open?id=17qJpzuhK15dT8O1v8BeUGPA5j-lbc9JG|videoukážka]] | ||
| ---- | ---- | ||