KURZ: Náhodná čísla

Generování náhodných čísel slouží ke generování hodnot v zadaném rozmezí pro určité předem nedefinované chování robota. Můžeme například zasílat motoru náhodně generované hodnoty, které budou vyjadřovat dobu trvání otáčení, na jejichž základě se bude otáčet po předem nedefinovanou dobu.

generování náhodných čísel V PROGRAMOVACÍM PROSTŘEDÍ

NXT-G

Blok pro generování náhodných čísel

Rozcestník


UMÍSTĚNÍ BLOKU

Generování náhodných čísel můžeme využít díky bloku RandomNumberDragged Random, který je umístěn v paletě Paleta Complete Complete > DataOperations Data.

NXTG random block

 

Popis bloku

Programový blok RandomNumberDragged Random obsahuje tři konektory pro propojení s dalšími bloky.

A A - spodní hodnota rozpětí čísel, ze kterých jsou generována náhodná čísla (možný rozsah 0 - 32767).

B B - horní hodnota rozpětí čísel, ze kterých jsou generována náhodná čísla (možný rozsah 0 - 32767).

Number Numbernáhodně generované číslo z nadefinovaného rozpětí hodnot (mezi hodnotami A a B).

 

PARAMETRY BLOKU

NXTG random

Range: pole sloužící pro zadání rozpětí hodnot, ze kterých bude generováno náhodné číslo. A je spodní hodnota a B horní hodnota rozpětí. Hodnoty je možné zadat buďto do polí Minimum a Maximum nebo pomocí tažítka.

RobotC

Příkazy a metody

Rozcestník


Nastavení jádra pro generování čísel

Pokud chceme v programovacím prostředí RobotC generovat pseudonáhodná čísla musíme nejprve jádru definovat s jak velkým rozsahem čísel budeme pracovat. Pro nastavení generátoru slouží příkaz srand(). Parametrem uvedeným v závorce je číslo od -32767 do 32767. Použítím příkazu srand() docílíme toho, že při každém spuštění programu bude generována stejná sekvence čísel. Hodnota je následně zpracovávána v generátoru pseudonáhodných čísel ve firmware programového prostředí.

 
seed(4246); // Nastaveni generatoru pseudonahodnych cisel.
 

Generování náhodných čísel

Samotné generování náhodných čísel se provádí příkazem random(). Parametr v závorce udává horní mez pro generování. Spodní mez je automaticky nastavena na 0. Použití příkazu random() musí předcházet nastavení generátoru příkazem seed().

 
seed(4246); // Nastaveni generatoru pseudonahodnych cisel.
random(10); //Generuje nahodna cisla od 0 do 10.
 

Definování vlastního rozsahu generovaných čísel

Při použití příkazu random() jsou generována pouze čísla od 0 do hodnoty zadané jako parametr příkazu. Pokud zadáme kromě základní hodnoty i hodnotu spodní, můžeme tím definovat rozsah čísel, ze kterých se budou hodnoty generovat. Použití je představeno na jednoduchém příkladu, ve kterém chceme generovat čísla v rozsahu od 10 do 50. V příkazu jsme tedy zadali spodní mez 10. Přičtením příkazu random(40) v programu definujeme, že má být generováno ze 40 náhodných čísel od spodní meze.

 
10 + random(40);
 

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

KURZ: Kontrola intervalů

V programování ne vždy pracujeme s konkrétní hodnotou nebo číslem. V některých případech potřebujeme pouze zjistit, zda číslo patří do určitého intervalu neboli číselného rozmezí. Jako příklad můžeme uvést situaci, ve které se určitá akce bude provádět pouze v případě, že intenzita světla v okolí měřená senzorem bude v rozmezí od 20 do 50. Často také potřebujeme pouze porovnávat dvě číselné hodnoty nebo hodnoty uložené v proměnné či konstantě. V obou programovacích prostředích se vyjádření rozmezí hodnot nebo jejich porovnávání provádí odlišným způsobem.

Kontrola intervalů V PROGRAMOVACÍch PROSTŘEDÍch

NXT-G

Bloky pro kontrolu intervalů a porovnání hodnot

Rozcestník


Kontrola intervalů

K zjišťování, zda se hodnota nachází uvnitř či vně rozmezí se v programovacím prostředí NXT-G používá blok RangeDragged Range, který je umístěn v paletě Paleta Complete Complete > DataOperations Data.

 

Range blok

 

Blok RangeDragged Range obsahuje celkem 4 konektory pro propojení s dalšími bloky:

A Lower Limit - nižší hodnota zadávaného rozmezí.

B Upper Limit - vyšší hodnota zadávaného rozmezí.

Number Test Value - hodnota, u které chceme zjistit, zda je ve zvoleném rozmezí či nikoliv.

 genericLogic Yes/No - výstup logického datového typu, který vyjadřuje výsledek zjištění (zda je hodnota v rozmezí či nikoliv).

 

Parametry bloku

Range

Operation: sekce, ve které si nejprve volíme, zda chceme zjistit, jestli je hodnota v rozmezí (Inside Range) nebo mimo něj (Outside Range). Následně si v polích označených A a B nastavíme rozmezí, u kterého tuto skutečnost chceme zjišťovat.

Test value: hodnota, u které se zjišťuje, zda je v zadaném rozmezí či nikoliv.


Porovnávání hodnot

Pro porovnávání dvou hodnot slouží v v NXT-G programový blok NumericComparisonDragged Compare, který je umístěn v paletě Paleta Complete Complete > DataOperations Data.

 

Compare blok

 

Programový blok NumericComparisonDragged Compare obsahuje celkem tři konektory pro propojení s dalšími bloky:

A A - první hodnota sloužící k porovnání.

B B - druhá hodnota sloužící k porovnání.

 genericLogic Result - výsledek porovnání.

 

Parametry bloku

Compare

Operation: sekce, ve které volíme nejprve operaci, kterou chceme provádět

- Less than - zjišťování, zda je číslo A nižší než číslo B,

- Greater than - zjišťování, zda je číslo A vyšší než číslo B,

- Equals - zjišťování, zda se číslo A a B rovnají či nikoliv.

V sekcích A a B zadáváme příslušné hodnoty. Výsledkem operace je logická hodnota, tedy True (Pravda) nebo False (Nepravda).

RobotC

Příkazy a metody

Rozcestník


Porovnání čísel nebo hodnot

V programovacím prostředí RobotC můžeme vyjadřovat vztah mezi hodnotami, proměnnými nebo výrazy pomocí následujících symbolů:

  • větší (>),
  • menší (<);
  • rovno (=).

 

Příklad porovnání proměnných

Pomocí uvedených symbolů můžeme řídit různé činnosti robota. Na příkladu můžete vidět jak pomocí vyjádření vztahu mezi dvěma proměnnými určujeme, co se bude či nebude provádět. Nadeklarovali jsme si dvě proměnné. První se jmenuje vzdalenost a ukládá se do ní hodnota zjištěná ultrazvukovým senzorem. Druhá se jmenuje bezpecna_vzdalenost a je v ní uložena maximální povolená vzdálenost, na kterou se může robot k překážce přiblížit. Jeho chování poté řídíme v podmínce if(). Jakmile bude vzdálenost větší než bezpečná vzdálenost (vzdalenost > bezpecna_vzdalenost), může se robot stále pohybovat kupředu. V opačném případě se zastaví.

 
if (vzdalenost > bezpecna_vzdalenost)
{
 motor[motorA]=50;
 motor[motorB]=50;
}
else
{
 motor[motorA]=0;
 motor[motorB]=0;
}
 

 

Příklad vyjádření intervalu

Jestliže potřebujeme v programování zajistit, aby se nějaký příkaz prováděl pouze při zjištění určitého rozpětí hodnot, použijeme opět symboly vyjadřující vztah mezi nimi. Níže můžete vidět příklad, ve kterém chceme, aby se žárovka světelné kostky rozsvítila v případě, že bude hodnota zjištěná světelným senzorem v rozmezí od 40 do 70. V podmínce tedy určíme, že příkaz bude prováděn v případě že hodnota bude větší než 40 (> 40) a zároveň také nižší než 70 (< 70). Potřebujeme, aby byly pro vykonání splněny obě tyto podmínky a proto použijeme logickou funkci AND. Jejím výsledkem je pravda v případě, že jsou splněny obě dvě podmínky. Příkaz tak nebude moci být vykonáván nikdy jindy, než jen v případě, že bude zjištěná hodnota v požadovaném rozmezí.

 
if (SensorValue(svetelny)>40 & SensorValue(svetelny)<70)
 {
 motor[motorA]=100; 
 }
 
 

1 1 1 1 1 1 1 1 1 1 Hodnocení 5.00 (1 hodnocení)

KURZ: Logické matematické operace

Logické operace jsou využívány v mnoha oborech. Setkáme se s nimi v číslicové technice, řídících systémech a také v programování. Při použití logické operace zpracováváme dva operandy, které jsou logického datového typu. Jejich hodnota tedy může být buď True (pravda) nebo False (nepravda). Často jsou také označovány jako logická 1 a logická 0. Výsledkem logické operace je opět člen logického datového typu. Pravidla pro výsledek logické operace nám určuje Booleova algebra. Nejčastěji používané logické operace v programování jsou AND (logický součin), OR (logický součet) a NOT (negace). Nyní se podíváme na jejich využití a implementaci v programovacích prostředích NXT-G a RobotC.

Využití logických operací V PROGRAMOVACÍM PROSTŘEDÍ

NXT-G

Blok pro použití logických operací

Rozcestník


UMÍSTĚNÍ BLOKU

K použití logický matematických operací slouží v NXT-G programový blok BooleanOperationDragged Logic, který je umístěn v paletě Paleta Complete Complete > DataOperations Data.

logic block

 

POPIS BLOKU

Programový blok  BooleanOperationDragged Logic obsahuje dva vstupní a tři výstupní konektory:

A A - levý operand logické funce.

B B - pravý operand logické funce.

 genericLogic Result - konektor vyjadřující výsledek operace.

 

PARAMETRY BLOKU

logic parametry 

Operation: sekce, ve které volíme konkrétní logickou operaci, která se bude provádět. Blok BooleanOperationDragged Logic umožňuje provádět operace: 

  • And (logický součin),
  • Or (logický součet),
  • XOr (exkluziv Or),
  • Not (negace).

V poli pod sekcí Operation si volíme, jakou logickou hodnotu mají mít jednotlivé operandy (True nebo False).

 

Logické funkce využívané v NXT-G

And

Výsledkem operace je True (pravda) pouze v případě, že oba operandy nabývají hodnoty True (pravda).

Vstup A Vstup B Výstup
0 0 0
0 1 0
1 0 0
1 1 1

 

Or

Výsledkem operace je True (pravda) právě tehdy, když alespoň jeden operand nabývá hodnoty True (pravda).

Vstup A Vstup B Výstup
 0 0
 0
 1
 1

 

XOr

Výsledkem operace je True (pravda) pouze v případě, že je pouze jeden z operandů roven True (pravda).

Vstup A Vstup B Výstup
 0
 0
 1
 1

 

Not

Logická funkce Not je negací vstupu. Výsledkem je tedy obrácená hodnota.

Vstup Výstup
1 0
0 1

 

RobotC

Příkazy a metody pro logické operace

V programovacím prostředí RobotC se logické operace zapisují pomocí speciálních symbolů. Využít zde můžeme následující tři:

  • AND (&),
  • OR (|),
  • Exkluziv OR (^).

Rozcestník


Praktické použití

Význam logický operací v programování si vysvětlíme na jednoduchém příkladu. Nadeklarujeme si dva dotykové senzory a budeme jimi ovládat dva motory za použití logických funkcí.

AND

Výsledkem operace je True (pravda) pouze v případě, že oba operandy nabývají hodnoty True (pravda).

Vstup A Vstup B Výstup
0 0 0
0 1 0
1 0 0
1 1 1

 

V případě, že použijeme logickou funkci AND pro vyjádření vztahu dvou příkazů zjistíme, že vzhledem k jejímu definování se motory spustí pouze v případě, že budou stisknuta obě dvě tlačítka. 

 
while(SensorValue(dotykovy) == 1 & SensorValue(dotykovy2) == 1) 
 {
 motor[motorB]=50;
 motor[motorC]=50;
 }
 

 

OR

Výsledkem operace je True (pravda) právě tehdy, když alespoň jeden operand nabývá hodnoty True (pravda).

Vstup A Vstup B Výstup
 0 0
 0
 1
 1

 

Pokud pro stejný příklad použijeme logickou funkci OR, postačí k roztočení motorů stisknutí pouze jediného tlačítka.

 
while(SensorValue(dotykovy) == 1 | SensorValue(dotykovy2) == 1) 
 {
 motor[motorB]=50;
 motor[motorC]=50;
 }
 

 

ExkluzivOR

Výsledkem operace je True (pravda) pouze v případě, že je pouze jeden z operandů roven True (pravda).

Vstup A Vstup B Výstup
 0
 0
 1
 1

 

V případě, že použijeme funkci ExkluzivOR, motory se roztočí pouze v případě, že bude stisknuté pouze jedno tlačítko. V ostatních případech zůstanou v klidu.

 
while(SensorValue(dotykovy) == 1 ^ SensorValue(dotykovy2) == 0) 
 {
 motor[motorB]=30;
 motor[motorC]=50;
 }
 

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

KURZ: Matematické operace

Seznam článků kapitoly

  1. Logické matematické operace
  2. Sčítání, odčítání, násobení a dělení
  3. Kontrola intervalů
  4. Goniometrické a pokročilé matematické funkce
  5. Náhodná čísla

Úvod

V některých případech potřebujeme při programování rozhodnout, jaký je vztah mezi dvěma výrazy či proměnnými. K tomuto účelu můžeme použít Logické matematické operace. Stejnojmenný článek popisuje nejčastěji používané operace v obou programovacích prostředích spolu s praktickými ukázkami.

Sčítání, odčítání, násobení a dělení jsou základní matematické operace, které v programování využijeme. V této kapitole naleznete pravidla pro jejich využití spolu s příslušnou syntaxí. Všechny operace jsou navíc doplněny o praktické rady a ukázky, které by vám měly v začátcích práci s matematickými operacemi usnadnit.

Porovnávání hodnot uložených v proměnných, konstantách nebo zjištěných senzory používáme v programování velmi často. Některé úkony robota budeme chtít provádět pouze v určité situaci nebo v případě zjištění určitého rozpětí hodnot. V kapitole Kontrola intervalů se dozvíte, jakým způsobem se v programovacích prostředích provádí porovnávání hodnot a vyjadřování jejich rozpětí neboli intervalů.

Při programování robotické stavebnice nebudeme provádět pouze základní matematické operace, ale při vytváření složitějších programových konstrukcí a výpočtů také goniometrické, cyklometrické a další funkce. Jedná se například o programy, ve kterých budeme počítat s úhly a základní matematické operace by nám zde nevystačily. O těchto funkcích pojednává kapitola Goniometrické a pokročilé matematické funkce.

Generování Náhodných čísel není v programování tak často využívané, můžeme ho ovšem použít pro generování hodnot, které budou robotovi zasílány a budou tak ovlivňovat jeho chování, které bude předem nespecifikované. Můžeme tak ovlivnit směr, kterým se vydá poté, co zjistí, v jakém prostoru před ním nestojí žádná překážka. Robot následně náhodně zvolí směr, kterým se rozjede.

1 1 1 1 1 1 1 1 1 1 Hodnocení 3.00 (4 hodnocení)

KURZ: Goniometrické a pokročilé matematické funkce

Pomocí základních matematických operací sice můžeme řešit většinu jednodušších úloh, někdy nám však k řešení již nepostačují. Jedním z příkladů může být konstrukce radaru. Ten se postupně otáčí a přitom snímá své okolí. Při odhalení překážky zjistí její vzdálenost a překážku pak vykreslí na displeji. Pro vykreslení tohoto bodu však potřebujeme převést zjištěnou vzdálenost a úhel natočení na souřadnice X a Y použité na displeji. Potřebujeme goniometrické funkce.

Mezi základní goniometrické funkce patří sinus (sin) a kosinus (cos). Z jejich poměru (sin(x)/cos(x)) pak můžeme vypočítat funkci tangens (tan či tg). Pokud Vám tyto funkce již příliš neříkají, můžete si jejich definice oživit na wikipedii.

Dalšími funkcemi jsou funkce cyklometrické, arkus sinus (asin), arkus kosinus (acos) a arkus tangens (atan). Cyklometrické funkce jsou funkce inverzní k jejich goniometrickým obrazům. Tyto funkce se využívají při složitějším systému řízení, takže běžně na ně příliš nenarazíte.

Použití rozšiřujících matematických operací v programovacím prostředí

NXT-G

Instalace rozšiřujících modulů

V základní nainstalované verzi prostředí NXT-G příliš podpory pro rozšiřující matematické funkce nenajdeme. V rámci modulu Math, který jsme si představili v předchozí kapitole, nalezneme pouze funkci absolutní hodnoty (Absolute Value) a druhé odmocniny (Square Root).

Pro goniometrické funkce je potřeba podporu nejprve doinstalovat. Návod na instalaci jednotek naleznete zde. Podporu pro goniometrické  funkce sinus a kosinus a cyklometrickou funkci arcus tangens připravila firma HiTechnic. Rozšiřující blok HiTechnic Sin/Cos Math a HiTechnic ATan2 Math si můžete stáhnout z oficiálního webu výrobce či z těchto stránek (Sin/Cos, ATan2).

Rozcestník


Umístění bloku HTSinCos

Goniometrické operace můžeme využít díky bloku Data HTSinCos. Ten je standardně umístěn v paletě Paleta Complete Complete > DataOperations Data, záleží však na instalaci.

Blok HTSinCos

Ten obsahuje jeden vstup # [Angle] určující úhel udávaný v radiánech či stupních a dva výstupy # [Sin(Angle)], vracející sinus zadaného úhlu a # [Cos(Angle)], vracející kosinus. Využít můžeme dle potřeby buďto jeden či oba výstupy.

 

Parametry bloku

NXT-G Panel goniometrických funkcí

Podle zvoleného typu jednotek (Units) bude blok vypočítávat sin a cos úhlu udaného buďto ve stupních (Degrees), nebo úhlu zadaného v radiánech (Radians).

Potřebujeme-li použít konkrétní předem danou hodnotu úhlu, nemusíme využívat konstanty, ale danou hodnotu můžeme doplnit do kolonky Angle (viz použití bloku Math).


Umístění bloku HTATan2

Pomocí bloku Data HTATan2 můžeme spočítat úhel odchylky polopřímky vycházející z počátku souřadnicového systému a procházející bodem X, Y s osou x. Pokud je úhel ve směru hodinových ručiček (nachází se pod osou x), bude kladný, pokud je proti směru (nachází se pod osou x), bude záporný. Podle nastavení jednotek (Units) bude pro stupně (Degrees) v rozsahu (-180; 180>, pro radiány (Radians) v rozsahu (-π; π>.

Blok je standardně umístěn v paletě Paleta Complete Complete > DataOperations Data, záleží však na instalaci.

Blok HTATan2

Ten obsahuje dva vstupy # X a # Y určující souřadnice bodu (viz výše) a jeden výstup # vracející úhel dle pravidel udávaný dle volby v radiánech či stupních.

Parametry bloku

NXT-G Panel cyklometrických funkcí

Jednotky výstupu bloku (Units) lze zvolit buďto ve stupních (Degrees), nebo radiánech (Radians).

Vstupní hodnotami jsou data # X a # Y udávající souřadnice bodu jimiž prochází pomyslná polopřímka vycházející z počátku souřadnicového systému. Hodnoty lze buďto získat z externích připojených zdrojů či je můžeme přímo zadat jako parametr bloku.

RobotC

Příkazy a metody

Podpora pokročilejších matematických funkcí je v jazyku RobotC o poznání komplexnější. V základní instalaci máme k dispozici celou řadu goniometrických a cyklometrických funkcí, nechybí ani absolutní hodnota, mocniny a druhá odmocnina.

Rozcestník


Goniometrické funkce

Goniometrické funkce lze v prostředí RobotC vypočítávat pro hodnoty úhlu zadaných ve stupních či v radiánech. Podle zvolené soustavy se liší i názvy jednotlivých příkazů.

Goniometrické funkce v radiánech

Funkce využívající základní syntax pracují s radiány. Jejich názvy jsou sin(úhel) a cos(úhel). Funkci tangens tg() mám programovací jazyk sice nenabízí, ale můžeme ji vypočíst jako výsledek podílu funkcí sin(úhel)/cos(úhel). Podívejme se na ukázku jejich použití:

RobotC - goniometrické funkce (v radiánech)

Goniometrické funkce ve stupních 

Potřebujeme-li vypočítat hodnoty pro úhly zadané ve stupních, použijeme funkce s alternativními názvy doplněné o Degrees, sinDegrees() a cosDegrees(). Zadání je pak následující:

RobotC - goniometrické funkce (ve stupních)

Převod mezi stupni a radiány 

Pomocí funkcí radiansToDegrees(hodnota)degreesToRadians(hodnota) lze stupně a radiány převádět navzájem mezi sebou.

RobotC - převod mezi stupni a radiány

Goniometrické funkce ve výrazech 

Goniometrické funkce (i ostatně jiné funkce) lze využít i přímo ve výpočtech matematických výrazů. V následujícím segmentu kódu vidíte využití funkcí sinus a kosinus pro výpočet souřadnic překážky zachycené radarem na displeji.

RobotC - goniometrické funkce ve výrazech


Cyklometrické funkce 

I pro cyklometrické funkce nalezneme širokou podporu. Kromě funkce atan(hodnota) - arkus tanges, jíž lze rozšířit i prostředí NXT-G se v jazyce RobotC nachází arkus sinus asin(hodnota) a arkus kosinus acos(hodnota)

RobotC - cyklometrické funkce

Speciální funkcí je funkce atan2(X,Y). Ta umožňuje spočítat úhel odchylky polopřímky vycházející z počátku souřadnicového systému a procházející bodem X, Y s osou x. Výsledný úhel je v radiánech a odpovídá funkci atan(Y/X).


Mocnina

Pro výpočet mocniny používáme funkci pow(base, exponent). Ta má dva parametry, prvním je základ (base) a druhým mocnina (exponent). Parametry odpovídají vztahu základmocnina (baseexponent). Potřebujeme-li tedy vypočítat 24, bude základem číslo 2 a mocninou číslo 4.

Ukázka použití druhé mocniny:

RobotC - druhá mocnina

Ukázka použití n-té (4) mocniny:

RobotC - n-tá mocnina


Exponenciala se základem e

Pro výpočet hodnot exponencialy se základem e slouží funkce exp(mocnina). Ta odpovídá vyjádření emocnina.

RobotC - Exponent


Odmocnina

Pro druhou odmocninu lze použít funkci sqrt(hodnota), viz ukázka.

RobotC - odmocnina

Zdálo by se, že tímto podpora odmocnin v prostředí končí a že např. 4. odmocninu již získat neumíme. Je nutno si ale uvědomit vztah mezi odmocninou a mocninou, kdy lze odmocnění realizovat jako umocnění převrácenou hodnotou (viz ukázka).

RobotC - N-tá odmocnina


Logaritmy

V prostředí RobotC můžeme pracovat s přirozenými i dekadickými logaritmy. Pro výpočet přirozeného logaritmu z čísla nám slouží funkce log(hodnota), pro dekadický logaritmus pak log10(hodnota).

RobotC - logaritmy


Absolutní hodnota

RobotC - absolutní hodnota 


Znaménko

Zajímavou funkcí je funkce sgn(hodnota). Ta nám vrací informaci, zda do ní vložené číslo je záporné (výstupní hodnota -1), nulové (výstupní hodnota 0) či kladné (výstupní hodnota 1). Využití této funkce může být např. u určení směru pohybu modelu, kdy nám tato funkce říká, zda je to směr vpřed, vzad či zda má model stát.

RobotC - Hodnota znaménka 


Import z knihovny funkcí

Pokud si nepamatujeme názvy klíčových slov vykonávajících matematické funkce, můžeme je nalézt v knihovně funkcí (Function Library) sekci Math.

Po přetažení položek v sekcích Commands do programového okna dojde ke vložení námi zvolené funkce.

1 1 1 1 1 1 1 1 1 1 Hodnocení 5.00 (1 hodnocení)