ˇ ´ vysoke ´ uc ˇen´ı technicke ´ v Praze Cesk e ´ Fakulta elektrotechnicka ˇ´ıdic´ı techniky Katedra r
´ RSK ˇ ´ PRACE ´ BAKALA A Vyuˇ zit´ı robota LEGO MINDSTORMS pˇ ri v´ yuce pˇ redmˇ etu A3B99RO Roboti
Praha, 2010
Autor: Dan Martinec
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem svou bakal´aˇrskou pr´aci vypracoval samostatnˇe a pouˇzil jsem pouze podklady (literaturu, projekty, SW atd.) uveden´e v pˇriloˇzen´em seznamu.
V Praze dne
podpis
I
Podˇ ekov´ an´ı T´ımto bych chtˇel podˇekovat vedouc´ımu bakal´aˇrsk´e pr´ace Ing. Martinu Hlinovsk´emu Ph.D. za poskytnut´ı pˇr´ıpravk˚ u k u ´loh´am a zap˚ ujˇcen´ı LEGO set˚ u. D´ale dˇekuji sv´ ym rodiˇc˚ um za jejich l´asku, trpˇelivost a porozumˇen´ı a tak´e za to, ˇze jsou tˇemi nejskvˇelejˇs´ımi rodiˇci, kter´e si dovedu pˇredstavit. Rovnˇeˇz dˇekuji sv´ ym bratr˚ um, kteˇr´ı jsou a z˚ ustanou nejen m´ ymi vzory, ale i tˇemi nejlepˇs´ımi pˇr´ateli.
Nevdˇeˇcn´y je ten, kdo vrac´ı dobrodin´ı bez u ´roku. Seneca
II
Abstrakt Tato pr´ace pojedn´av´a o vyuˇzit´ı LEGO MINDSTORMS pˇri v´ yuce pˇredmˇetu A3B99RO Roboti. Seznamuje s moˇznostmi vyuˇzit´ı stavebnice a podrobnˇe rozeb´ır´a programov´an´ı robota v prostˇred´ı LeJOS-NXJ. D´av´a instrukce jak prov´est instalaci a na nˇekolika pˇr´ıkladech ukazuje z´akladn´ı funkce, kter´e toto prostˇred´ı nab´ız´ı. Souˇc´ast´ı pr´ace je i n´avrh a ˇreˇsen´ı dvou u ´loh, kter´e mohou b´ yt pouˇzity jako semestr´aln´ı u ´lohy pro zm´ınˇen´ y pˇredmˇet. Z´avˇereˇcn´a ˇca´st pr´ace se vˇenuje webov´ ym str´ank´am, kter´e budou pˇrid´any k existuj´ıc´ım str´ank´am k tomuto pˇredmˇetu.
III
Abstract This thesis discusses the usage of LEGO MINDSTORMS as a teaching tool in the lecture course A3B99RO Robots. It introduces the basic features of this robotics kit and explains in details programming of the robot in the environment LeJOS-NXJ. It gives the instructions of how to install the programming environment for LEGO MINDSTORMS on a PC and shows the basic functions offered by this environment. A part of this thesis is devoted to the designs of two projects and their solutions. The projects can be assigned as a term assignements in the course. The final part deals with constructing web pages on the thesis subject that will be included to the current web pages on this course.
IV
V
Obsah Seznam obr´ azk˚ u
VIII
Seznam tabulek
X
1 Hardwarov´ e vybaven´ı
1
1.1
Inteligentn´ı NXT kostka . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.2
Senzory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.2.1
Dotykov´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.2.2
Svˇeteln´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.2.3
Ultrazvukov´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.2.4
Zvukov´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
NXT Motor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.3
2 Programov´ an´ı robota
7
2.0.1
V´ yhody . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.0.2
Nev´ yhody . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.1
N´avod na instalaci . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.2
Kompilace a nahr´an´ı programu do NXT . . . . . . . . . . . . . . . . . .
10
2.3
Pˇr´ıkazov´a ˇra´dka . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
2.4
V´ yvojov´e prostˇred´ı NetBeans . . . . . . . . . . . . . . . . . . . . . . . .
11
2.5
Z´akladn´ı pˇr´ıkazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.5.1
Nˇekolik z´akladn´ıch pˇr´ıkaz˚ u . . . . . . . . . . . . . . . . . . . . . .
17
2.5.2
Pˇr´ıklad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
Pokroˇcilejˇs´ı pˇr´ıkazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.6.1
Nˇekolik pokroˇcilejˇs´ıch pˇr´ıkaz˚ u . . . . . . . . . . . . . . . . . . . .
18
2.6.2
Pˇr´ıklady . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
Pˇr´ıkazy ovl´adaj´ıc´ı senzory . . . . . . . . . . . . . . . . . . . . . . . . . .
22
2.6
2.7
VI
2.7.1
Dotykov´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
2.7.2
Svˇeteln´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.7.3
Ultrazvukov´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . .
25
2.7.4
Zvukov´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3 Soutˇ eˇ zn´ı u ´ lohy ´ 3.1 Uloha: Sledov´an´ı ˇc´ary s kˇr´ıˇzen´ım . . . . . . . . . . . . . . . . . . . . . .
27
3.1.1
Pravidla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
27
3.1.2
Pl´an soutˇeˇze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
3.1.3
Hardwarov´e ˇreˇsen´ı u ´lohy . . . . . . . . . . . . . . . . . . . . . . . ˇ sen´ı v programovac´ım prostˇred´ı NXC . . . . . . . . . . . . . . Reˇ ˇ sen´ı v programovac´ım prostˇred´ı LeJOS NXJ . . . . . . . . . . . Reˇ
29
3.1.4 3.1.5 3.2
27
30 34
3.1.6 V´ ysledek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ´ Uloha: Skladiˇstˇe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.2.1
Pravidla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.2.2
Pl´an soutˇeˇze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
3.2.3
Hardwarov´e ˇreˇsen´ı u ´lohy . . . . . . . . . . . . . . . . . . . . . . .
41
3.2.4
44
3.2.6
Program´atorsk´e ˇreˇsen´ı . . . . . . . . . . . . . . . . . . . . . . . . ˇ sen´ı v programovac´ım prostˇred´ı NXC . . . . . . . . . . . . . . Reˇ ˇ sen´ı v programovac´ım prostˇred´ı LeJOS NXJ . . . . . . . . . . . Reˇ
3.2.7
V´ ysledek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
50
3.2.5
4 Webov´ e str´ anky
38
47 49
51
4.1
Webov´a str´anka: N´avod pro JAVA LeJOS . . . . . . . . . . . . . . . . .
51
4.2
Webov´a str´anka: Sledov´an´ı ˇc´ary s kˇr´ıˇzen´ım . . . . . . . . . . . . . . . . .
52
4.3
Webov´a str´anka: Skladiˇstˇe . . . . . . . . . . . . . . . . . . . . . . . . . .
52
5 Z´ avˇ er
53
Literatura
55
A Pˇ r´ıloha CD
i
VII
Seznam obr´ azk˚ u 1.1
NXT inteligentn´ı kostka . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
1.2
Dotykov´ y senzor
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
1.3
Svˇeteln´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.4
Ultrazvukov´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
1.5
Zvukov´ y senzor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.6
NXT motor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.7
Sch´ema NXT motoru . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.8
PWM sign´al pro 35% u ´roveˇ n. . . . . . . . . . . . . . . . . . . . . . . . .
5
1.9
Princip rotaˇcn´ıho senzoru . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.1
Flash firmware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.2
Nov´e okno na konci flashov´an´ı . . . . . . . . . . . . . . . . . . . . . . . .
10
2.3
Uk´azka pouˇzit´ı pˇr´ıkaz˚ u nxjc a nxj . . . . . . . . . . . . . . . . . . . . . .
11
2.4
Uk´azka pˇrid´an´ı pluginu NXJ do NetBeans . . . . . . . . . . . . . . . . .
12
2.5
Uk´azka vytvoˇren´ı NXJ projektu v NetBeans . . . . . . . . . . . . . . . .
13
2.6
Pˇrid´an´ı bal´ıku classes.jar do projektu v NetBeans . . . . . . . . . . . . .
14
2.7
Adres´aˇr NetBeans projektu . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.8
Build.properties pˇred zmˇenou . . . . . . . . . . . . . . . . . . . . . . . .
15
2.9
Build.properties po zmˇenˇe . . . . . . . . . . . . . . . . . . . . . . . . . .
15
2.10 Pˇridan´a knihovna . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
3.1
Soutˇeˇz´ı dr´aha pro u ´lohu Sledov´an´ı ˇca´ry s kˇr´ıˇzen´ım . . . . . . . . . . . . .
29
3.2
Konstrukce robota pro Sledov´an´ı ˇca´ry . . . . . . . . . . . . . . . . . . . .
30
3.3
V´ yvojov´ y diagram pro koncept Sledov´an´ı ˇca´ry . . . . . . . . . . . . . . .
33
3.4
V´ yvojov´ y diagram pro ”Zig-Zag”koncept . . . . . . . . . . . . . . . . . .
36
3.5
Soutˇeˇz´ı dr´aha pro u ´lohu Skladiˇstˇe . . . . . . . . . . . . . . . . . . . . . .
40
3.6
Fotografie soutˇeˇzn´ı dr´ahy pro u ´lohu Skladiˇstˇe . . . . . . . . . . . . . . .
41
3.7
Konstrukce robota v u ´loze ”Skladiˇstˇe”var.1. Poloha = rameno nahoˇre . .
42
VIII
3.8
Konstrukce robota v u ´loze ”Skladiˇstˇe”var.1. Poloha = rameno dole
. . .
42
3.9
Konstrukce robota v u ´loze ”Skladiˇstˇe”var.2. Poloha = rameno nahoˇre . .
43
3.10 Konstrukce robota v u ´loze ”Skladiˇstˇe”var.2. Poloha = rameno dole
. . .
44
3.11 V´ yvojov´ y diagram pro skladiˇstˇe . . . . . . . . . . . . . . . . . . . . . . . 3.12 V´ yvojov´ y diagram pro ”Jed’ k ˇca´ˇre” . . . . . . . . . . . . . . . . . . . . .
46 46
3.13 V´ yvojov´ y diagram pro ”Odvez objekt do skladovac´ıho prostoru” . . . . . 3.14 V´ yvojov´ y diagram pro ”Jed’ ke stˇenˇe” . . . . . . . . . . . . . . . . . . . .
47
4.1
52
Uk´azka webov´e str´anky o n´avodu pro JAVA LeJOS . . . . . . . . . . . .
IX
47
Seznam tabulek 2.1
Pˇrehled programovac´ıch prostˇredk˚ u . . . . . . . . . . . . . . . . . . . . .
7
2.2
Promˇenn´e prostˇred´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
2.3
Z´akladn´ı pˇr´ıkazy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.4
Pˇrehled nejd˚ uleˇzitˇejˇs´ıch metod tˇr´ıdy Pilot
. . . . . . . . . . . . . . . . .
20
2.5
Pˇrehled nejd˚ uleˇzitˇejˇs´ıch pˇr´ıkaz˚ u tˇr´ıdy SimpleNavigator . . . . . . . . . .
21
X
Kapitola 1 Hardwarov´ e vybaven´ı Hardwarov´e vybaven´ı stavebnice LEGO Mindstorms je pomˇernˇe rozs´ahl´e. V z´akladn´ım balen´ı LEGO Mindstorms NXT najdeme n´asleduj´ıc´ı souˇc´astky: • Inteligentn´ı NXT kostku • Dva dotykov´e senzory • Jeden ultrazvukov´ y senzor • Jeden svˇeteln´ y senzor • Tˇri interaktivn´ı servomotory s rotaˇcn´ımi senozory pro pˇresnˇejˇs´ı ˇr´ızen´ı • Sedm ˇsesti ˇz´ılov´ ych spojovac´ıch kabel˚ u typu RJ-12 Nyn´ı tento hardware pop´ıˇseme podrobnˇeji.
1
´ VYBAVEN´I KAPITOLA 1. HARDWAROVE
1.1
2
Inteligentn´ı NXT kostka
Obr´azek 1.1: NXT inteligentn´ı kostka NXT kostka je z´akladn´ı ˇr´ıd´ıc´ı jednotkou robota. Obsahuje 32-bitov´ y procesor, bˇeˇz´ıc´ı na frekvenci 48MHz s 256KB flash pamˇeti a 64KB RAM pamˇeti. V´ yhoda t´eto flash pamˇeti je v tom, ˇze do n´ı m˚ uˇzeme nahr´at nˇekolik soubor˚ u (program˚ u), kter´e v n´ı z˚ ustanou uloˇzeny i po vypnut´ı NXT kostky. Pro nahr´an´ı programu do NXT kostky m˚ uˇzeme vyuˇz´ıt konektor USB 2.0 nebo bezdr´atov´ y pˇrenos pomoc´ı technologie Bluetooth. Pro pˇripojen´ı k jednotliv´ ym motor˚ um jsou k dispozici 3 v´ ystupn´ı porty oznaˇcen´e A, B a C. V´ ystupn´ı sign´al do motoru je sign´al PWM, kter´ ym ˇr´ıd´ıme napˇet´ı dod´avan´e do motoru. NXT kostka je vybavena ˇctyˇrmi vstupn´ımi porty, do kter´ ych se nechaj´ı pˇripojit jednotliv´e senzory. Pro zobrazov´an´ı zpr´av uˇzivateli je pouˇzit maticov´ y LCD displej s rozmˇery 100x64 pixel˚ u.
1.2
Senzory
Senzor je jednou z nejd˚ uleˇzitˇejˇs´ıch komponent kaˇzd´eho robota. Pomoc´ı senzor˚ u m˚ uˇze robot v re´aln´em ˇcase pˇr´ıjimat informace ze sv´eho okol´ı a n´aslednˇe na nˇe reagovat. Robot
´ VYBAVEN´I KAPITOLA 1. HARDWAROVE
3
se tak m˚ uˇze st´at ˇc´asteˇcnˇe nebo plnˇe autonomn´ı. Autonomn´ı robot je takov´ y robot, kter´ y se podle pˇrijat´eho sign´alu s´am rozhodne, jak se m´a zachovat. V z´akladn´ım balen´ı LEGO Mindstorms NXT nalezneme n´asleduj´ıc´ı typy senzor˚ u.
1.2.1
Dotykov´ y senzor
Jedn´a se o nejjednoduˇsˇs´ı senzor stavebnice. V´ ystup je dvoustavov´ y. Pokud je oranˇzov´a pohybliv´a ˇc´ast senzoru stlaˇcena, tak v´ ystup odpov´ıd´a stavu stlaˇceno. V opaˇcn´em pˇr´ıpadˇe je v´ ystup ve stavu nestlaˇceno. Tento senzor je v´ yhodn´e pouˇz´ıt jako n´arazn´ık, kter´ y bude detekovat pˇrek´aˇzky, na kter´e senzor naraz´ı.
Obr´azek 1.2: Dotykov´ y senzor
1.2.2
Svˇ eteln´ y senzor
Svˇeteln´ y senzor mˇeˇr´ı svˇetelnou intenzitu. Obsahuje ˇcervenou LED diodu, kterou je moˇzn´e vyuˇz´ıt jako zdroj svˇetla, a d´ale fototranzistor pro sn´ım´an´ı intenzity svˇetla. Jedn´ım z podstatn´ ych rozd´ıl˚ u oproti dotykov´emu senzoru je skuteˇcnost, ˇze v´ ystup nen´ı pouze dvoustavov´ y, ale hodnota v rozsahu od 0 do 1023. Zd˚ uraznˇeme, ˇze senzor nevn´ım´a barvy jako lidsk´e oko, ale pouze mˇeˇr´ı svˇetelnou intenzitu. Barvu povrchu senzor zjist´ı d´ıky tomu, ˇze kaˇzd´a barva odr´aˇz´ı jin´e mnoˇzstv´ı svˇeteln´e intenzity. Dalˇs´ı zaj´ımavou vˇec´ı je, ˇze fototranzistor um´ıstˇen´ y v senzoru, je mnohem citlivˇejˇs´ı na infraˇcerven´e z´aˇren´ı neˇz lidsk´e oko. Jeho viditeln´e spektrum je od 400 nm do 1150 nm. Svˇeteln´ y senzor je zvl´aˇstˇe uˇziteˇcn´ yvu ´loze ”sledov´an´ı ˇca´ry”.
´ VYBAVEN´I KAPITOLA 1. HARDWAROVE
4
Obr´azek 1.3: Svˇeteln´ y senzor
1.2.3
Ultrazvukov´ y senzor
Ultrazvukov´ y senzor je jeden z nejuˇziteˇcnˇejˇs´ıch senzor˚ u, kter´e ve stavebnici najdeme. Umoˇzn ˇujeme mˇeˇrit vzd´alenost k objektu, na kter´ y je nasmˇerov´an. Princip je n´asleduj´ıc´ı. Senzor vyˇsle ultrazvukov´ y sign´al na frekvenci 40 kHz, kter´ y lidsk´e ucho nezaznamen´a. Ten se odraz´ı od pˇrek´aˇzky zpˇet k senzoru, kter´ y sign´al zachyt´ı a na z´akladˇe jeho doby ˇs´ıˇren´ı vypoˇc´ıt´a vzd´alenost k objektu. Poznamenejme, ˇze pomoc´ı stejn´eho principu se orientuj´ı mnoh´a zv´ıˇrata v pˇr´ırodˇe, napˇr. netop´ yˇri ˇci delf´ıni. Senzor je schopen zmˇeˇrit vzd´alenost od 0 cm do 250 cm s pˇresnost´ı +/- 3 cm. Tento senzor se pˇredevˇs´ım uplatn´ı ve chv´ıli, kdy je potˇreba vyhnout se pˇrek´aˇzk´am na trati.
Obr´azek 1.4: Ultrazvukov´ y senzor
1.2.4
Zvukov´ y senzor
Pomoc´ı zvukov´eho senzoru m˚ uˇzeme mˇeˇrit r˚ uzn´e u ´rovnˇe hlasitosti zvuku v decibelech (dB). Rozsah senzoru je < 0, 90 dB >.
´ VYBAVEN´I KAPITOLA 1. HARDWAROVE
5
Obr´azek 1.5: Zvukov´ y senzor
1.3
NXT Motor
NXT motor je v mnoh´em lepˇs´ı oproti starˇs´ım LEGO motor˚ um. Stejnosmˇern´e motory vyuˇz´ıvaj´ı napˇet´ı 9V a mohou poh´anˇet otoˇcnou ˇca´st motoru rychlost´ı aˇz 1500 ot´aˇcek za minutu. Aby NXT motor dok´azal udrˇzet i pomalejˇs´ı rychlost, tak vyuˇz´ıv´a syst´em nˇekolika ozuben´ ych kol, kter´e funguj´ı jako pˇrevody.
Obr´azek 1.6: NXT motor
Obr´azek 1.7: Sch´ema motoru
NXT
Rychlost motoru ovl´ad´ame pulzn´ı ˇs´ırkovou modulac´ı (PWM). Pomoc´ı tohoto sign´alu se ˇr´ıd´ı pr˚ umˇern´e napˇet´ı, kter´ ym se nap´aj´ı motor. Na obr´azku 1.8 vid´ıme pr˚ ubˇeh PWM sign´alu pro 35% u ´roveˇ n dod´avan´e energie.
Obr´azek 1.8: PWM sign´al pro 35% u ´roveˇ n
´ VYBAVEN´I KAPITOLA 1. HARDWAROVE
6
Dalˇs´ı d˚ uleˇzit´a souˇc´ast motoru je rotaˇcn´ı senzor, kter´ y umoˇzn ˇuje velmi pˇresn´e otoˇcen´ı a t´ım i pˇresn´ y pohyb robota. Princip rotaˇcn´ıho senzoru je n´asleduj´ıc´ı. LED dioda emituje infraˇcerven´e paprsky svˇetla, kter´e proch´azej´ı skrz kotouˇc spojen´ y s motorem. Na kotouˇci jsou pravidelnˇe rozm´ıstˇeny ˇstˇerbiny, kter´e propouˇstˇej´ı svˇetlo. Za ˇstˇerbinami jsou um´ıstˇeny fototranzistory, kter´e detekuj´ı svˇetlo a podle impulz˚ u, kter´e takto vznikaj´ı, lze urˇcit o kolik se motor otoˇcil.
Obr´azek 1.9: Princip rotaˇcn´ıho senzoru
Kapitola 2 Programov´ an´ı robota NXT kostku m˚ uˇzeme programovat v mnoha r˚ uzn´ ych jazyc´ıch. Jejich hlavn´ı odliˇsnosti popisuje tabulka 2.1 NXT-G
NXC
RobotC
Jazyk
Grafick´ y
Notexactly C
C
Platforma
Windows, MAC OS
Windows
IDE
Ano
Windows, Linux, MAC OS Ano
V´ıcevl´aknov´e aplikace Obsluha ud´alost´ı Podpora datov´eho typu float Podpora Bluetooth
Ano
Ano
Ano
Ne
Ne
Ano
Ne
Ne
Ano
Ano
Ano
LeJOS NXJ JAVA
Windows, Linux, MAC OS plugin do Eclipse a NetBeans Ano
RWTH – Mindstorms NXT Toolbox Windows
Ano
Ano
Ano
Ano
Ano (JAVA events) Ano
Ano
Ano
Ano
Tabulka 2.1: Pˇrehled programovac´ıch prostˇredk˚ u D´ale se budeme vˇenovat prostˇred´ı LeJOS-NXJ.
7
Matlab
Ne
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
2.0.1
8
V´ yhody
• Mnoho pˇredpˇripraven´ ych metod, kter´e usnadˇ nuj´ı a urychluj´ı programov´an´ı. • Programovac´ı prostˇred´ı NetBeans, kter´e lze volnˇe st´ahnout na internetu. Pokud je nastaveno spr´avnˇe, tak jeho n´apovˇeda umoˇzn ˇuje pohodlnˇejˇs´ı psan´ı programu. • Moˇznost objektov´eho programov´an´ı ve standartn´ım jazyce JAVA. • Podpora v´ıce platforem. • Podpora datov´eho typu float. • Podpora obsluhy ud´alost´ı. • . . . a mnoho dalˇs´ıho na internetov´e str´ance [1].
2.0.2
Nev´ yhody
• Komplikovan´a instalace. • Nutnost z´akladn´ı znalosti programov´an´ı.
2.1
N´ avod na instalaci
1. Nainstalujte ovladaˇc na pˇripojen´ı NXJ pˇres USB rozhran´ı. Pokud jste nainstalovali software od LEGO Mindstorms, kter´ y se k legu pˇrikl´ad´a, tak se jiˇz tento ovladaˇc nainstaloval a tento krok se pˇreskoˇc´ı. Pokud nechcete instalovat software od LEGO Minstorms, tak lze ovladaˇc st´ahnout z webov´ ych str´anek [2]. 2. D´ale bude potˇreba m´ıt nainstalovan´ y Java Development Kit (JDK). Nejnovˇejˇs´ı JDK lze st´ahnout z webov´ ych str´anek [3]. Doporuˇcuje se m´ıt nainstalovanou alespoˇ n verzi JDK 1.6. Po instalaci se ujistˇete, ˇze se spr´avnˇe nastavily promˇenn´e prostˇred´ı. Ty zajist´ı, ˇze dalˇs´ı programy ”uvid´ı”, ˇze je jiˇz nainstalovan´ y JDK. Promˇenn´e prostˇred´ı m˚ uˇzete editovat v sekci Ovl´adac´ı panely → Syst´em → Upˇresnit → Promˇenn´e prostˇred´ı. Mˇely by b´ yt nastaveny takto:
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN Promˇ enn´ a Hodnota JAVA HOME Cesta k nainstalovan´emu JDK
Pˇ r´ıklad C:\Program Files\Java\jdk1.6.0 16
PATH
C:\Program Files\Java\jdk1.6.0 16\bin
Cesta k bin sloˇzce nainstalovan´eho JDK
9
Tabulka 2.2: Promˇenn´e prostˇred´ı
3. Nyn´ı je potˇreba st´ahnout LeJOS NXJ software. Ten lze st´ahnout z webov´e str´anky [4]. Po staˇzen´ı spust’te instalaˇcn´ı soubor a ˇrid’te se instrukcemi.
4. Po dokonˇcen´ı instalace se objev´ı okno, pomoc´ı kter´eho m˚ uˇzete do NXJ nahr´at nov´ y firmware. (Stejn´e okno m˚ uˇzete vyvolat pˇr´ıkazem nxjflashg.)
Obr´azek 2.1: Flash firmware
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
10
Ujistˇete se, ˇze NXT je pˇripojen pˇres USB k poˇc´ıtaˇci a stisknˇete tlaˇc´ıtko Start program 5. Po u ´spˇeˇsn´em flashnut´ı firmwaru se zobraz´ı nov´e okno (obr´azek 2.2) a na displeji NXT se bude pˇri spouˇstˇen´ı zobrazovat text LEJOS.
Obr´azek 2.2: Nov´e okno na konci flashov´an´ı
2.2
Kompilace a nahr´ an´ı programu do NXT
Programy pro NXT se p´ıˇsou v jazyce JAVA. Takov´e programy lze ps´at v jednoduch´em textov´em prohl´ıˇzeˇci a pot´e je pomoc´ı pˇr´ıkazov´e ˇra´dky pˇreloˇzit do JAVA form´atu. Alternativou je pouˇz´ıt v´ yvojov´e prostˇred´ı. T´ım se z´ısk´a soubor typu .java. Aby takov´ yto soubor mohl b´ yt nahr´an do NXT, je nutn´e ho zkompilovat (pˇrev´est .java do .nxt). Tato operace lze prov´est v´ıce zp˚ usoby, asi nejjednoduˇsˇs´ı je pouˇzit´ı pˇr´ıkazov´e ˇr´adky.
2.3
Pˇ r´ıkazov´ aˇ r´ adka
Existuj´ı 4 pˇr´ıkazy: nxjc, nxjlink, nxjupload, nxj nxjc soubor.java Zkompiluje se soubor.java. Vznikne soubor.class nxjlink soubor class -o soubor.nxj Zavol´a se leJOS NXJ linker. Ze souboru soubor class.class se vytvoˇr´ı soubor.nxj. Tento soubor se jiˇz m˚ uˇze nahr´at do NXT. nxjupload soubor.nxj Nahraje soubor.nxj do NXT. nxj -r soubor class Tento pˇr´ıkaz je kombinac´ı pˇredchoz´ıch dvou. Ze souboru soubor class.class vytvoˇr´ı soubor.nxj, kter´ y n´aslednˇe nahraje do NXT. Pokud je zapnut´ y pˇrep´ınaˇc -r, tak se tento nahran´ y program ihned po nahran´ı do NXT spust´ı.
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
11
Obr´azek 2.3: Uk´azka pouˇzit´ı pˇr´ıkaz˚ u nxjc a nxj
2.4
V´ yvojov´ e prostˇ red´ı NetBeans
Tento zp˚ usob je na nastaven´ı o nˇeco sloˇzitˇejˇs´ı, ale v´ yhoda je, ˇze pokud vˇse spr´avnˇe nastav´ıme, bude staˇcit kliknout na jedin´e tlaˇc´ıtko a kompilace, linkov´an´ı a nahr´an´ı do NXT kostky se provede najednou. V´ yvojov´e prostˇred´ı NetBeans, lze st´ahnout z internetov´ ych str´anek [5]. Nejdˇr´ıve je potˇreba do NetBeans nahr´at NXJ plugin. Ten najdete v m´ıstˇe, kam jste nainstalovali leJOSNXJProjects. Obvykle b´ yv´a ve sloˇzce Documents and settings. Plugin pot´e najdete v leJOSNXJProjects\NXJPlugin\build\nxjplugin.nbm. Do NetBeans tento plugin nainstalujete n´asleduj´ıc´ım zp˚ usobem. Kliknˇete na Tools → Plugins → Downloaded → Add Plugins a vyberte nxjplugin.nbm
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
12
Obr´azek 2.4: Uk´azka pˇrid´an´ı pluginu NXJ do NetBeans Po pˇrid´an´ı pluginu do NetBeans, je moˇzn´e vytv´aˇret NXJ projekt n´asleduj´ıc´ım zp˚ usobem. Kliknˇete na File → New Project → Samples → NXJ project → Next a urˇcete n´azev a m´ısto uloˇzen´ı projektu.
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
13
Obr´azek 2.5: Uk´azka vytvoˇren´ı NXJ projektu v NetBeans Nyn´ı je potˇreba do tohoto projektu zadat cestu k LeJOS bal´ıˇck˚ um, abychom mohli pracovat s LeJOS tˇr´ıdami a metodami. Nejdˇr´ıve pˇrid´ame bal´ıˇcek LeJOS do pr´avˇe vytvoˇren´eho projektu v NetBeans. Kliknˇete prav´ ym tlaˇc´ıtkem na n´azev projektu Properties → Java Sources Classpath → Add JAR/Folder → classes.jar. Soubor classes.jar najdete v adres´aˇri kam jste nainstalovali LeJOS NXJ, tedy obvykle v C:\Program Files\leJOS NXJ\lib\classes.jar
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
14
Obr´azek 2.6: Pˇrid´an´ı bal´ıku classes.jar do projektu v NetBeans T´ım jsme nastavili cestu pro projekt v NetBeans. Dalˇs´ı vˇec´ı, kterou je potˇreba nastavit je cesta k LeJOS bal´ıˇck˚ um pro build.xml, pomoc´ı kter´eho nahrav´ame program do NXT kostky. Abychom ji nastavili, tak mus´ıme otevˇr´ıt adres´aˇr, kam jsme uloˇzili n´aˇs NetBeans projekt. Mˇel by se zobrazit n´asleduj´ıc´ı adres´aˇr.
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
15
Obr´azek 2.7: Adres´aˇr NetBeans projektu Otevˇrete si soubor build.properties v textov´em editoru (staˇc´ı napˇr. program WordPad ). Na prvn´ım ˇra´dku je naps´ano nxj.home=../snapshot. Text za rovn´ıtkem zmˇen ˇte na cestu k adres´aˇri LeJOS NXJ. Prvn´ı ˇra´dek bude vypadat napˇr. takto nxj.home=C:/Program Files/leJOS NXJ (ujistˇete se, ˇze jste spr´avnˇe zadali lom´ıtka a ˇr´adek nekonˇc´ı mezerou).
Obr´azek 2.8: Build.properties pˇred zmˇenou
Obr´azek 2.9: Build.properties po zmˇenˇe
Jako posledn´ı vˇec je potˇreba do NetBeans pˇridat Javadoc (dokumentaci), aby se k´od psal l´epe. To se udˇel´a n´asleduj´ıc´ım zp˚ usobem. Kliknˇete na Tools → Libraries → New Library a pojmenujte ji LeJOS. Do sekce classpath pˇridejte stejnou tˇr´ıdu jako jste pˇridali do projektu na obr´azku 2.6. Do sekce Javadoc pˇridejte adres´aˇr ...\lejosNXJProjects\classes\doc
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
16
Obr´azek 2.10: Pˇridan´a knihovna Nyn´ı je vˇse nastaveno. Jednotliv´e akce (kompilace, linkov´an´ı, upload) prov´ad´ıme pomoc´ı skriptu build.xml. Na pˇr´ısluˇsnou z´aloˇzku klikneme prav´ım tlaˇc´ıtkem a vybereme Run Target. Nebo m˚ uˇzeme spustit projekt v NetBeans (F6), t´ım se nahraje program do NXT a pot´e se spust´ı.
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
2.5 2.5.1 Tˇ r´ıda Button LCD
Motor
17
Z´ akladn´ı pˇ r´ıkazy Nˇ ekolik z´ akladn´ıch pˇ r´ıkaz˚ u Jm´ eno metody void waitForPress() void drawString(String str, int x, int y) void backward() void changeDirection() void forward() void setSpeed(int speed) void stop() void rotate(float angle)
Pozn´ amka ˇ Cek´a se dokud se nezm´aˇckne tlaˇc´ıtko. Vykresl´ı ˇretˇezec na displej na urˇcenou pozici. Spust´ı motor, kter´ y se bude toˇcit dozadu. Obrat´ı smˇer chodu motoru. Spust´ı motor, kter´ y se bude toˇcit dopˇredu. Nastav´ı rychlost pohybu (´ uhlov´ ych stupˇ n˚ u za vteˇrinu) motoru. Maximum je pˇribliˇznˇe 900 pˇri pln´e baterii. Vypne motor. Otoˇc´ı motor o u ´hel (ve stupn´ıch).
Tabulka 2.3: Z´akladn´ı pˇr´ıkazy Uk´ azka pouˇ zit´ı pˇ r´ıkaz˚ u Motor.A.setSpeed(200);
T´ımto pˇr´ıkazem vybereme tˇr´ıdu Motor. Specifikujeme, ˇze chceme pouˇz´ıvat motor na pozici A a vybereme metodu setSpeed se vstupn´ım parametrem 200. V´ ysledkem bude, ˇze motor A se zaˇcne toˇcit rychlost´ı 200 u ´hlov´ ych stupˇ n˚ u za vteˇrinu.
2.5.2
Pˇ r´ıklad
Robot pojede dopˇredu, dokud se nestiskne tlaˇc´ıtko. Pot´e zrychl´ı a po druh´em stisknut´ı tlaˇc´ıtka zaˇcne jezdit dokola. Po tˇret´ım stisknut´ı tlaˇc´ıtka se vypne. package o r g . l e j o s . example ; import l e j o s . nxt . ∗ ; p u b l i c c l a s s Example {
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
18
p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { // S p u s t i s e motory A a C, v y p i s e s e t e x t na LCD a ceka s e // dokud s e nezmackne t l a c i t k o Motor .A. s e t S p e e d ( 2 0 0 ) ; Motor . C . s e t S p e e d ( 2 0 0 ) ; Motor .A. f o r w a r d ( ) ; Motor . C . f o r w a r d ( ) ; LCD. d r a w S t r i n g ( ”DOPREDU” , 0 , 0 ) ; Button . w a i t F o r P r e s s ( ) ; // Z r y c h l i s e Motor .A. s e t S p e e d ( 5 0 0 ) ; Motor . C . s e t S p e e d ( 5 0 0 ) ; LCD. d r a w S t r i n g ( ”RYCHLEJI” , 0 , 1 ) ; Button . w a i t F o r P r e s s ( ) ; // Zacne j e z d i t v kruhu Motor .A. s e t S p e e d ( 5 0 0 ) ; Motor . C . s e t S p e e d ( 2 0 0 ) ; LCD. d r a w S t r i n g ( ”DOKOLA” , 0 , 2 ) ; Button . w a i t F o r P r e s s ( ) ; // Z a s t a v i s e motory Motor .A. s t o p ( ) ; Motor . C . s t o p ( ) ; } }
2.6 2.6.1
Pokroˇ cilejˇ s´ı pˇ r´ıkazy Nˇ ekolik pokroˇ cilejˇ s´ıch pˇ r´ıkaz˚ u
Jedna z v´ yhod pouˇz´ıv´an´ı programovac´ıho jazyku JAVA je moˇznost pouˇz´ıt pˇreddefinovan´ ych tˇr´ıd a metod. Jedn´ım z velmi uˇziteˇcn´ ych prostˇredk˚ u je interface Pilot. Interface Pilot se pouˇz´ıv´a pro robota typu vozidlo. Tedy takov´eho robota, kter´ y m´a dva nez´avisl´e motory, kter´e poh´anˇej´ı kola. Uk´aˇzeme si pouˇzit´ı tˇr´ıdy TachoPilot, kter´a interface Pilot implementuje. Do konstruktoru t´eto tˇr´ıdy zad´ame pr˚ umˇer a rozkol poh´anˇen´ ych kol a pozice, na kter´ ych jsou motory pˇripojeny. Pot´e jiˇz m˚ uˇzeme vyuˇz´ıvat pokroˇcilejˇs´ıch funkc´ı. Konstruktory tˇ r´ıdy Pilot: TachoPilot(float wheelDiameter, float trackWidth,Motor leftMotor, Motor rightMotor) TachoPilot(float wheelDiameter, float trackWidth,Motor leftMotor, Motor rightMotor, boolean reverse)
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
19
Hodnoty parametr˚ u m˚ uˇzeme zad´avat v libovoln´ ych jednotk´ach. D˚ uleˇzit´e je, abychom ve vˇsech metod´ach pouˇz´ıvali stejn´e jednotky, jak´e jsme zadali do konstruktoru. Rovnˇeˇz velmi uˇziteˇcn´a je tˇr´ıda SimpleNavigator. Tato tˇr´ıda poskytuje hrub´ y odhad polohy. Funguje tak, ˇze na poˇca´tku programu um´ıst´ı robota do polohy {0,0}. Postupnˇe jak se vykon´avaj´ı pˇr´ıkazy, tak se pˇrepoˇc´ıt´av´a a zaznamen´av´a aktu´aln´ı poloha. Takto udrˇz´ıme pˇrehled o tom, kde se robot pohybuje. Konstruktor tˇ r´ıdy SimpleNavigator : SimpleNavigator(Pilot pilot) SimpleNavigator(float wheelDiameter, float trackWidth,Motor leftMotor, Motor rightMotor) SimpleNavigator(float wheelDiameter, float trackWidth,Motor leftMotor, Motor rightMotor, boolean reverse) Pˇ r´ıklad pouˇ zit´ı: M˚ uj robot-voz´ıtko m´a pr˚ umˇer kola (naps´ano na pneumatice) 81.6mm, rozkol kol je pˇribliˇznˇe 110mm a motory m´am zapojeny na v´ ystupy A a C. Konstruktory pro tuto situaci bude vypadat takto: Pilot pilot = new TachoPilot(81.6f, 110f, Motor.A, Motor.C); SimpleNavigator navigator = new SimpleNavigator(pilot);
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN Metody tˇr´ıdy Pilot: Jm´ eno metody void arc(float radius); void arc(float radius, float angle)
void backward() void forward() float getAngle() void setMoveSpeed(float speed) void steer(float turnRate); void steer(float turnRate, float angle)
void travel(float distance)
void travelArc(float radius, float distance)
float getTravelDistance()
Pozn´ amka Robot pojede po oblouku. Hodnota radius urˇcuje polomˇer zat´aˇcky. Pokud je radius > 0, tak se robot zaˇcne ot´aˇcet doleva, pokud je radius < 0, tak doprava. angle je hodnota u ´hlu ve stupn´ıch o kterou se robot otoˇc´ı Robot se zaˇcne pohybovat zpˇet. Robot se zaˇcne pohybovat dopˇredu. Metoda vr´at´ı hodnotu u ´hlu ve stupn´ıch, kterou robot urazil od zaˇca´tku bˇehu. Nastav´ı rychlost pohybu (hodnota promˇenn´e speed za vteˇrinu). Robot pojede po zakˇriven´e dr´aze. Hodnota turnRate m˚ uˇze b´ yt -200 aˇz 200. turnRate = 100 ... lev´e kolo stoj´ı, prav´e se toˇc´ı dopˇredu→ ostr´a lev´e zat´aˇcka turnRate = 200 ... lev´e kolo se toˇc´ı dozadu, prav´e se toˇc´ı dopˇredu → otoˇcen´ı doleva na m´ıstˇe Pokud pˇred hodnotu dop´ıˇseme minus, tak se robot bude ot´aˇcet doprava. angle je hodnota u ´hlu ve stupn´ıch o kterou se robot otoˇc´ı Robot pojede dopˇredu (pokud je hodnota distance z´aporn´a, tak dozadu), dokud neuraz´ı hodnotu promˇenn´e distance. Robot pojede po oblouku. Hodnota radius urˇcuje polomˇer zat´aˇcky. Pokud je radius > 0, tak se robot zaˇcne ot´aˇcet doleva, pokud je radius < 0, tak doprava. hodnota distance je dr´aha, kterou robot uraz´ı. Metoda vr´at´ı vzd´alenost, kterou robot urazil od zaˇc´atku bˇehu.
Tabulka 2.4: Pˇrehled nejd˚ uleˇzitˇejˇs´ıch metod tˇr´ıdy Pilot
20
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
21
Metody tˇr´ıdy SimpleNavigator : Jm´ eno metody float angleTo(float x, float y) float distanceTo(float x, float y) float getAngle(float x, float y)
float getX() float getY() void goTo(float x, float y) void setPose(float x, float y, float heading)
Pozn´ amka Metoda vr´at´ı hodnotu u ´hlu ve stupn´ıch mezi aktu´aln´ı pozic´ı a zadan´ ym bodem {x,y} Metoda vr´at´ı vzd´alenost k zadan´emu bodu {x,y}
Metoda vr´at´ı hodnotu u ´hlu ve stupn´ıch mezi smˇerem, kam robot smˇeˇruje, a smˇerem, kam robot smˇeˇroval na zaˇca´tku. Metoda vr´at´ı souˇradnici x aktu´aln´ı pozice. Metoda vr´at´ı souˇradnici y aktu´aln´ı pozice. Metoda zaˇr´ıd´ı, aby robot dojel na urˇcenou pozici {x,y} Nastav´ı nov´e hodnoty jako v´ ychoz´ı bod.
Tabulka 2.5: Pˇrehled nejd˚ uleˇzitˇejˇs´ıch pˇr´ıkaz˚ u tˇr´ıdy SimpleNavigator
2.6.2
Pˇ r´ıklady
Robot pojede po pˇr´ım´e dr´aze a udˇel´a zat´aˇcku o 180◦ . Takto bude jezdit, dokud se nestiskne tlaˇc´ıtko Escape. Robot tedy bude jezdit po dr´aze, kter´a m´a tvar stadionu. package o r g . l e j o s . example ; import l e j o s . nxt . ∗ ; import l e j o s . r o b o t i c s . n a v i g a t i o n . P i l o t ; import l e j o s . r o b o t i c s . n a v i g a t i o n . T a c h o P i l o t ; p u b l i c c l a s s Example2 { P i l o t p i l o t = new T a c h o P i l o t ( 8 1 . 6 f , 120 f , Motor . A, Motor . C) ; boolean stop = f a l s e ; p u b l i c v o i d go ( ) { /∗ Vytvorim l i s t e n e r a na t l a c i t k o CANCEL −> p o t e ∗ co ho s t i s k n u , tak s e hodnota s t o p zmeni na t r u e ∗/ B u t t o n L i s t e n e r l i s t e n = new B u t t o n L i s t e n e r ( ) { p u b l i c v o i d b u t t o n P r e s s e d ( Button b ) { stop = true ; } /∗ B u t t o n L i s t e n e r j e i n t e r f a c e , p r o t o musim n a p s a t ∗ vsechny j e h o t r i d y , i ty k t e r e n e p o u z i j i ∗/ p u b l i c v o i d b u t t o n R e l e a s e d ( Button b ) { }
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
22
}; /∗ l i s t e n e r a i n i c i a l i z u j i ∗/ Button .ESCAPE. a d d B u t t o n L i s t e n e r ( l i s t e n ) ; /∗ Jedu , dokud s e nezmeni hodnota stop , ∗ tu prubezne k o n t r o l u j i . ∗/ w h i l e ( s t o p == f a l s e ) { i f ( s t o p == f a l s e ) { p i l o t . travel (250) ; } i f ( s t o p == f a l s e ) { p i l o t . s t e e r (100 , 180) ; } } } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { // S p u s t i s e metoda go ( ) Example2 exam = new Example2 ( ) ; exam . go ( ) ; } }
2.7
Pˇ r´ıkazy ovl´ adaj´ıc´ı senzory
Nyn´ı uvedeme pˇr´ıkazy, kter´ ymi budeme obsluhovat jednotliv´e senzory.
2.7.1
Dotykov´ y senzor
Konstruktor TouchSensor(ADSensorPort port) Metoda Pro dotykov´ y senzor m´ame k dispozici metodu boolean isPressed() Metoda zkontroluje, jestli senzor sepnul (nastal dotyk). Pokud ano, tak navrac´ı true, jinak false.
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
23
Pˇ r´ıklad Dokud nesepne dotykov´ y senzor, tak motory na pozic´ıch A a C budou v chodu. package o r g . l e j o s . example ; import l e j o s . nxt . ∗ ; p u b l i c c l a s s Example { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { // S e n z o r j e na vstupu c i s l o 1 TouchSensor s e n s o r = new TouchSensor ( S e n s o r P o r t . S1 ) ; w h i l e ( s e n s o r . i s P r e s s e d ( ) == f a l s e ) { Motor .A. f o r w a r d ( ) ; Motor . C . f o r w a r d ( ) ; } } }
2.7.2
Svˇ eteln´ y senzor
Konstruktory LightSensor(ADSensorPort port) LightSensor(ADSensorPort port, boolean floodlight) Hodnotou promˇenn´e floodlight ˇr´ık´ame, zda chceme pouˇz´ıt ˇcervenou LED diodu pro osv´ıcen´ı povrchu. Pokud pouˇzijeme konstruktor bez t´eto promˇenn´e (ten prvn´ı), tak se dioda rozsv´ıt´ı automaticky. Tedy LightSensor(SensorPort.S1) je ekvivalentn´ı LightSensor(SensorPort.S1,true) Konstruktorem LightSensor(SensorPort.S1,false) zajist´ıme, ˇze se dioda nerozsv´ıt´ı. Metody int readNormalizedValue() Metoda vr´at´ı normalizovanou hodnotu jasu v rozsahu od 0 (´ upln´a tma) do 1023 (intenzivn´ı svˇetlo). int readValue() Metoda vr´at´ı hodnotu jasu v procentech podle nastaven´e kalibrace. void setFloodlight(boolean floodlight) Touto metodou m˚ uˇzeme rozsv´ıtit nebo zhasnout ˇcervenou LED diodu.
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
24
void setHigh(int high) Tato metoda provede kalibraci horn´ı hranice senzoru. Metoda readValue pot´e bude pro hodnotu high vracet hodnotu 100%. void setLow(int low) Tato metoda provede kalibraci spodn´ı hranice senzoru. Metoda readValue pot´e bude pro hodnotu low vracet hodnotu 0%.
Pˇ r´ıklad Robot reaguj´ıc´ı na svˇetlo. Pokud robota osv´ıt´ıme svˇetlem, tak pojede do t´e doby, neˇz svˇetlo zhasne. Jeho rychlost bude u ´mˇern´a intenzitˇe svˇetla. package o r g . l e j o s . example ; import l e j o s . nxt . ∗ ; p u b l i c c l a s s Example { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { L i g h t S e n s o r s e n s o r = new L i g h t S e n s o r ( S e n s o r P o r t . S1 , f a l s e ) ; // Program s e u k o n c i p o t e co s e s t i s k n e t l a c i t k o u ESCAPE. w h i l e ( Button .ESCAPE. i s P r e s s e d ( ) == f a l s e ) { i n t l i g h t = s e n s o r . readNormalizedValue ( ) ; /∗ Pokud j e uroven j a s u v i c e j a k 1 8 0 , tak s e motory s p u s t i a ∗ j e j i c h r y c h l o s t s e n a s t a v i na zmerenou hodnotu j a s u . ∗ Hodnota 180 b y l a e x p e r i m e n t a l n e n a s t a v e n a . ∗/ i f ( l i g h t >= 1 8 0 ) { Motor .A. s e t S p e e d ( l i g h t ) ; Motor . C . s e t S p e e d ( l i g h t ) ; Motor .A. f o r w a r d ( ) ; Motor . C . f o r w a r d ( ) ; } // Pokud ne , tak s e motory z a s t a v i else { Motor .A. s t o p ( ) ; Motor . C . s t o p ( ) ; } } } }
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN
2.7.3
25
Ultrazvukov´ y senzor
Konstruktor UltrasonicSensor(I2CPort port) Metody U ultrazvukov´eho senzoru je nejd˚ uleˇzitˇejˇs´ı metoda float getRange() Metoda vr´at´ı vzd´alenost v centimetrech k nejbliˇzˇs´ımu objektu. Funguje spolehlivˇe v rozsahu pˇribliˇznˇe 5cm aˇz 190cm. Pˇ r´ıklad Dokud nestisknu tlaˇc´ıtko Escape, bude se na displej vypisovat vzd´alenost k nejbliˇzˇs´ımu objektu. package o r g . l e j o s . example ; import l e j o s . nxt . ∗ ; p u b l i c c l a s s Example { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { // S e n z o r j e na vstupu c i s l o 1 U l t r a s o n i c S e n s o r s e n s o r = new U l t r a s o n i c S e n s o r ( S e n s o r P o r t . S1 ) ; // Program s e u k o n c i p o t e co s e s t i s k n e t l a c i t k o u ESCAPE. w h i l e ( Button .ESCAPE. i s P r e s s e d ( ) == f a l s e ) { LCD. d r a w S t r i n g ( ” ”+s e n s o r . getRange ( ) , 0 , 0 ) ; } } }
2.7.4
Zvukov´ y senzor
Konstruktory SoundSensor(ADSensorPort port) SoundSensor(ADSensorPort port, boolean dba) Promˇennou dba nastavujeme reˇzim senzoru. Pokud je dba true, tak bude senzor nastaven do reˇzimu dBA, jinak bude v reˇzimu dB.
´ ´I ROBOTA KAPITOLA 2. PROGRAMOVAN Metody int readValue() Metoda vr´at´ı hodnotu namˇeˇrenou senzorem v dB. void setDBA(boolean dba) Nastavuje reˇzim senzoru stejn´ ym zp˚ usobem, jak´ y je vysvˇetlen u konstruktoru. Pˇ r´ıklad Dokud nestisknu tlaˇc´ıtko Escape, bude se na displej vypisovat velikost hluku. package o r g . l e j o s . example ; import l e j o s . nxt . ∗ ; p u b l i c c l a s s Example { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { // S e n z o r j e na vstupu c i s l o 1 , r e z i m dBA SoundSensor s e n s o r = new SoundSensor ( S e n s o r P o r t . S1 , t r u e ) ; // Program s e u k o n c i p o t e co s e s t i s k n e t l a c i t k o u ESCAPE. w h i l e ( Button .ESCAPE. i s P r e s s e d ( ) == f a l s e ) { LCD. d r a w S t r i n g ( ” ”+s e n s o r . readValue ( ) , 0 , 0 ) ; } } }
26
Kapitola 3 Soutˇ eˇ zn´ı u ´ lohy Jedn´ım z u ´kol˚ u bakal´aˇrsk´e pr´ace bylo prov´est n´avrh jedn´e nebo dvou nov´ ych soutˇeˇzn´ıch u ´loh s ˇr´ızen´ım ve tˇrech r˚ uzn´ ych programovac´ıch prostˇred´ıch (NXT-G, NXC a leJOS-NXJ). Obˇe dvˇe navrˇzen´e u ´lohy jsou vˇsak natolik komplikovan´e, ˇze je v grafick´em prostˇred´ı NXT-G nelze naprogramovat, ale je potˇreba vyuˇz´ıt vyˇsˇs´ıho programovac´ıho jazyka, jako je NXC nebo LeJOS-NXJ, ke zd´arn´e implementaci. Proto ˇreˇsen´ı u ´loh v programovac´ım prostˇred´ı NXT-G nen´ı v pr´aci uvedeno.
3.1
´ Uloha: Sledov´ an´ı ˇ c´ ary s kˇ r´ıˇ zen´ım
N´avrh t´eto u ´lohy byl pˇripraven jako nov´a u ´loha pro pˇredmˇet ROBOTI. V t´eto u ´loze se vyuˇzije pˇredevˇs´ım pr´ace se svˇeteln´ ym senzorem a pohybov´ ymi souˇca´stmi robota.
3.1.1
Pravidla
C´ıl u ´ lohy Z poskytnut´ ych LEGO d´ıl˚ u postavit a naprogramovat robota tak, aby samostatnˇe a co nejrychleji ujel dvˇe kola vyznaˇcenou dr´ahou, aniˇz by se stˇretl s druh´ ym z´avod´ıc´ım robotem. Technick´ e prostˇ redky R MINDSTORMS R T´ ymu je na zaˇca´tku soutˇeˇze zap˚ ujˇcena z´akladn´ı souprava LEGO Education (9797). D´ale souprava doplˇ nkov´ ych technick´ ych d´ıl˚ u (9648) a s´ıt’ov´ y adapt´er
(9833), kter´e se po skonˇcen´ı soutˇeˇze vr´at´ı v kompletn´ım stavu organiz´atorovi soutˇeˇze na
27
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
28
Katedˇre ˇr´ıd´ıc´ı techniky. Robota lze sestrojit libovoln´ ym zp˚ usobem, ale pouze ze souˇc´astek zap˚ ujˇcen´ ych d´ıl˚ u. Vyp˚ ujˇcov´an´ı si souˇc´astek od jin´ ych t´ ym˚ u je zak´az´ano. Pˇri vlastn´ı soutˇeˇzi je moˇzn´e pouˇz´ıt pouze akumul´ator nebo baterie, nikoliv s´ıt’ov´ y adapt´er. NXT kostku lze naprogramovat libovoln´ ym zp˚ usobem, ale pˇri navr´acen´ı mus´ı kostka obsahovat standardn´ı firmware LEGO MINDSTORMS.
3.1.2
Pl´ an soutˇ eˇ ze
Podrobnosti k pravidl˚ um pr˚ ujezdu dr´ ahy Robota lze do startovn´ı pozice poloˇzit ruˇcnˇe. D´ale jiˇz mus´ı pokraˇcovat s´am, bez jak´ekoliv vnˇejˇs´ı pomoci. Robot mus´ı ujet dvˇe kola na dr´aze, a to jedno kolo vnitˇrn´ı dr´ahou a jedno kolo vnˇejˇs´ı dr´ahou. C´ılov´a pozice robota je tedy stejn´a, jako jeho poˇca´teˇcn´ı pozice. Robot pˇri pr˚ ujezdu nesm´ı ˇz´adnou svoj´ı ˇc´ast´ı pˇres´ahnout hranici sv´e dr´ahy, kter´a je vyznaˇcena ˇzlutou ˇca´rou. Prostor kˇr´ıˇzen´ı je vyznaˇcen ˇzlutou ˇcarou. Robot, kter´ y jako prvn´ı pˇrekroˇc´ı tuto ˇca´ru m´a na kˇriˇzovatce pˇrednost. V pˇr´ıpadˇe kolize bude posouzena m´ıra zavinˇen´ı a v dan´e rozj´ıˇzd’ce diskvalifikov´an ten robot, kter´ y poruˇsil pravidla. Pokud je vin´ık kolize nejasn´ y, m˚ uˇze se zopakovat rozj´ıˇzd’ka s prohozen´ ymi startovn´ımi pozicemi. Pokud by mˇelo doj´ıt k opakov´an´ı rozj´ıˇzd’ky u stejn´ ych soupeˇr˚ u potˇret´ı, pak bude z´avod ukonˇcen jako nerozhodn´ y. Poruˇsen´ı jak´ehokoliv pravidla vede k diskvalifikaci robota v pˇr´ısluˇsn´e rozj´ıˇzd’ce. Druh´ y robot vˇsak mus´ı j´ızdu dokonˇcit. Diskvalifikace obou robot˚ u je ch´ap´ana jako nerozhodn´ y v´ ysledek. Soutˇ eˇ zn´ı dr´ aha Vod´ıc´ı ˇca´ru jedn´e dr´ahy pˇredstavuj´ı dvˇe soubˇeˇznˇe veden´e ˇcern´e ˇca´ry, jejichˇz tlouˇst’ka je pˇribliˇznˇe 10 mm. Vzd´alenost mezi tˇemito ˇcarami je pˇribliˇznˇe 20 mm. Rovn´ yu ´sek dr´ahy je dlouh´ y 1000 mm. Polomˇer vnˇejˇs´ıho oblouku je 560 mm (d´elka 1759 mm) a polomˇer vnitˇrn´ıho oblouku je 200 mm (d´elka 628 mm). Na rovn´em u ´seku je ˇzlutou ˇc´arou vyznaˇcen startovn´ı prostor. Startovn´ı prostor je ˇctverec o stranˇe 350 mm, jehoˇz stˇredem proch´az´ı vod´ıc´ı ˇca´ra. Robot mus´ı b´ yt pˇri startu cel´ y v tomto startovn´ım prostoru (hranice startovn´ıho prostoru se prom´ıt´a svisle vzh˚ uru). Za start je povaˇzov´ana osa vnitˇrn´ı startovn´ı ˇca´ry (zdvojen´a ˇc´ara). Start je vyznaˇcen 155 mm od prvn´ı zat´aˇcky.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
29
Prostor kˇr´ıˇzen´ı zaˇc´ın´a 155 mm za prvn´ı zat´aˇckou. Polomˇer zat´aˇcky realizovan´e v kˇr´ıˇzen´ı je 200 mm (d´elka dr´ahy 157 mm). D´elka rovn´eho u ´seku je 343 mm. Kˇriˇzovatka tak zab´ır´a 526 mm rovn´eho u ´seku a pˇri jej´ım projet´ı se uraz´ı vzd´alenost 657 mm. Zb´ yvaj´ıc´ı rovn´e u ´seky v souˇctu tvoˇr´ı dr´ahu dlouhou 474 mm. Hranice dr´ahy, ve kter´e se robot sm´ı pohybovat je ˇsirok´a 350 mm. Celkov´a dr´aha, kterou robot mus´ı ujet, tj. obˇe dvˇe kola, m´a d´elku 9036 mm.
Obr´azek 3.1: Soutˇeˇz´ı dr´aha pro u ´lohu Sledov´an´ı ˇca´ry s kˇr´ıˇzen´ım
3.1.3
Hardwarov´ eˇ reˇ sen´ı u ´ lohy
V t´eto u ´loze bude nejd˚ uleˇzitˇejˇs´ı souˇca´stkou svˇeteln´ y senzor, ten je v´ yhodn´e um´ıstit co nejn´ıˇze nad povrch dr´ahy, aby fototranzistor senzoru byl zamˇeˇren na malou plochu, ˇc´ımˇz se mˇeˇren´ı stane pˇresnˇejˇs´ı. Mus´ıme ale d´at pozor na nerovnosti trati, protoˇze ˇc´ım je senzor um´ıstˇen n´ıˇze, t´ım v´ıce se st´av´a n´achylnˇejˇs´ı na ruˇsen´ı v podobˇe nerovnost´ı na trati. Pro konstrukci robota vyuˇzijeme z´akladn´ı n´avod, kter´ y je k dispozici na webov´e R MINDSTORMS R Education str´ance [6], kter´ y je souˇc´ast´ı z´akladn´ı soupravy LEGO
(9797). Pouˇzijeme modifikaci podle n´avodu na webov´e str´ance [7], ve kter´em je svˇeteln´ y senzor um´ıstˇen na ˇcele robota. Dalˇs´ı senzor, kter´ y bude zapotˇreb´ı, je ultrazvukov´ y senzor. Ten namontujeme nad svˇeteln´ y senzor tak, aby smˇeˇroval pˇred robota.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
30
Obr´azek 3.2: Konstrukce robota pro Sledov´an´ı ˇca´ry
3.1.4
ˇ sen´ı v programovac´ım prostˇ Reˇ red´ı NXC
Jak jeˇstˇe bude zm´ınˇeno, prostˇred´ı NXC m´a delˇs´ı periodu vykon´av´an´ı jednotliv´ ych metod, proto nen´ı moˇzn´e implementovat koncept ”Zig-Zag”(bude vysvˇetleno d´ale). Z tohoto d˚ uvodu zde pouˇzijeme jin´ y koncept. Koncept Sledov´ an´ı ˇ c´ ary Koncept ”Sledov´an´ı ˇc´ary”je velmi popul´arn´ı soutˇeˇzn´ı u ´lohou, na kter´e m˚ uˇzeme uk´azat z´akladn´ı koncept ˇr´ızen´ı. Robot pojede na rozhran´ı ˇcern´e a b´ıl´e ˇca´ry a svˇeteln´ ym senzorem bude sn´ımat intenzitu svˇetla, kter´a se odr´aˇz´ı od dr´ahy, na kterou sv´ıt´ı ˇcervenou LED diodou. Namˇeˇren´a intenzita svˇetla leˇz´ı v jist´em rozsahu hodnot. Je v´ yhodn´e nejdˇr´ıve zmˇeˇrit maxim´aln´ı a minim´aln´ı moˇzn´e velikosti intenzity, abychom podle tˇechto hodnot mohli kalibrovat senzor. Po kalibraci bude senzor vracet relativn´ı hodnotu intenzity svˇetla od 0% (ˇcern´a ˇc´ara) do 100% (b´ıl´a ˇc´ara). N´aˇs program se t´ım stane pˇrehlednˇejˇs´ı. Je tˇreba si uvˇedomit, ˇze robot nedok´aˇze jet pouze po ˇcern´e nebo b´ıl´e ˇca´ˇre, ale pouze po jejich rozhran´ı. To vede k rozhodnut´ı, jakou ˇc´aru si zvolit a ze kter´e strany ji sledovat.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
31
Zvol´ıme ˇca´ru, kter´a je napravo z pohledu robota a tuto ˇca´ru bude robot sledovat z lev´e strany. Pozdˇeji uk´aˇzeme, ˇze tato volba je nejv´ yhodnˇejˇs´ı. Pˇredpokl´adejme, ˇze jsme u ´spˇeˇsnˇe kalibrovali senzor. Budeme poˇzadovat, aby senzor mˇel na v´ ystupu hodnotu 70%. Pojede tedy bl´ıˇze b´ıl´e ˇca´ˇre. K dosaˇzen´ı tohoto poˇzadavku mus´ıme sestavit regul´ator. Zaˇcnˇeme s nejjednoduˇsˇs´ım moˇzn´ ym regul´atorem. Senzorem zmˇeˇr´ıme relativn´ı intenzitu svˇetla a odchylku od n´ami poˇzadovan´e hodnoty vyn´asob´ıme konstantou. T´ım z´ısk´ame akˇcn´ı z´asah nebo-li vstup do soustavy. Toto m˚ uˇzeme zapsat do rovnice u(t) = kp · e(t)
(3.1)
Pro n´aˇs diskr´etn´ı pˇr´ıpad bude rovnice vypadat u = kp · (y − r)
(3.2)
kde e(t) je odchylka od poˇzadovan´e hodnoty, u je akˇcn´ı z´asah, y je v´ ystup senzoru, r je poˇzadovan´a hodnota a kp je proporcion´aln´ı konstanta, kterou v tomto pˇr´ıpadˇe nalezneme metodou cyklick´e optimalizace. Takov´ yto regul´ator naz´ yv´ame P-regul´ator a regulaci ˇr´ızen´ı odchylkou. V naˇsem pˇr´ıpadˇe je tento regul´ator nedostaˇcuj´ıc´ı. Perioda vykon´av´an´ı metod je v prostˇred´ı NXC delˇs´ı neˇz v prostˇred´ı LeJOS. D´ıky tomu robot pˇr´ıliˇs pˇrekmit´av´a pˇri pr˚ ujezdu zat´aˇcek. Zm´ınˇen´ y jev odstran´ı pouˇzit´ı derivaˇcn´ı sloˇzky. Tato sloˇzka pˇredpov´ıd´a v´ yvoj stavu v nejbliˇzˇs´ı budoucnosti podle u ´daj˚ u z minulosti. Akˇcn´ı z´asah pot´e bude m´ıt tvar u(t) = kp · e(t) + kd · e(t) ˙
(3.3)
Pro n´aˇs diskr´etn´ı pˇr´ıpad bude rovnice vypadat u = kp · (y − r) + kd · ((y − r) − (y−1 − r))
(3.4)
˙ je derivace odchylky od poˇzadovan´e kde e(t) je odchylka od poˇzadovan´e hodnoty, e(t) hodnoty, u je akˇcn´ı z´asah, y je v´ ystup senzoru, y−1 je v´ ystup senzoru v pˇredchoz´ım kroku, r je poˇzadovan´a hodnota kp je proporcion´aln´ı konstanta, kd je derivaˇcn´ı konstanta, kterou opˇet nalezneme experiment´alnˇe. Tento regul´ator se naz´ yv´a PD-regul´ator. S t´ımto regul´atorem dok´aˇzeme sledovat ˇca´ru a z´aroveˇ n eliminovat pˇrekmity. Zb´ yv´a vyˇreˇsit pr˚ ujezd kˇriˇzovatkou, kde robot na chv´ıli sjede z ˇc´ary. Toto vyˇreˇs´ıme zaveden´ım podm´ınky vyˇzaduj´ıc´ı, ˇze pokud robot sjede z ˇcern´e ˇca´ry, tak pojede rovnˇe dokud na ni
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
32
opˇet nenaraz´ı. To je pr´avˇe d˚ uvodem, aby robot jel nalevo od prav´e ˇc´ary, jinak by mohla nastat situace, ˇze by robot vyjel z trati. Na kˇriˇzovatce rovnˇeˇz mus´ıme zabr´anit sr´aˇzce robot˚ u. K tomu vyuˇzijeme ultrazvukov´ y senzor. Pokud senzor detekuje, ˇze v bezprostˇredn´ı bl´ızkosti pˇred n´ım se nach´az´ı nˇejak´ y objekt (v naˇsem pˇr´ıpadˇe druh´ y robot), tak robot zastav´ı a vyˇck´a, dokud druh´ y robot neprojede.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE V´ yvojov´ y diagram
Obr´azek 3.3: V´ yvojov´ y diagram pro koncept Sledov´an´ı ˇca´ry
33
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
34
D˚ uleˇ zit´ eˇ c´ asti zdrojov´ eho k´ odu Uvedeme zde nejd˚ uleˇzitˇejˇs´ı ˇca´sti pouˇzit´eho k´odu. Poznamenejme, ˇze pokud se v uveden´em k´odu vyskytnou ... (tˇri teˇcky), tak se jedn´a o ˇc´ast, kter´a nen´ı d˚ uleˇzit´a pro pochopen´ı k´odu, proto byla vypuˇstˇena z n´asleduj´ıc´ıho pˇrehledu. NXC nenab´ız´ı moˇznost kalibrovat senzor, proto je kaˇzd´a zmˇeˇren´a hodnota pˇrepoˇc´ıt´ana n´asleduj´ıc´ı metodou int ReadCalibratedSensor(){ int readings = 0; sensorValue = Sensor(IN_1); readings = (sensorValue - LOW_VALUE) * 100; readings= readings/(HIGH_VALUE-LOW_VALUE); return readings; }
V´ yˇse zm´ınˇen´ y PD regul´ator realizuje funkce CalculateSteerRate int CalculateSteerRate(){ last_error = error; int calculation = 0; error = calibratedSensorValue - CALIBRATION; derivative = error - last_error; ... // PD regul´ ator calculation = (KP * error)/100 + (KD * derivative)/100; return calculation; }
Pr˚ ujezd kˇriˇzovatkou if(sensorValue<100){ ... OnFwdSync(OUT_AC, SPEED,steerRate); } // Na kˇ riˇ zovatce else{ OnFwdReg(OUT_AC, SPEED,1); }
3.1.5
ˇ sen´ı v programovac´ım prostˇ Reˇ red´ı LeJOS NXJ
Prostˇred´ı LeJOS NXJ nab´ız´ı mnoho v´ yhod pˇri programov´an´ı robota. Jednou z nich je menˇs´ı perioda vykon´av´an´ı metod. Robot n´aslednˇe m˚ uˇze jet rychleji a pˇresnˇeji. Pˇri programov´an´ı konceptu ”Sledov´an´ı ˇca´ry”byl ˇcas projet´ı dvou kol 2 minuty a 7 vteˇrin. Oproti prostˇred´ı NXC se pr˚ ujezd zrychlil o 8 vteˇrin. Rovnˇeˇz nebyla zapotˇreb´ı derivaˇcn´ı sloˇzka. D´ale se budeme vˇenovat pouze konceptu ”Zig-Zag”.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
35
Koncept Zig-Zag Koncept ”Zig-Zag”n´am dovoluje pouˇz´ıt skuteˇcnost, ˇze dr´ahu tvoˇr´ı dvojice ˇcern´ ych ˇcar. Jak uˇz s´am n´azev konceptu napov´ıd´a, robot bude stˇr´ıdavˇe jezdit od jedn´e ˇca´ry ke druh´e. D´ıky tomu budeme moci v´ yraznˇe zv´ yˇsit jeho rychlost. Oproti v´ yˇse zm´ınˇen´e metodˇe je rychlost robota v´ıce jak dvojn´asobn´a. Z´asadn´ı podm´ınkou, kterou mus´ıme dodrˇzet, aby mˇel tento koncept ˇsanci na u ´spˇech, je stˇr´ıd´an´ı ˇcern´ ych ˇcar. Pokud by nastala situace, ˇze robot dvakr´at za sebou najede na stejnou ˇca´ru, tak se ztrat´ı a zpˇet na dr´ahu by ho vr´atila pouze ˇst’astn´a shoda okolnost´ı. Robot tedy mus´ı pˇrej´ıˇzdˇet od prav´e ˇca´ry k lev´e ˇca´ˇre a zpˇet pod co nejvˇetˇs´ım u ´hlem, aby dok´azal bezpeˇcnˇe projet i tˇemi nejostˇrejˇs´ımi zat´aˇckami na trati. Pokud ovˇsem zvol´ıme tento u ´hel pˇr´ıliˇs velk´ y, tak se robot bude posouvat dopˇredu velmi pomalu. Jedn´a se tedy o kompromis mezi bezpeˇcn´ ym a rychl´ ym projet´ım. Tvar trati n´am napov´ı, jak tento probl´em vyˇreˇsit. Vˇsimneme si, ˇze vˇetˇsina zat´aˇcek je levotoˇciv´ ych. Toho vyuˇzijeme a robota naprogramujeme tak, aby od prav´e ˇc´ary k lev´e ˇc´aˇre toˇcil pod velk´ ym u ´hlem a od lev´e ˇca´ry zpˇet k prav´e se toˇcil velmi pozvolna, aˇz neznatelnˇe. T´ım se znatelnˇe zrychl´ı rychlost robota a levotoˇciv´e zat´aˇcky projede bezpeˇcnˇe. Bohuˇzel t´ım vznikl probl´em s projet´ım pravotoˇciv´ ych zat´aˇcek, kter´e jsou na trati pr´avˇe dvˇe. Tuto situaci vyˇreˇs´ıme tak, ˇze robot pˇri pˇribl´ıˇzen´ı k pravotoˇciv´e zat´aˇcce zmˇen´ı reˇzim a zaˇcne pˇrej´ıˇzdˇet od lev´e ˇc´ary k prav´e pod vˇetˇs´ım u ´hlem. Po projet´ı zat´aˇcky se vr´at´ı do p˚ uvodn´ıho reˇzimu. Robot tedy mus´ı vˇedˇet, kde se na trati pˇribliˇznˇe nach´az´ı. S t´ımto u ´kolem n´am pomohou LeJOS metody, kter´e bychom v NXC nenaˇsli. Jedn´a se o metody getAngle() pro zjiˇstˇen´ı celkov´eho u ´hlu otoˇcen´ı a getTravelDistance() pro zjiˇstˇen´ı celkov´e uraˇzen´e vzd´alenosti. Pomoc´ı tˇechto dvou metod m˚ uˇzeme polohu pravotoˇciv´ ych zat´aˇcek pomˇernˇe pˇresnˇe stanovit. Nesm´ıme vˇsak zapomenout na skuteˇcnost, ˇze nev´ıme jestli bude robot zaˇc´ınat na vnitˇrn´ı nebo vnˇejˇs´ı trati. Proto mus´ıme poˇc´ıtat s periodou -360◦ , respektive 4400 mm. Tˇret´ı z´asadn´ı metodou, kterou budeme pouˇz´ıvat je steer(float turnRate). Tato metoda n´am umoˇzn´ı hladce proj´ıˇzdˇet zat´aˇcky t´ım, ˇze se motory navz´ajem synchronizuj´ı v pohybu. Jak je uvedeno v tabulce 2.4, jako argument t´eto metody m˚ uˇzeme zadat ˇc´ıslo od -200 do 200. Pokud zvol´ıme ˇc´ıslo, kter´e je absolutnˇe vˇetˇs´ı neˇz 100, tak robot toˇc´ı jedn´ım motorem dopˇredu a druh´ ym dozadu, ˇc´ımˇz se otoˇc´ı na menˇs´ım polomˇeru. Bohuˇzel zjist´ıme, ˇze pokud jako argument zad´ame takov´eto ˇc´ıslo, tak se robot zaˇcne toˇcit na m´ıstˇe a stane se neovladateln´ ym. Jedn´a se patrnˇe o chybu firmwaru (0.8.5beta) a v novˇejˇs´ıch verz´ıch jiˇz m˚ uˇze b´ yt tento probl´em vyˇreˇsen.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
36
Koneˇcnˇe, mus´ıme zabr´anit, aby se roboti stˇretli pˇri pr˚ ujezdu kˇriˇzovatkou, coˇz vyˇreˇs´ıme stejn´ ym zp˚ usobem jako v prostˇred´ı NXC. Ultrazvukov´ ym senzorem budeme hl´ıdat, aby pˇred robotem nebyl ˇza´dn´ y objekt. V´ yvojov´ y diagram
Obr´azek 3.4: V´ yvojov´ y diagram pro ”Zig-Zag”koncept
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
37
D˚ uleˇ zit´ eˇ c´ asti zdrojov´ eho k´ odu Zda je robot na ˇcern´e nebo b´ıl´e ˇca´ˇre se pozn´a podle podm´ınky: sensor_value = sensor.readValue(); if (sensor_value > WHITE_THRESHOLD) { white_line(); } else { black_line(); }
Metoda pro j´ızdu po b´ıl´e ˇc´aˇre Pokud robot na ˇcern´e ˇc´aˇre zat´aˇcel doleva, tak v tom bude pokraˇcovat. Pokud zat´aˇcel doprava, tak se ovˇeˇr´ı, zda nen´ı pˇred pravotoˇcivou zat´aˇckou a podle toho se zachov´a. private void white_line() { ... if (steerRate < 0) { pilot.steer(WHITE_LEFT_STEER); } else { // Jsem pˇ red pravotoˇ civou zat´ aˇ ckou? if((check_front_right_angle() && check_front_right_distance()) || (check_back_right_angle() && check_back_right_distance())){ pilot.setMoveSpeed(SPEED_SLOW); pilot.steer(WHITE_RIGHT_STEER); } else{ pilot.setMoveSpeed(SPEED); pilot.forward(); } } }
Metoda pro j´ızdu po ˇcern´e ˇc´aˇre Nejdˇr´ıve se podle u ´daje ze senzoru vypoˇcte jak prudce zatoˇcit, pot´e se zjist´ı, zda robot poslednˇe zat´aˇcel doprava a podle tˇechto u ´daj˚ u robot zatoˇc´ı. private void black_line() { ... steerRate = 100 - (KP * sensor_value); // Zat´ ac ˇel jsem doprava? if (steeredRight) { steerRate = -steerRate; } ... pilot.steer(steerRate); }
Kontrola, zda pˇred robotem nen´ı pˇrek´aˇzka. while(ultra_sensor.getRange() < SAFETY_DISTANCE){ pilot.stop(); }
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
3.1.6
38
V´ ysledek
V obou prostˇred´ıch se podaˇrilo robota u ´spˇeˇsnˇe naprogramovat tak, aby projel trat´ı. V prostˇred´ı NXC byl pˇri konceptu ”Sledov´an´ı ˇc´ary”ˇcas 2 minuty 15 vteˇrin. Stejn´ ym konceptem implementovan´ ym v prostˇred´ı LeJOS dos´ahneme ˇcasu 2 minuty 7 vteˇrin. Jako velmi efektivn´ı se uk´azal koncept ”Zig-Zag”, pomoc´ı kter´eho robot dok´azal projet trat’ za ˇcas 1 minuta 7 vteˇrin. Tedy o celou minutu rychleji, neˇz pˇri sledov´an´ı ˇc´ary. Videa tˇechto pr˚ ujezd˚ u je moˇzno shl´ednout na internetov´ ych str´ank´ach [8], [9]. Oba koncepty byly u ´spˇeˇsnˇe pˇredvedeny na v´ ystavˇe AMPER dne 15.dubna 2010. Fotogalerii, kter´a je vˇenov´ana t´eto v´ ystavˇe lze naj´ıt na webov´e str´ance [11]
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
3.2
39
´ Uloha: Skladiˇ stˇ e
N´avrh t´eto u ´lohy byl pˇripraven jako nov´a u ´loha pro pˇredmˇet ROBOTI. V t´eto u ´loze se vyuˇzije t´emˇeˇr vˇsechny souˇca´sti robota jak senzorick´e, tak i pohybov´e.
3.2.1
Pravidla
C´ıl u ´ lohy Z poskytnut´ ych LEGO d´ıl˚ u postavit a naprogramovat robota tak, aby samostatnˇe co nejrychleji dok´azal pˇrem´ıstit pˇredmˇety na trati do vyznaˇcen´ ych prostor. Technick´ e prostˇ redky R MINDSTORMS R T´ ymu je na zaˇca´tku soutˇeˇze zap˚ ujˇcena z´akladn´ı souprava LEGO Education (9797). D´ale souprava doplˇ nkov´ ych technick´ ych d´ıl˚ u (9648) a s´ıt’ov´ y adapt´er
(9833), kter´e se po skonˇcen´ı soutˇeˇze vr´at´ı v kompletn´ım stavu organiz´atorovi soutˇeˇze na Katedˇre ˇr´ıd´ıc´ı techniky. Robota lze sestrojit libovoln´ ym zp˚ usobem, ale pouze ze souˇc´astek ze zap˚ ujˇcen´ ych d´ıl˚ u. Vyp˚ ujˇcov´an´ı si souˇca´stek od jin´ ych t´ ym˚ u je zak´az´ano. Pˇri vlastn´ı soutˇeˇzi je moˇzn´e pouˇz´ıt pouze akumul´ator nebo baterie, nikoliv s´ıt’ov´ y adapt´er. NXT kostku lze naprogramovat libovoln´ ym zp˚ usobem, ale pˇri odevzd´an´ı mus´ı kostka obsahovat standardn´ı firmware LEGO MINDSTORMS.
3.2.2
Pl´ an soutˇ eˇ ze
Podrobnosti k pravidl˚ um Robot m˚ uˇze b´ yt um´ıstˇen kamkoliv do prostoru startovn´ıho pole, kter´e je pˇred startovn´ı ˇca´rou. Po jeho spuˇstˇen´ı se mus´ı pohybovat zcela samostatnˇe a nesm´ı b´ yt jakkoliv nav´adˇen ze strany soutˇeˇz´ıc´ıch. Robot mus´ı nejprve zav´est prvn´ı pˇredmˇet do skladovac´ıho prostoru (na obr. 3.5 vyznaˇcen zelenou barvou), pot´e mus´ı druh´ y pˇredmˇet pˇrem´ıstit do c´ılov´eho prostoru (na obr. 3.5 vyznaˇcen fialovou barvou). Jednotliv´e pˇredmˇety mohou b´ yt bud’ tenisov´ y m´ıˇcek nebo plechovka od n´apoje. Mˇeˇr´ı se ˇcas od doby, kdy robot poprv´e protne startovn´ı linii aˇz do chv´ıle, kdy robot projede c´ılovou lini´ı.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
40
Soutˇ eˇ zn´ı dr´ aha Do skladiˇstˇe i do c´ılov´eho prostoru vede ˇcern´a ˇc´ara, kter´a nem´a pravideln´ y tvar a zaˇc´ın´a vˇzdy u protˇejˇs´ı stˇeny, na kterou je kolm´a. Tato ˇc´ara je tvoˇrena ˇcernou elektrik´aˇrskou lepic´ı p´askou, ˇsirokou nejm´enˇe 1 cm. Povrch soutˇeˇzn´ıho pl´anu je tvoˇren b´ılou lamin´atovou deskou a v´ yˇska stˇeny je pˇribliˇznˇe 35 cm.
Obr´azek 3.5: Soutˇeˇz´ı dr´aha pro u ´lohu Skladiˇstˇe
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
41
Obr´azek 3.6: Fotografie soutˇeˇzn´ı dr´ahy pro u ´lohu Skladiˇstˇe
3.2.3
Hardwarov´ eˇ reˇ sen´ı u ´ lohy
V t´eto u ´loze bude konstrukce robota o nˇeco sloˇzitˇejˇs´ı, neˇz v pˇredch´azej´ıc´ı u ´loze. Budeme vyuˇz´ıvat vˇsechny 3 servomotory a vˇsechny senzory s v´ yjimkou zvukov´eho. V r´amci bakal´aˇrsk´e pr´ace byly pouˇzity dvˇe r˚ uzn´a hardwarov´a ˇreˇsen´ı t´eto u ´lohy. Prvn´ı varianta Prvn´ı ˇreˇsen´ı vych´az´ı z pˇredchoz´ı u ´lohy. Jeden z rozd´ıl˚ u je v um´ıstˇen´ı ultrazvukov´eho senzoru, kter´ y byl pˇrem´ıstˇen tˇesnˇe nad povrch desky. Rovnˇeˇz NXT kostka byla pˇrem´ıstˇena v´ıce dozadu, aby se robot vyv´aˇzil a vzniklo m´ısto pro tˇret´ı servomotor. Tento servomotor obsluhuje rameno, kter´ ym se zajist´ı pˇrepravovan´ y objekt tak, aby pˇri j´ızdˇe nevypadl. Na pˇredn´ı ˇc´ast tohoto ramene byly namontov´any dotykov´e senzory, kter´e slouˇz´ı k detekci stˇeny.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
Obr´azek 3.7: Konstrukce robota v u ´loze ”Skladiˇstˇe”var.1. Poloha = rameno nahoˇre
Obr´azek 3.8: Konstrukce robota v u ´loze ”Skladiˇstˇe”var.1. Poloha = rameno dole
42
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
43
Druh´ e varianta Druh´e ˇreˇsen´ı pouˇz´ıv´a jako z´aklad konstrukci, kter´a byla pˇrevzata z webov´e str´anky [12]. Tuto konstrukci m´ırnˇe uprav´ıme pouˇzit´ım jin´eho zadn´ıho koleˇcka a pˇrid´an´ım senzor˚ u. Svˇeteln´ y senzor um´ıst´ıme pod NXT kostku mezi dva servomotory tˇesnˇe nad povrch desky a ultrazvukov´ y senzor um´ıst´ıme pˇred nˇej. Pˇri um´ıstˇen´ı tˇret´ıho servomotoru, kter´ y bude obsluhovat rameno se nech´ame inspirovat n´avodem z webov´e str´anky [13]. Pˇredn´ı ˇc´ast ramene, stejnˇe jako v pˇredchoz´ım pˇr´ıpadˇe, osad´ıme dotykov´ ymi senzory pro detekci stˇeny.
Obr´azek 3.9: Konstrukce robota v u ´loze ”Skladiˇstˇe”var.2. Poloha = rameno nahoˇre
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
44
Obr´azek 3.10: Konstrukce robota v u ´loze ”Skladiˇstˇe”var.2. Poloha = rameno dole
3.2.4
Program´ atorsk´ eˇ reˇ sen´ı
Pˇri ˇreˇsen´ı v obou programovac´ıch prostˇred´ıch budeme pouˇz´ıvat jednotn´ y koncept, a to n´asleduj´ıc´ı: ˇ sen´ı u Reˇ ´lohy rozˇclen´ıme do nˇekolika menˇs´ıch ˇc´ast´ı: a) J´ızda k ˇca´ˇre b) Sledov´an´ı ˇca´ry c) Odvoz objektu do skladovac´ıch prostor d) J´ızda k protˇejˇs´ı stˇenˇe J´ızda k ˇ c´ aˇ re V t´eto ˇca´sti u ´lohy mus´ıme nal´ezt ˇcernou ˇc´aru, kterou posl´eze budeme sledovat. Budeme pˇredpokl´adat, ˇze ˇca´ra leˇz´ı pˇred robotem a ˇze mezi robotem a ˇca´rou nen´ı ˇz´adn´a pˇrek´aˇzka. Staˇc´ı, kdyˇz robot pojede rovnˇe a bude svˇeteln´ ym senzorem sn´ımat podklad, po kter´em jede. Aˇz robot pˇrejede ˇcernou ˇca´ru (pojede tedy na lev´e stranˇe ˇcern´e ˇca´ry), tak se otoˇc´ı o 90 stupˇ n˚ u doprava, protoˇze objekt k odvezen´ı bude um´ıstˇen v prav´e ˇc´asti skladiˇstˇe (z pohledu startu).
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
45
Sledov´ an´ı ˇ c´ ary V t´eto ˇca´sti sledujeme ˇcernou ˇca´ru aˇz k objektu, kter´ y chceme pˇrepravit. M˚ uˇzeme pouˇz´ıt ˇreˇsen´ı konceptu ”Sledov´an´ı ˇca´ry”z u ´lohy ”Sledov´an´ı ˇca´ry s kˇr´ıˇzen´ım”, kter´e m´ırnˇe uprav´ıme. Vynech´ame z nˇej ˇc´ast, kter´a zajiˇst’ovala pr˚ ujezd kˇriˇzovatkou, a m´ırnˇe pozmˇen´ıme u ´sek k´odu, kter´ y zabraˇ noval sr´aˇzce s druh´ ym robotem. Ciz´ı objekt detekujeme pomoc´ı ultrazvukov´eho senzoru. Toto je jeden z m´enˇe spolehliv´ ych ˇcl´ank˚ u ˇretˇezce ˇreˇsen´ı cel´e u ´lohy, protoˇze tento senzor sice spolehlivˇe detekuje stˇenu, ale menˇs´ı pˇrek´aˇzku, jako napˇr´ıklad m´ıˇc nebo plechovka, detekuje obt´ıˇznˇe. Odvoz objektu do skladovac´ıch prostor Nyn´ı jsme se dostali do situace, ˇze jsme se zastavili u n´akladu, kter´ y je potˇreba odv´est. V t´eto ˇc´asti objekt odvezeme do skladu, pˇriˇcemˇz budeme pˇredpokl´adat, ˇze ke skladu vede ˇcern´e ˇc´ara namalovan´a na podloˇzce. Robot nejdˇr´ıve sklon´ı pˇrepravn´ı rameno, ve kter´em zajist´ı n´aklad, a pot´e bude pokraˇcovat ve sledov´an´ı ˇcern´e ˇc´ary. Sledov´an´ı ˇc´ary se ukonˇc´ı, aˇz dotykov´e senzory um´ıstˇen´e na rameni detekuj´ı stˇenu, ˇc´ımˇz se zjist´ı, ˇze robot dojel do skladu. Pot´e robot kousek poodjede dozadu, aby mohl bezpeˇcnˇe zvednout pˇrepravn´ı rameno. N´aslednˇe postrˇc´ı objekt do skladu. Po tomto kroku se robot rozhodne jestli m´a pokraˇcovat a odv´est dalˇs´ı n´aklad. Pokud jiˇz odvezl oba n´aklady, tak pouze vyjede ze skladiˇstˇe a zastav´ı. V opaˇcn´em pˇr´ıpadˇe se otoˇc´ı o 180 stupˇ n˚ u a pojede k protˇejˇs´ı stˇenˇe. J´ızda k protˇ ejˇ s´ı stˇ enˇ e V t´eto ˇc´asti robot pojede k protˇejˇs´ı stˇenˇe, u kter´e se otoˇc´ı. Jelikoˇz v tomto okamˇziku by robot mˇel m´ıt zvednut´e pˇrepravn´ı rameno, tak se m˚ uˇze orientovat podle ultrazvukov´eho senzoru. Pokud v bl´ızkosti detekuje stˇenu, tak se otoˇc´ı o 90 stupˇ n˚ u doprava a zaˇcne znovu ˇca´st ”J´ızda k ˇca´ˇre”.
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE V´ yvojov´ e diagramy
Obr´azek 3.11: V´ yvojov´ y diagram pro skladiˇstˇe ˇ ast pro j´ızdu k ˇc´aˇre C´
Obr´azek 3.12: V´ yvojov´ y diagram pro ”Jed’ k ˇca´ˇre”
46
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE ˇ ast pro odvoz objektu do skladovac´ıho prostoru C´
Obr´azek 3.13: V´ yvojov´ y diagram pro ”Odvez objekt do skladovac´ıho prostoru” ˇ ast pro j´ızdu ke stˇenˇe C´
Obr´azek 3.14: V´ yvojov´ y diagram pro ”Jed’ ke stˇenˇe”
3.2.5
ˇ sen´ı v programovac´ım prostˇ Reˇ red´ı NXC
Metoda pro j´ızdu k ˇcern´e ˇc´aˇre void runToLine(){ int i = 0; while(i<10){ if(ReadCalibratedSensor() > BLACK_LINE_THRESHOLD){ OnFwdReg(OUT_AC, SPEED,1); } else{ i++; } } }
47
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE Metoda pro odvoz n´akladu void transportCargo(){ ... armDown(); while((checkBothTouchSensors() == false)){ followLine(); } RotateMotor(OUT_AC, SPEED, -100); armUp(); RotateMotor(OUT_AC, SPEED, 80); RotateMotor(OUT_AC, SPEED, -220); cargo ++; }
Metoda pro dojezd ke zdi void runToWall(){ while(SensorUS(IN_2)>DISTANCE_TO_WALL){ OnFwdReg(OUT_AC, SPEED,1); } }
Hlavn´ı metoda void go(){ ... while(cargo<2){ runToLine(); // Otoc se o 90 stupnu doprava RotateMotorEx(OUT_AC, 45, 220, 100, true, true); ... // Sleduj caru dokud nenarazis na objekt while(close<2){ followLine(); if(checkCloseDistance()){ close++; } } close = 0; transportCargo(); // Odvezl si uz dva objekty if(cargo>1){ break; } ... // Otoc se o 180 stupnu RotateMotorEx(OUT_AC, 45, 447, 100, true, true); runToWall(); // Otoc se o 90 stupnu doprava RotateMotorEx(OUT_AC, 45, 220, 100, true, true); ... } ... }
48
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
3.2.6
ˇ sen´ı v programovac´ım prostˇ Reˇ red´ı LeJOS NXJ
Metoda pro j´ızdu k ˇcern´e ˇc´aˇre Promˇenn´a i uˇzit´a jako parametr funkce while slouˇz´ı pro filtraci chyb senzoru. private void runToLine(){ int i = 0; while(i<12){ if(lightSensor.readValue() > BLACK_LINE_THRESHOLD){ pilot.steer(STRAIGHT_STEERING); } else{ i++; } } }
Metoda pro odvoz n´akladu private void transportCargo(){ ... armDown(); ... while((checkBothTouchSensors() == false)){ followLine(); } pilot.travel(-40); armUp(); pilot.travel(30); pilot.travel(-100); cargo ++; }
Metoda pro dojezd ke zdi private void runToWall(){ while(ultraSensor.getRange()>DISTANCE_TO_WALL){ pilot.steer(STRAIGHT_STEERING); } }
Hlavn´ı metoda Promˇenn´a close uˇzit´a jako parametr funkce while slouˇz´ı pro filtraci chyb senzoru. public void go(){ ... while(cargo<2){ runToLine(); pilot.rotate(90); ... // Sleduj caru dokud nenarazis na objekt while(checkCloseDistance()==false){ followLine(); } while(close<2){ followLine(); if(checkCloseDistance()){
49
ˇ ZN ˇ ´I ULOHY ´ KAPITOLA 3. SOUTE
50
close++; } } close = 0; transportCargo(); // Odvezl si uz dva objekty if(cargo>1){ break; } pilot.rotate(-190); runToWall(); pilot.rotate(90); } ... }
3.2.7
V´ ysledek
´ eˇsnˇe se podaˇrilo naprogramovat robota tak, aby pˇrem´ıstil oba pˇredmˇety (v naˇsem Uspˇ pˇr´ıpadˇe dva tenisov´e m´ıˇcky) do vyznaˇcen´ ych prostor. Z´aznam tohoto ˇreˇsen´ı lze shl´ednout na internetov´e str´ance [10]. Pˇrestoˇze byla u ´loha u ´spˇeˇsnˇe vyˇreˇsena, je tˇreba zm´ınit komplikace, kter´e vyvstaly pˇri pouˇzit´ı ultrazvukov´eho senzoru pro detekci pˇrepravovan´ ych pˇredmˇet˚ u. Ultrazvukov´ y senzor dok´aˇze spolehlivˇe mˇeˇrit vzd´alenost k nejbliˇzˇs´ı stˇenˇe, ale je nespolehliv´ y pro detekci menˇs´ıch objekt˚ u. Detekce, kter´a je implementov´ana ve v´ yˇse uveden´em programu je zaloˇzena na skuteˇcnosti, ˇze pokud je pˇredmˇet (v naˇsem pˇr´ıpadˇe tenisov´ y m´ıˇcek) pˇr´ıliˇs bl´ızko senzoru, tak senzor vrac´ı hodnotu 255. Pˇri pohledu do dokumentace zjist´ıme, ˇze ultrazvukov´ y senzor vrac´ı hodnotu 255 pouze v pˇr´ıpadˇe, ˇze v zorn´em poli senzoru nen´ı ˇza´dn´a pˇrek´aˇzka. Naˇse detekce je tedy zaloˇzena na paradoxu, ˇze pokud senzor nevid´ı ˇz´adnou pˇrek´aˇzku, tak je v jeho tˇesn´e bl´ızkosti (cca do 7 cm) pˇrepravovan´ y pˇredmˇet. Z toho d˚ uvodu nen´ı tato detekce pˇr´ıliˇs spolehliv´a. Detekovat pˇredmˇet pomoc´ı ostatn´ıch senzor˚ u je bohuˇzel nemoˇzn´e, protoˇze dotykov´e senzory nejsou dostateˇcnˇe citliv´e a svˇeteln´ y senzor je potˇreba pouˇz´ıt pro sledov´an´ı ˇca´ry. Pˇrestoˇze naˇse ˇreˇsen´ı nen´ı pˇr´ıliˇs spolehliv´e , tak se senzory, kter´e m´ame k dispozici, ˇza´dn´e jin´e patrnˇe neexistuje. Pˇrestoˇze to tedy nen´ı ide´aln´ı ˇreˇsen´ı, tak ˇza´dn´e jin´e, se senzory kter´e m´ame k dispozici, nejsp´ıˇse neexistuje.
Kapitola 4 Webov´ e str´ anky V r´amci bakal´aˇrsk´e pr´aci byly rovnˇeˇz vytvoˇreny webov´e str´anky o programov´an´ı v jazyce JAVA LeJOS a rovnˇeˇz o obou soutˇeˇzn´ıch u ´loh´ach. Pˇri tvorbˇe webov´ ych str´anek byly pouˇzity stejn´e kask´adov´e styly [14] a stejn´a hlaviˇcka [15], jak´e se vyskytuj´ı na jiˇz funguj´ıc´ıch webov´ ych str´ank´ach o robotech [16]. Bylo tak uˇcinˇeno z estetick´ ych d˚ uvod˚ u, protoˇze tyto novˇe vznikl´e webov´e str´anky budou k tˇem existuj´ıc´ım pˇrid´any. Celkem vznikly 3 soubory typu html (lejos navod.html, krizeni.html, skladiste.html ), kter´e obsahuj´ı n´avod pro programovac´ı prostˇred´ı JAVA LeJOS a dvˇe v´ yˇse uveden´e soutˇeˇzn´ı u ´lohy.
4.1
Webov´ a str´ anka: N´ avod pro JAVA LeJOS
Na t´eto webov´e str´ance se uˇzivatel dozv´ı, jak´e jsou v´ yhody a nev´ yhody jazyka LeJOS a celkov´e srovn´an´ı jednotliv´ ych programovac´ıch jazyk˚ u, ve kter´ ych je moˇzn´e NXT programovat. D´ale je uveden n´avod pro instalaci prostˇred´ı LeJOS a seznam jeho nejd˚ uleˇzitˇejˇs´ıch metod. V z´avˇeru str´anky jsou uvedeny odkazy na webov´e str´anky, kter´e se tak´e zab´ yvaj´ı LeJOS t´ematikou. Uk´azku t´eto webov´e str´anky je na obr´azku 4.1. Uk´azky ostatn´ıch str´anek nejsou z u ´sporn´ ych d˚ uvod˚ u pˇrid´any.
51
´ STRANKY ´ KAPITOLA 4. WEBOVE
52
Obr´azek 4.1: Uk´azka webov´e str´anky o n´avodu pro JAVA LeJOS
4.2
Webov´ a str´ anka: Sledov´ an´ı ˇ c´ ary s kˇ r´ıˇ zen´ım
Na webov´e str´ance o sledov´an´ı ˇca´ry s kˇr´ıˇzen´ım jsou uvedena pravidla a c´ıl t´eto u ´lohy. Rovnˇeˇz je pops´an a vyobrazen soutˇeˇzn´ı pl´an u ´lohy. Na z´avˇer jsou pro inspiraci uvedeny odkazy na internetov´e str´anky [8] a [9], kde je um´ıstˇeno video s u ´spˇeˇsn´ ym vyˇreˇsen´ım u ´lohy.
4.3
Webov´ a str´ anka: Skladiˇ stˇ e
Webov´a str´anka o u ´loze skladiˇstˇe je velmi podobn´a t´e pˇredchoz´ı. I zde jsou pops´ana pravidla a c´ıl u ´lohy, zobrazen soutˇeˇzn´ı pl´an a uveden odkaz na internetovou str´anku [10] s ˇreˇsen´ım u ´lohy.
Kapitola 5 Z´ avˇ er V t´eto pr´aci vznikl n´avod pro programovac´ı prostˇred´ı JAVA LeJOS, jak v podobˇe PDF souboru, tak v podobˇe webov´ ych str´anek a prezentace. Tento n´avod pokr´ yv´a z´akladn´ı, m´ırnˇe pokroˇcil´e a senzorov´e pˇr´ıkazy, se kter´ ymi se v tomto prostˇred´ı pracuje a na pˇr´ıkladech ilustruje jejich pouˇzit´ı. Programov´an´ı v JAVA LeJOS je pro znalce jazyka JAVA velmi pohodln´e, d´ıky pˇr´ıvˇetiv´emu prostˇred´ı NetBeans. Bohuˇzel se ale vyskytly pot´ıˇze s nˇekter´ ymi metodami, kter´e LeJOS nab´ız´ı. Nˇekter´e tu byly jiˇz zm´ınˇen´e. Jedn´a se o chyby ve firmwaru, kter´ y se jistˇe ˇcasem dolad´ı a probl´emy se odstran´ı. D´ale byly navrˇzeny dvˇe soutˇeˇzn´ı u ´lohy. Jedna s n´azvem Sledov´an´ı ˇca´ry s kˇr´ıˇzen´ım. Bylo uk´az´ano, ˇze tuto u ´lohu lze ˇreˇsit r˚ uzn´ ymi zp˚ usoby. Bud’ metodou sledov´an´ı jedn´e ˇca´ry, ve kter´e se uplatn´ı klasick´ y koncept ˇr´ızen´ı PD regul´atorem, nebo metodou Zig-Zag, kter´a vyuˇz´ıv´a moˇznost´ı obou ˇcern´ ych ˇcar. Ta se op´ır´a o spr´avn´e naladˇen´ı konstant a dobr´ y odhad v nastaven´ı u ´hlu pˇrej´ıˇzdˇen´ı. Druh´a metoda umoˇznila nastavit vyˇsˇs´ı rychlost robota d´ıky vyuˇzit´ı druh´e ˇc´ary, a t´ım se stala ˇcasovˇe efektivnˇejˇs´ı. Druh´a soutˇeˇzn´ı u ´loha, kter´a byla navrˇzena, byla nazv´ana Skladiˇstˇe. Tato u ´loha simuluje ˇ sen´ı se situaci, kter´a m˚ uˇze nastat ve skladu pˇri pˇrem´ıst’ov´an´ı jednotliv´ ych kus˚ u n´akladu. Reˇ op´ır´a o pˇresn´ y sled instrukc´ı, kter´e jsou postupnˇe vykon´av´any, jak robot proj´ıˇzd´ı skladem. Bohuˇzel toto ˇreˇsen´ı nar´aˇz´ı na nedokonalost pouˇzit´eho ultrazvukov´eho senzoru pˇri detekci mal´ ych objekt˚ u, jako je tenisov´ y m´ıˇcek. V praxi by toto omezen´ı pˇr´ıliˇs nevadilo, protoˇze se ve skladu obvykle pˇrev´aˇzej´ı mnohem vˇetˇs´ı objekty, neˇz je tenisov´ y m´ıˇcek nebo plechovka od n´apoje. Obˇe tyto u ´lohy byly vyˇreˇseny v programovac´ıch prostˇred´ıch LeJOS a NXC. V´ yvoj jednotliv´ ych program˚ u byl zevrubnˇe pops´an slovnˇe i formou v´ yvojov´ ych diagram˚ u a okomentovan´e zdrojov´e k´ody jsou k nalezen´ı v pˇr´ıloze na CD. V grafick´em prostˇred´ı NXT-G u ´lohy nebylo moˇzn´e naprogramovat, protoˇze byly pˇr´ıliˇs komplikovan´e a jejich 53
´ ER ˇ KAPITOLA 5. ZAV
54
zd´arn´e ˇreˇsen´ı vyˇzadovalo uˇzit´ı vyˇsˇs´ıho programovac´ıho jazyka. V pr´aci je rovnˇeˇz uvedeno hardwarov´e ˇreˇsen´ı obou u ´loh. Dokumentace o konstrukci robota byly pˇrevzaty z r˚ uzn´ ych internetov´ ych str´anek, na kter´e jsou uvedeny odkazy. Pˇr´ıpadn´e odliˇsnosti byly vysvˇetleny a v´ ysledky fotograficky zaznamen´any. Pro obˇe u ´lohy byly vytvoˇreny webov´e str´anky, kter´e seznamuj´ı se z´akladn´ımi pravidly a ukazuj´ı moˇzn´e ˇreˇsen´ı jednotliv´ ych u ´loh. Styl tˇechto webov´ ych str´anek byl vytvoˇren tak, aby se nechaly pˇridat k jiˇz existuj´ıc´ım internetov´ ym str´ank´am o pˇredmˇetu A3B99RO Roboti. Z toho d˚ uvodu byly pˇri tvorbˇe str´anek pouˇzity stejn´e kask´adov´e styly a stejn´a hlaviˇcka, jak´e jsou vyuˇzity na tˇechto internetov´ ych str´ank´ach.
Literatura [1] LeJOS,
Java
2010-05-03].
for
Lego
Introduction
to
Mindstorms leJOS
[online].
NXJ.
2006
Dostupn´e
[cit.
z
WWW:
hhttp://lejos.sourceforge.net/nxt/nxj/tutorial/Preliminaries/Intro.htmi. [2] ROBOTC.net [online].Carnegie Mellon University Robotics Academy, 2009 [cit. 2010-05-03]. Download ROBOTC for LEGO MINDSTORMS. Dostupn´e z WWW: hhttp://www.robotc.net/download/nxt/i. [3] Developer Resources for Java Technology [online]. c2010 [cit. 2010-05-03]. Java SE Downloads - Sun Developer Network (SDN). Dostupn´e z WWW: hhttp://java.sun.com/javase/downloads/index.jspi. [4] LeJOS, Java for Lego Mindstorms [online]. 2006 [cit. 2010-05-03]. NXJ Downloads. Dostupn´e z WWW: hhttp://lejos.sourceforge.net/nxj-downloads.phpi. [5] Welcome to NetBeans [online]. c2010 [cit. 2010-05-09]. Dostupn´e z WWW: hhttp://netbeans.org/i R [6] LEGO
MINDSTORMS
Education
NXT
Building
Instructions
[online].
R [s.l.] : LEGO, 2006 [cit. 2010-04-30]. LEGO MINDSTORMS Education
NXT
Building
Instructions
Driving
Base,
s.
.
Dostupn´e
z
WWW:
hhttp://cache.lego.com/downloads/education/BI Driving Base.pdfi. R [7] LEGO
Module
MINDSTORMS Down
[online].
Education [s.l.]
:
NXT
LEGO,
Building
2006
[cit.
Instructions
2010-04-30].
Light
R LEGO
MINDSTORMS Education NXT Building Instructions, s. . Dostupn´e z WWW: hhttp://cache.lego.com/downloads/education/BI Light Module Down.pdfi. [8] MARTINEC NXT
Line
Dan. Follower
Youtube With
[online]. Crossroad
2010 Race.
hhttp://www.youtube.com/watch?v=QWUiX Egaa0i. 55
[cit. Dostupn´e
2010-05-01]. z
WWW:
LITERATURA
56
[9] MARTINEC Dan. Youtube [online]. 2010 [cit. 2010-05-01]. NXT Zig-Zag Double
Line
Follower
With
Crossroad
Race.
Dostupn´e
z
WWW:
hhttp://www.youtube.com/watch?v=3MyySutVGHIi. [10] MARTINEC Warehouse
Dan.
Youtube
Automatic
[online].
Electric
Trolley
2010
[cit.
Displacer.
2010-05-07]. Dostupn´e
z
NXT WWW:
hhttp://www.youtube.com/watch?v=0myJS6ED-B4i. [11] ROBOTI [cit.
—
ˇ CVUT
2010-05-05].
-
Katedra
Fotogalerie
ˇr´ıd´ıc´ı
techniky
AMPER 2010.
[online].
Dostupn´e
z
2010 WWW:
hhttp://support.dce.felk.cvut.cz/roboti/fotogalerie/AMPER 2010/thumb.htmli. [12] NXT
Programs
-
Fun
Projects
for
your
LEGO
Mindstorms
NXT
[online]. 2007 [cit. 2010-05-04]. NXT Castor Bot. Dostupn´e z WWW: hhttp://www.nxtprograms.com/castor bot/steps.htmli. [13] NXT
Programs
-
Fun
Projects
for
your
LEGO
Mindstorms
NXT
[online]. 2007 [cit. 2010-05-04]. NXT Ball Hunter. Dostupn´e z WWW: hhttp://www.nxtprograms.com/ball hunter/steps.htmli. ˇ [14] ROBOTI — CVUT - Katedra ˇr´ıd´ıc´ı techniky [online]. 2009 [cit. 2010-05-05]. Roboti.css. Dostupn´e z WWW: hhttp://support.dce.felk.cvut.cz/roboti/roboti.cssi. ˇ [15] ROBOTI — CVUT - Katedra ˇr´ıd´ıc´ı techniky [online]. 2009 [cit. 2010-05-05]. Roboti head. Dostupn´e z WWW: hhttp://support.dce.felk.cvut.cz/roboti/img/head cs.jpgi. ˇ [16] ROBOTI — CVUT - Katedra ˇr´ıd´ıc´ı techniky [online]. 2009 [cit. 2010-05-05]. Dostupn´e z WWW: hhttp://support.dce.felk.cvut.cz/roboti/i.
Internetov´ e zdroje: [17] LeJOS, Java for Lego Mindstorms [online]. 2006 [cit. 2010-05-03]. Dostupn´e z WWW: hhttp://lejos.sourceforge.net/i. [18] LEGO.com MINDSTORMS : Home [online]. c2010 [cit. 2010-05-09]. Dostupn´e z WWW: hhttp://mindstorms.lego.com/en-us/default.aspxi [19] For LEGO Enthusiast’s: BrickEngineer [online]. 2008-09-05 [cit. 2010-05-09]. LEGO
NXT
Motor
Wiring
—
BrickEngineer.
Dostupn´e
z
WWW:
hhttp://www.brickengineer.com/pages/2008/09/05/lego-nxt-motor-wiring/i.
LITERATURA
57
[20] Team Hassenplug [online]. c2007 [cit. 2010-05-09]. NXT Programming Software. Dostupn´e z WWW: hhttp://www.teamhassenplug.org/NXT/NXTSoftware.htmli [21] Robot
Magazine
-
artificial
intelligence
Solutions
for
the
The
latest
[online]. LEGO
hobby,
science
c2009
[cit.
Mindstorms
and
consumer
2010-05-09].
NXT.
Dostupn´e
robotics,
Programming z
WWW:
hhttp://www.botmag.com/articles/10-31-07 NXT.shtmli R motor internals. Dostupn´ [22] Philo’s Home Page [online]. 2007 [cit. 2010-05-09]. NXT e
z WWW: hhttp://www.philohome.com/nxtmotor/nxtmotor.htmi [23] SLUKA,
Jim.
Controller
For
Jim
Sluka
Lego
[online].
Mindstorms
2009
[cit.
Robots.
2010-05-03].
Dostupn´e
z
PID WWW:
hhttp://www.inpharmix.com/jps/PID Controller For Lego Mindstorms Robots.htmli. [24] HANSEN, John. NBC/NXC - NeXT Byte Codes and Not eXactly C [online]. 2007-10-10 [cit. 2010-05-03]. The NXC Guide. Dostupn´e z WWW: hhttp://bricxcc.sourceforge.net/nbc/nxcdoc/NXC Guide.pdfi. [25] BENEDETTELLI, Danny. Programming Lego Robots using NXC [online]. 2007-10-10
[cit.
2010-06-07].
The
NXC
Guide.
Dostupn´e
z
WWW:
hhttp://bricxcc.sourceforge.net/nbc/nxcdoc/NXC Guide.pdfi.
Kn´ıˇ zn´ı zdroje: ´ [26] TROJANEK,
Pavel.
Vyuˇzit´ı robota
LEGO MINDSTORMS pˇri v´ yuce. ˇ e vysok´e uˇcen´ı technick´e v Praha, 2009. 94 s. Bakal´aˇrsk´a pr´ace. Cesk´ Praze, Fakulta elektrotechnick´a, Katedra ˇr´ıd´ıc´ı techniky. Dostupn´e z WWW: hhttp://support.dce.felk.cvut.cz/e-kurzy/file.php/24/BP Pavel Trojanek.pdfi.
[27] BAGNALL , Brian. Maximum LEGO NXT : Building Robots with Java Brains. 2nd edition. [s.l.] : Variant Press, 2010. 524 s. ISBN 0973864958, ISBN-13: 978-0973864953. [28] FERRARI, Mario; FERRARI, Guilio. Building Robots with LEGO Mindstorms NXT. Burlington (Massachusetts) : Syngress, 2007. 524 s. ISBN 1597491527, ISBN-13: 978-1597491525.
LITERATURA
58
[29] GASPERI, Michael; HURBAIN, Philippe E.; HURBAIN, Isabelle L. Extreme NXT : Extending the LEGO MINDSTORMS NXT to the Next Level. [s.l.] : Apress, 2007. 312 s. ISBN 1590598180, ISBN-13: 978-1590598184.
Pˇ r´ıloha A Pˇ r´ıloha CD K t´eto pr´aci je pˇriloˇzeno CD, na kter´em je uloˇzena elektronick´a verze t´eto pr´ace, vytvoˇren´e webov´e str´anky, vznikl´e zdrojov´e k´ody a videa dokumentuj´ıc´ı vyˇreˇsen´ı jednotliv´ ych u ´loh. • \Codes – \JAVA Tento adres´aˇr obsahuje vˇsechny zdrojov´e k´ody napsan´e v jazyce JAVA, kter´e byly pouˇzity v t´eto pr´aci. – \C V tomto adres´aˇri se nach´az´ı vˇsechny zdrojov´e k´ody napsan´e v jazyce NXC, kter´e byly pouˇzity v t´eto pr´aci. • \Documents Zde lze nal´ezt elektronickou verzi t´eto pr´ace, n´avod na instalaci LeJOS, uk´azky nejd˚ uleˇzitˇejˇs´ıch metod z prostˇred´ı LeJOS, prezentaci o prostˇred´ı LeJOS a naskenovan´e zad´an´ı bakal´aˇrsk´e pr´ace. • \Video Tento adres´aˇr obsahuje videa, kter´e dokumentuj´ı ˇreˇsen´ı jednotliv´ ych u ´loh. • \Web V tomto adres´aˇri jsou uloˇzeny webov´e str´anky vytvoˇren´e v r´amci t´eto pr´ace.
i