KURZ: Senzor akcelerace - Možnosti praktického využití

KAPITOLY

MOŽNOSTI PRAKTICKÉHO VYUŽITÍ

Senzor akcelerace je takzvaný trojosý senzor. Měří totiž zrychlení ve třech osách senzoru. Díky tomu nemusíme s jeho pomocí měřit pouze zrychlení, ale také náklon robota. Tento senzor nám tak umožňuje určovat polohu robota přesněji, než je tomu například u gyroskopického senzoru. Využívá se hlavně jako stabilizační prvek robota. Při nežádoucím pohybu robota můžeme reagovat pohybem, který pohyb ustálí a předejdeme tak pádu modelu. Velmi často se akcelerační senzor také používá u různých herních konzolí a ovladačů. Pomocí monitorování změn na třech osách senzoru můžeme určovat pohyb při ovládání.

NXT-G

VYUŽITÍ SENZORU AKCELERACE

Použití senzoru jako stabilizačního prvku si často vyžaduje vytvoření složitějšího programového konstruktu. Jeho funkci si ukážeme na analýze dat, která zjišťuje. Vytvoříme si jednoduchý program a prozkoumáme, jaký průběh mají křivky vykreslené do grafu pomocí zjištění hodnot všech tří os senzoru. Zároveň si tak blíže představíme funkci Data Logging.

Zobrazení snímaných hodnot

Před analýzou hodnot si musíme vytvořit vhodný program. Použili jsme stejný program jako u analýzy dat gyroskopického senzoru. Jedná se o program, ve kterém se nejprve robot pohybuje vpřed, poté se natočí nejprve vlevo a poté vpravo a nakonec vyrazí kupředu vyšší rychlostí než v úvodu. Pomocí funkce Data Logging programovacího prostředí NXT-G nakonec zanalyzujeme hodnoty zjištěné senzorem a zobrazené v grafu.

Vytvoření programu 

Na obrázku níže můžete vidět finální podobu programu pro analýzu. Robot se nejprve rozjede vpřed pomocí bloku MovePaletteDragged Move po dobu tří vteřin. Následně je pomocí bloků MotorDragged Motor realizováno nejprve natočení o 360° vlevo a poté o 360° vpravo. Nakonec robot vyrazí vpřed dvojnásobnou rychlostí než při rozjetí, opět po dobu tří vteřin. Pro analýzu dat musíme ještě na úvod programu umístit blok StartDatalogDragged Start Datalog a na konec programu StopDatalogDragged Stop Datalog.

accel program

Musíme ještě provést nastavení bloku pro Data Logging. Důležité je hlavně nastavení dostatečného počtu zaznamenaných vzorků dat za sekundu. Nastavili jsme frekvenci snímání 10 sekund za sekundu, což je dostačující. Na port 1 připojíme senzor a navolíme ho v nastavení.

datalog nastaveni 

Analýza dat

Po spuštění programu provedeme pomocí vestavěné funkce pro zaznamenávání dat Data Logging analýzu dat. Zanalyzujeme nejprve hodnoty zjištěné na každé ose zvlášť a nakonec jejich průběhy porovnáme.

Osa X

První osou, na kterou se zaměříme bude osa X. Na náš model robota jsme umístili senzor na přední část, nasměrovaný přímo před robota. Osa X je ta, která směřuje přímo před přední část robota. Měla by tedy měřit zrychlení při pohybu vpřed. Na obrázku níže vidíte průběh hodnot zaznamenaný do grafu. Na křivce je patrný nárůst hodnot po rozjetí robota. Následně se křivka ustálí, protože robot se pohybuje konstantní rychlostí vpřed. Velmi dobře patrné je také natočení vpravo a vlevo. Po započetí natáčení hodnota také lehce naroste. Další nárůst hodnot můžeme vidět také u opětovného rozjetí vpřed. Jelikož při zastavení z vysoké rychlosti robot prudce sníží svoji rychlost a kola se o malinký úsek natočí zpět, můžeme na grafu vidět i prudkou změnu zrychlení do záporných hodnot a okamžitý nárůst do hodnot kladných, na konci programu.

Na základě analýzy této křivky tedy můžeme konstatovat, že senzor přesně zachytil okamžiky, kdy robot změnil svoji rychlost v přímém směru.

X

Osa Y

Osa Y směřuje při našem umístění senzoru do bočních stran robota. Monitoruje tedy zrychlení vpravo a vlevo. Pokud se podíváme na křivku průběhu zaznamenaných hodnot, vidíme, že kmitání je po celou dobu programu přibližně stejně velké. Je to z toho důvodu, že se robot pohyboval po ne úplně rovném povrchu. Je navíc aktivováno řízení pohybu robota, které zajišťuje jeho rovnoměrný pohyb vpřed. Mírné dorovnávání přímého pohybu tedy zapříčiní lehké nachylování do stran. Tuto změnu natáčení tedy senzor také zachytil. Na obrázku níže můžete vidět velice dobře patrný úsek, ve kterém se robot natáčel na obě strany. Na začátku a na konci tohoto pohybu je velmi dobře patrná změna hodnot (zrychlení).

Po analýze hodnot snímaných na ose Y, můžeme na obrázku zřetelně vidět, že senzor přesně zachytil okamžik, kdy se robot vychýlil z přímého směru.

Y

Osa Z

Jako poslední se podíváme na hodnoty snímané v ose Z. Hodnoty jsou snímané ve vertikálním směru senzoru. Na obrázku níže můžete vidět průběh hodnot. Při prudkém rozjezdu je patrný jejich nárůst. Další velmi patrnou změnu můžeme vidět při opětovném rozjezdu vpřed. Jelikož rychlost robota zde dvojnásobně vzrostla, došlo při prudké akceleraci k přizvednutí čelní části robota. Hodnota je proto rozdílná od prvního pohybu vpřed. Velmi dobře partné je také zastavení robota. Při prudkém zastavení opět došlo k mírnému vertikálnímu pohybu robota, což senzor znovu zaznamenal.

Nezvyklý je posun hodnot po ose X grafu. Hodnoty se nezaznamenávají od 0, ale jejich nejnižší hodnota se pohybuje kolem 200 m/s. Senzor akcelerace totiž v této poloze měří gravitační zrychlení. Díky tomu je hodnota neustále takto vysoká.

Z

Porovnání hodnot

Na posledním obrázků můžete vidět průběh hodnot měřených na všech třech osách v jediném grafu. Zeleně je znázorněna osa X, modře osa Y a červeně osa Z. V grafu jsou znázorněny také všechny tři části programu (rozjetí, natáčení, opětovné rozjetí).

Na této analýze můžete vidět, že senzor akcelerace je skutečně užitečný nástroj, který dokáže přesně snímat pohyby robota ve všech třech směrech. Při správném vyhodnocení můžeme následně na jednotlivé změny reagovat podle potřeby.

porovnani

RobotC

VYUŽITÍ SENZORU AKCELERACE

Jelikož v programovacím prostředí RobotC chybí funkce, která by graficky zobrazovala snímané hodnoty ze senzoru, představíme si možnosti práce se senzorem akcelerace na jiném příkladu. Nemusíme jej totiž používat pouze pro zjišťování hodnot, ale také jako řídící prvek. Sestrojili jsme si z technických dílů stavebnice ovládací páku podobnou kniplu letadla, která se pohybuje pomocí spodního pohyblivého kloubu do všech směrů. Vzhled ovladače můžete vidět na obrázku.

IMAG0709

Zobrazení polohy ovladače

Funkci akceleračního senzoru ověříme pomocí jednoduchého programu. Ten bude na displej řídící jednotky vykreslovat kolečko, které se bude po displeji pohybovat v závislosti na pohybu ovladače. Záležet vždy bude na tom, do jaké polohy jej uživatel natočí. Jednoduše tak budeme ověřovat polohu ovladače. Pomocí bluetooth komunikace bychom tímto ovladačem mohli ovládat také vlastní vytvořené vozítko.

Krok 1 - Deklarace senzoru a volání knihoven

Než začneme programovat, musíme si v úvodu našeho programu deklarovat senzor, který používáme. Zápis deklarace vidíte níže. Klíčové jsou čtyři parametry uvedené v závorce. Jedná se o typ modulu (Sensor), port, ke kterému je připojen (S1), volitený název (akcel) a standardizovaný název. V našem programu využijeme vývojovou knihovnu vytvořenou pro rozšiřujícící senzor akcelerace. Musíme proto senzor deklarovat jako rozšiřující. Z toho plyne jeho název v deklaraci - sensorI2CCustom. Následně zavoláme také vývojovou knihovnu, kterou naleznete v knihovnách vývojového prostředí. Její název zní hitechnic-accelerometer.h. Nezapomeňte správně zadat umístění knihovny. V našem příkladu je knihovna umístěna ve stejném adresáři jako program.

 
#pragma config(Sensor, S1, akcel, sensorI2CCustom)
// deklarace senzoru
 
#include "hitechnic-accelerometer.h"
 

 Poznámka: Ve stejném adresáři jako program musí být ještě vývojová knihovna common.h, jinak by program nefungoval správně.

 

Krok 2 - Zjišťování hodnot

 Dále přistoupíme ke zpracování hodnot, které nám senzor vrací. Nejprve jsme si nadeklarovali tři proměnné datového typu integer pro uložení hodnot tří směrů zrychlení (X, Y a Z). Nyní použijeme příkaz, díky kterému hodnoty získáme. Ten nalezneme ve vývojové knihovně hitechnic-accelerometer.h a jeho název je HTACreadAllAxes(). Obsahuje čtyři parametry uvedené v závorce. První je volitelný název senzoru z deklarace a další tři jsou názvy proměnných, do kterých se mají hodnoty uložit (X, Y a Z).

 
 // promenne pro ulozeni hodnot ze senzoru
 int X = 0;
 int Y = 0;
 int Z = 0;
 
 // zjisteni hodnot ze senzoru
 HTACreadAllAxes(akcel, X, Y, Z);
 
 
Krok 3 - Výpočet souřadnic

Po zjištění jsme již mohli přejít ke zpracování hodnoty. Pro neustálé vykreslování kolečka na displeji potřebujeme dvě proměnné, které budou reprezentovat souřadnice jeho umístění v Kartézské soustavě souřadnic (dispX a dispY). Do nich uložíme vypočítanou hodnotu aktuálního umístění. Budeme zpracovávat pouze hodnotu X a Y, protože pro zobrazení na displeji nepotřebujeme pracovat se zrychlením ve vertikálním směru senzoru. Jelikož vrácené hodnoty jsou příliš velké, vydělili jsme je nejprve dvěma. Při výpočtu pozice na ose Y jsme museli hodnotu X ze senzoru ještě vynásobit -1, protože jinak by zobrazování fungovalo opačně. Při pohybu vpřed by se kolečko pohybovalo vzad a naopak. Jako poslední bylo nutné upravit pozici kolečka na displeji tak, aby v případě, že je ovladač ve středové poloze, bylo uprostřed displeje. Pozice na ose X tak byla posunuta o 60 bodů displeje a po ose Y o 40.

 
// promenne pro ulozeni souradnic kolecka
 int dispX;
 int dispY;
 
// vypocet souradnic pro umisteni kolecka na displeji
 dispX = (Y / 2) + 60;
 dispY = ((X * (-1)) / 2) + 40;
 
 
Krok 4 - Vykreslení kolečka

Dynamické vykreslování kolečka na displeji jsme provedli příkazem nxtDrawCircle(). Příkaz obsahuje tři parametry. První dva vyjadřují pozici v Kartézské soustavě souřadnic, ze které se má kolečko začít vykreslovat. Použili jsme proto hodnoty uložené v proměnných dispX a dispY. Třetí parametr vyjadřuje průměr kolečka. Pro konzistentnost vykreslování jsme ještě za vykreslení přidali příkaz wait1Msec() a oddálili tak vykonávání dalšího příkazu o 50 milisekund.

 
 // vykreslovani kolecka
 nxtDrawCircle(dispX, dispY, 15);
 wait1Msec(50);
 
 
Výsledný program

Níže můžete vidět hotový program. Veškeré příkazy pro zjišťování hodnot a vykreslování kolečka jsou umístěny v nekonečném cyklu while(). Před každým průchodem cyklem nesmíme zapomenout na smazání displeje příkazem eraseDisplay().

 
#pragma config(Sensor, S1, akcel, sensorI2CCustom)
// deklarace senzoru
 
#include "hitechnic-accelerometer.h"
 
task main () {
 // promenne pro ulozeni hodnot ze senzoru
 int X = 0;
 int Y = 0;
 int Z = 0;
 
 while (true)
 {
   eraseDisplay();
 
   // promenne pro ulozeni souradnic kolecka
   int dispX;
   int dispY;
 
   // zjisteni hodnot ze senzoru
   HTACreadAllAxes(akcel, X, Y, Z);
 
   // vypocet souradnic pro umisteni kolecka na displeji
   dispX = (Y / 2) + 60;
   dispY = ((X * (-1)) / 2) + 40;
 
   // vykreslovani kolecka
   nxtDrawCircle(dispX, dispY, 15);
   wait1Msec(50);
 }
}
 

 

Program ke stažení

Stažení ve formátu .c

1 1 1 1 1 1 1 1 1 1 Hodnocení 0.00 (0 hodnocení)

Nemáte oprávnění přidat komentář.
Komentáře mohou přidávat pouze registrovaní uživatelé, kteří neporušují pravidla diskuze.