KURZ: Senzor akcelerace
- Podrobnosti
- Mgr. Jan Baťko
- Aktualizováno: 01.04.2014
- Zobrazení: 8083
KAPITOLY
Senzor akcelerace neboli zrychlení umožňuje sledovat, s jakým zrychlením se pohybuje náš robot. Jeho pomocí se také sleduje chování robota a pomocí získaných hodnot se dají eliminovat nežádoucí pohyby, které by mohly ohrozit robotovu stabilitu. Zrychlení je měřeno ve třech osách. Jedná se o osu x, y a z. Osa x je osa souběžná s tělem senzoru. Osa y označuje směr z jedné boční strany senzoru na druhou. Tato osa je k dispozici spíše jako výstupní hodnota. Osa z je stejně jako osa y výstupní hodnota a vyjadřuje měření ve směru od spodní hrany senzoru k horní. Zrychlení se pomocí senzoru akcelerace dá měřit v rozsahu od -2G do +2G. Měření zrychlení není jedinou funkcí senzoru. Dokáže také měřit náklon robota.
PRÁCE Se senzorem akcelerace V PROGRAMOVACÍCH PROSTŘEDÍCH
NXT-G
Blok pro ovládání senzoru akcelerace
Rozcestník
UMÍSTĚNÍ BLOKU
Senzor akcelerace je v programovacím prostředí NXT-G řízen blokem Acceleration Sensor. Tento blok není součástí základní instalace. Pro jeho použití je nutné jej do prostředí importovat. Návod k importu rozšiřujících modulů naleznete v kapitole Instalace rozšiřujících modulů.
POPIS BLOKU
Programový blok senzoru akcelerace obsahuje celkem sedm konektorů pro propojení s dalším bloky.
Port - určuje, ke kterému ze vstupních portů (1-4) je senzor připojen.
x - výstup vyjadřující hodnotu naměřenou ve směru osy x.
y - výstup vyjadřující hodnotu naměřenou ve směru osy y.
z - výstup vyjadřující hodnotu naměřenou ve směru osy z.
Yes / No - hodnota logického datového typu vyjadřující výsledek porovnání zrychlení na ose x.
Trigger Point - v programovacím prostředí nastavená hodnota zrychlení určená k porovnání s hodnotou naměřenou senzorem.
Greater / Less - vstupně výstupní konektor určující znaménko k porovnání hodnot.
PARAMETRY BLOKU
Port: značí, ke kterému ze vstupních portů (1-4) je senzor připojen.
Compare: část bloku, ve které je možné pomocí tažítka nastavit hodnotu pro osu x určenou k porovnání s hodnotou naměřenou senzorem. Rozsah hodnot je zde možné volit od -400 do +400. Hodnotu je možné nastavit buďto pomocí tažítka nebo přímým zadáním hodnoty do menšího bloku. V rozbalovacím menu jsou k dispozici znaménka určená pro porovnání.
RobotC
Příkazy pro ovládání senzoru akcelerace
Rozcestník
Nastavení senzoru
Před započetím práce se senzorem akcelerace je nutné jej v programovacím prostředí RobotC nadeklarovat. Zápis deklarace se skládá z klíčového slova #pragma a příkazu config(), který obsahuje čtyři parametry. Prvním parametrem je rozlišeno, zda se jedná o deklaraci motoru či senzoru (v našem případě se jedná o senzor). Druhý parametr udává, ke kterému vstupnímu portu (S1 - S4) je senzor připojen (v příkladu port číslo 1). Třetí parametr je volitelný. Jedná se o název senzoru v deklaraci a je zadáván uživatelem. Poslední částí deklarace je typ senzoru (sensorI2CHiTechnicAccel = označení senzoru akcelerace).
#pragma config(Sensor, S1, Akceleracni, sensorI2CHiTechnicAccel) // Kod je automaticky generovan pruvodcem deklaraci RobotC.
Poznámka: Deklaraci lze provést ručním zapsáním v příkladu nebo v menu programovacího prostředí RobotC. Postup je uveden v kapitole Deklarace motorů a senzorů.
nastavení typu senzoru
Druhou možností deklarace senzoru je definování pomocí příkazu SensorType[]. Parametrem v závorce je volitelný název senzoru, který je předem definován pro třídu tSensors, která pro programovací prostředí RobotC definuje rozšiřující moduly. K nadefinovanému názvu senzoru poté přiřadíme konkrétní typ senzoru podle jeho označení pro RobotC (např. sensorI2CHiTechnicAccel = označení senzoru akcelerace).
Tento typ deklarace je doporučeno provádět zkušenějším uživatelům. Začátečníkům se doporučuje deklarovat moduly pomocí Deklarace motorů a senzorů v horní liště menu.
tSensors akceleracni; SensorType[akceleracni] = sensorI2CHiTechnicAccel;
Práce s hodnotou snímanou senzorem
Během vyhodnocování nebo porovnávání hodnot snímaných senzorem a fixních hodnot zadaných uživatelem, budeme využívat příkaz k práci s touto hodnotou. V programovacím prostředí RobotC se k této činnosti používá příkaz SensorValue[]. Parametrem tohoto příkazu je předem definovaný název senzoru. Tomuto příkazu může být poté přiřazena určitá hodnota k porovnání s hodnotou ze senzoru.
SensorValue[sensorAccel] > 60; // Nastaveni hodnoty senzoru, ktera ma byt porovnana s urcitou fixne zadanou hodnotou.
V programovacím prostředí RobotC je připravena vývojová knihovna, která nese název AdvancedSensors.c. Slouží k tomu, abychom mohli provádět s rozšiřujícími senzory pokročilejší operace. V jejím těle jsou předdefinovány některé výpočtové operace, které nám umožní získat jednoduše data z rozšiřujících senzorů. Zavolání tohoto souboru provedeme následovně:
#include "AdvancedSensors.c"
Pro senzor akcelerace je zde nadefinována funkce getAccel(), která umožňuje získat hodnotu zrychlení v osách x, y a z. Zavoláním funkce getAccel(), která má čtyři parametry - název senzoru a tři hodnoty zjišťujeme, jaké jsou aktuálně snímané hodnoty senzorem. Celý zápis můžete vidět níže.
int X; int Y; int Z; getAccel(akceleracni, X, Y, Z);
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 Move po dobu tří vteřin. Následně je pomocí bloků 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 Start Datalog a na konec programu Stop Datalog.
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í.
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.
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.
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á.
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.
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.
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); } }