SYSTÉMOVÁ PRÍRUČKA - TUKE
SYSTÉMOVÁ PRÍRUČKA - TUKE SYSTÉMOVÁ PRÍRUČKA - TUKE
TECHNICKÁ UNIVERZITA V KOŠICIACH FAKULTA ELEKTROTECHNIKY A INFORMATIKY Katedra kybernetiky a umelej inteligencie Centrum pre inteligentné technológie SYSTÉMOVÁ PRÍRUČKA Vedúci diplomovej práce: Mária Virčíková Košice 2010 Prof. Ing. Peter Sinčák, PhD.
- Page 2 and 3: KKUI FEI Obsah Obsah ..............
- Page 4 and 5: KKUI FEI 1 Funkcia programu Uveden
- Page 6 and 7: KKUI FEI 2.2 Jazyk C++ Realizácia
- Page 8 and 9: KKUI FEI 3.1.1 Selekcia Obr. 2 Trie
- Page 10 and 11: KKUI FEI return children 3.1.4 Vytv
- Page 12 and 13: KKUI FEI 3.2.2 Vytvorenie hodnotiac
- Page 14 and 15: KKUI FEI myfile='C:\Program Files\W
- Page 16 and 17: KKUI FEI 120,120,0.0,1.0) parents[i
- Page 18 and 19: KKUI FEI } ] 0.760784 0.894118 0.99
- Page 20 and 21: KKUI FEI } controllerArgs "-p 54006
- Page 22 and 23: KKUI FEI backwardsMotion = new Moti
- Page 24 and 25: KKUI FEI } // red Nao opening his f
- Page 26 and 27: KKUI FEI inFile >> numrightShoulder
- Page 28 and 29: KKUI FEI inFile >> numrightElbowRol
- Page 30 and 31: KKUI FEI leftShoulderPitch->setPosi
- Page 32 and 33: KKUI FEI rightShoulderRoll->setPosi
- Page 34 and 35: KKUI FEI 3) môžeme napríklad zme
- Page 36 and 37: KKUI FEI s Windows systémami. Samo
TECHNICKÁ UNIVERZITA V KOŠICIACH<br />
FAKULTA ELEKTROTECHNIKY A INFORMATIKY<br />
Katedra kybernetiky a umelej inteligencie<br />
Centrum pre inteligentné technológie<br />
<strong>SYSTÉMOVÁ</strong> <strong>PRÍRUČKA</strong><br />
Vedúci diplomovej práce:<br />
Mária Virčíková<br />
Košice 2010<br />
Prof. Ing. Peter Sinčák, PhD.
KKUI FEI<br />
Obsah<br />
Obsah ................................................................................................................................ 2<br />
Zoznam obrázkov ............................................................................................................. 3<br />
1 Funkcia programu .......................................................................................................... 4<br />
2 Analýza riešenia ............................................................................................................. 5<br />
2.1 Jazyk Python ........................................................................................................... 5<br />
2.2 Jazyk C++ ............................................................................................................... 6<br />
2.3 Časti navrhnutého systému .................................................................................... 6<br />
3 Popis funkcií tried programu a výpis častí zdrojových kódov niektorých z nich .......... 7<br />
3.1 Evolučný algoritmus ............................................................................................... 7<br />
3.1.1 Selekcia ............................................................................................................ 8<br />
3.1.2 Kríženie ............................................................................................................ 8<br />
3.1.3 Mutácia ............................................................................................................ 9<br />
3.1.4 Vytvorenie novej generácie ........................................................................... 10<br />
3.2 GUI ....................................................................................................................... 10<br />
3.2.1 Hlavná funkcia programu .............................................................................. 11<br />
3.2.2 Vytvorenie hodnotiacej tabuľky .................................................................... 12<br />
3.2.3 Uloženie hodnôt fitness priradených užívateľom .......................................... 13<br />
3.2.4 Načítanie súboru s fenotypom ....................................................................... 13<br />
3.2.5 Zápis fenotypov všetkých tancov do súboru .................................................. 13<br />
3.2.6 Zápis fenotypov jednotlivých tancov do súboru ............................................ 14<br />
3.2.7 Normalizácia hodnôt fenotypu ....................................................................... 15<br />
3.2.8 Vytvorenie počiatočnej populácie ................................................................. 15<br />
3.2.9 Prevedenie fenotypu do binárnej formy ......................................................... 15<br />
3.3 Modelovanie robotov a ich prostredia .................................................................. 17<br />
3.3 Prevedenie tanca ................................................................................................... 20<br />
3.4 Simulátor Choreographe ....................................................................................... 33<br />
4 Preklad programu ......................................................................................................... 35<br />
4.1 Požiadavky na technické prostriedky ................................................................... 35<br />
4.2 Požiadavky na programové prostriedky ............................................................... 35<br />
4.3 Technické pozadie ................................................................................................ 36<br />
5. Zhodnotenie riešenia ................................................................................................... 37<br />
Príloha D: Systémová príručka 2
KKUI FEI<br />
Zoznam obrázkov<br />
Obr. 1 Genetický algoritmus systému, ktorý bol realizovaný v jazyku v Python: schéma<br />
jednotlivých časti algoritmu .............................................................................................. 7<br />
Obr. 2 Trieda evolúcia a jej funkcie ................................................................................. 8<br />
Obr. 3 Súbor pre tvorenie GUI (grafické užívateľské prostredie) a funkcie .................. 11<br />
Obr. 4 Hodnotiaca tabuľka.............................................................................................. 12<br />
Obr. 5 Model prostredia robotov ................................................................................... 17<br />
Príloha D: Systémová príručka 3
KKUI FEI<br />
1 Funkcia programu<br />
Uvedený programový systém predstavuje implementáciu interaktívneho genetického<br />
algoritmu pre generovanie tanca robota Naa.<br />
Tvorenie a navrhovanie tanečných choreografií patrí medzi aplikácie, u<br />
ktorých je veľmi ťažké, niekedy nemožné hodnotiace funkcie vyjadriť numericky –<br />
alebo aspoň kvantitatívne. Nevieme špecifikovať optimalizačné parametre procesu,<br />
pretože kritériá pri takýchto systémoch sú subjektívne, to znamená, že sú závislé od<br />
konkrétneho posudzovateľa. Výstupy takého systému závisia od preferencií, zmyslov,<br />
emócií a porozumení človeka. V interaktívnych evolučných výpočtoch je funkcia<br />
vhodnosti nahradená ľudským užívateľom.<br />
Implementácia zahŕňa používateľské rozhranie, ktoré umožňuje:<br />
Proces interaktívnej evolúcie tanečných sekvencií, kde užívateľ predstavuje<br />
dôležitý faktor ovplyvňujúci budúce generácie tancov. Interaktívny genetický<br />
algoritmus je optimalizačný nástroj, ktorý využíva kooperáciu človeka a počítača, to<br />
znamená, že systém sa vyvíja na základe hodnotenia, ktoré predstavuje subjektívne<br />
hodnotenie získané od človeka (funkcia vhodnosti) ako hodnotenie vzdialenosti medzi<br />
vlastnou predstavou a výstupom optimalizačného procesu v psychologickom priestore.<br />
Príloha D: Systémová príručka 4
KKUI FEI<br />
2 Analýza riešenia<br />
Teoretický základ riešenia a jeho základný framework je popísaný v hlavnej časti<br />
diplomovej práce.<br />
2.1 Jazyk Python<br />
Evolučný algoritmus bol riešený v programovacom jazyku Python.<br />
Niektoré vlastnosti jazyka Python sú:<br />
- interpretovaný,<br />
- interaktívny,<br />
- objektovo–orientovaný,<br />
- dynamicky napísaný,<br />
- flexibilný,<br />
- expresívny,<br />
- dobre čitateľný<br />
- podpora viac programovacích paradigiem – možné použitie<br />
procedurálneho, funkčného a objektovo–orientovaného programovania<br />
Viacero výhod hovorilo pre jeho použitie, stačí spomenúť nasledujúce výhody:<br />
- prehľadnosť zdrojových kódov – elegantná syntax,<br />
- existujúce podporné knižnice,<br />
- rýchlu krivku implementácie,<br />
- ľahko sa učí,<br />
- vhodný na veľké projekty,<br />
- prostredie,<br />
- jazyk k dispozícii ako Open Source,<br />
- veľké množstvo dostupných vývojových prostredí,<br />
- veľmi dobre zdokumentované triedy a metódy s dostupným množstvom<br />
konzultácii a ukážkových zdrojových kódov,<br />
- veľká komunita ľudí, ktorí sa tomuto jazyku venujú,<br />
- jeho dobrá podpora u najpopulárnejších operačných systémov.<br />
Príloha D: Systémová príručka 5
KKUI FEI<br />
2.2 Jazyk C++<br />
Realizácia tanca bola riešená priamo v simulátore Webots, ktorý je popísaný v hlavnej<br />
časti diplomovej práce. Použitý programovací jazyk bol C++.<br />
V porovnaní z jazykom C, C++ prináša nové vlastnosti, vrátane deklarácii,<br />
pretypovanie so syntaxou funkcií, new/delete, bool, referencie, inline funkcie,<br />
implicitné argumenty, preťaženie funkcií, priestory mien, triedy (zo všetkými ich črtami<br />
ako dedičnosť, členské funkcie, virtuálne funkcie, abstraktné triedy a konštruktory),<br />
preťaženie operátorov, atď.<br />
2.3 Časti navrhnutého systému<br />
Navrhnutý systém robotického tanca sa skladá z dvoch častí.<br />
1) Prvá časť predstavuje samotný evolučný algoritmus, ktorý je napísaný<br />
v jazyku Python a výstupom z neho je chromozóm obsahujúci nastavenie<br />
jednotlivých kĺbov robota.<br />
2) Druhá časť riešenia návrhu je realizovaná v simulačnom prostredí<br />
Webots, ktorého podrobnejší popis je uvedený v podkapitole 4.3.<br />
Výsledný tanec je ukázaný pre sedem robotov, ktorých sekvencia<br />
tanečných krokov predstavuje sedem najlepších jedincov z evolúcie.<br />
Celkový postup riešenia je možné zhrnúť do týchto bodov:<br />
1. implementácia genetického algoritmu,<br />
2. realizácia simulátora robotov,<br />
3. realizácia experimentov<br />
Príloha D: Systémová príručka 6
KKUI FEI<br />
3 Popis funkcií tried programu a výpis častí zdrojových<br />
kódov niektorých z nich<br />
3.1 Evolučný algoritmus<br />
Schéma evolučného algoritmu je na Obr. 1:<br />
Obr. 1 Genetický algoritmus systému, ktorý bol realizovaný v jazyku v Python: schéma<br />
jednotlivých časti algoritmu<br />
Samotný zdrojový kód sa skladá z funkcií, ktoré sú časťami predchádzajúcej<br />
schémy. Evolučný algoritmus je súbor pod názvom evolution.py.<br />
Trieda evolúcia class Evolucia je zložená zo šiestich funkcií (Obr. 2):<br />
Príloha D: Systémová príručka 7
KKUI FEI<br />
3.1.1 Selekcia<br />
Obr. 2 Trieda evolúcia a jej funkcie<br />
Vyberieme dvoch náhodných jedincov z populácie a porovnáme ich fitness. Jedinec,<br />
ktorý má z tejto dvojice vyššiu fitness, vyhráva a stáva sa rodičom. Táto metóda, ako je<br />
uvedené v hlavnej časti diplomovej práce sa volá binárny turnaj.<br />
3.1.2 Kríženie<br />
def selection1(self):<br />
a = random.randrange(0,len(self.parents),1)<br />
b = random.randrange(0,len(self.parents),1)<br />
if self.fitnes[a]>self.fitnes[b]:<br />
else:<br />
parent1 = self.parents[a]<br />
parent1 = self.parents[b]<br />
return parent1<br />
def selection(self):<br />
parent1 = self.selection1()<br />
parent2 = self.selection1()<br />
return [parent1, parent2]<br />
Vytvorí sa maska, čo je vlastne reťazec rovnakej dĺžky ako chromozóm. Na každom<br />
bite v maske je náhodne generovaná nula alebo jednotka. Jedinec sa vyberá nasledovne:<br />
Príloha D: Systémová príručka 8
KKUI FEI<br />
- Ak je na príslušnom bite v maske 0, vyberá bit z prvého jedinca.<br />
- Ak je v maske 1, zoberie sa bit z druhého jedinca.<br />
Takýto spôsob kríženia sa nazýva uniformné.<br />
3.1.3 Mutácia<br />
def crossover(self):<br />
i = 0<br />
newparents = self.selection()<br />
uniMaska = []<br />
while (i < self.dlzka):<br />
i = 0<br />
a = random.randrange(0,2,1)<br />
uniMaska.append(a)<br />
i = i + 1<br />
child = []<br />
for i in range(0,self.dlzka):<br />
if (uniMaska[i] == 0):<br />
else:<br />
return child<br />
child.append(newparents[0][i])<br />
child.append(newparents[1][i])<br />
Mutácia je nastavená na 80 percent, to znamená, že toľko jedincov po krížení sa<br />
zmutuje, ale len v malom okolí toho génu, ktoré je nastavené na 10 percent.<br />
def mutate(self,children):<br />
prav_mutacie=80<br />
for i in range(0,len(children)):<br />
a = random.randrange(0,100,1)<br />
if prav_mutacie > a :<br />
for j in range(0,self.dlzka):<br />
b=random.uniform(-10,10)<br />
hodnota=children[i][j]+b<br />
children[i][j]=hodnota<br />
if hodnota >1:<br />
children[i][j]=1.0<br />
if hodnota < 0:<br />
Príloha D: Systémová príručka 9
KKUI FEI<br />
return children<br />
3.1.4 Vytvorenie novej generácie<br />
3.2 GUI<br />
def makeChildren(self):<br />
self.children=[]<br />
children[i][j]=0.0<br />
for i in range(0,self.velkost_pop):<br />
self.children.append(self.crossover())<br />
# print self.children<br />
def createNewPop(self):<br />
self.makeChildren()<br />
self.newPopCrossed = []<br />
self.newPop = []<br />
i = 0<br />
for i in range(0,len(self.parents)):<br />
# print a<br />
a = random.randrange(0,len(self.parents),1)<br />
x = random.randrange(0,2,1)<br />
if x == 1:<br />
else:<br />
self.newPopCrossed.append(self.children[a])<br />
self.newPopCrossed.append(self.parents[a])<br />
self.newPop = self.mutate(self.newPopCrossed)<br />
return self.newPop<br />
Vytvorenie grafického užívateľského rozhrania je súbor pod názvom gui.py.<br />
Gui.py obsahuje nasledujúce funkcie (Obr. 3):<br />
Príloha D: Systémová príručka 10
KKUI FEI<br />
Obr. 3 Súbor pre tvorenie GUI (grafické užívateľské prostredie) a funkcie<br />
3.2.1 Hlavná funkcia programu<br />
Keď užívateľ stlačí tlačidlo evolution na hodnotiacej tabuľke, ktorá na obrázku „Obr.<br />
4“, spustí sa funkcia evol_callback.<br />
Načítajú sa vhodnosti, ktoré užívateľ priradil jedincom, potom sú chromozómy<br />
znormované a zapísané do súborov.<br />
def evol_callback():<br />
print 'Old Generation:'<br />
print initial_pop<br />
fitnes = fitness(f1,f2,f3,f4,f5,f6,f7)<br />
parents = chrom2parents()<br />
print 'New - After Evolution:'<br />
call = evolution.Evolucia(parents, fitnes).createNewPop()<br />
jedinci=parents2chrom(call)<br />
krok = 0<br />
for i in jedinci:<br />
krok = krok + 1;<br />
print 'gen = '<br />
print krok<br />
print i<br />
zapisAllgene(jedinci)<br />
zapisEachgene(jedinci)<br />
Príloha D: Systémová príručka 11
KKUI FEI<br />
3.2.2 Vytvorenie hodnotiacej tabuľky<br />
Tabuľka, na ktorej užívateľ hodnotí predvedené tance robotov, sa skladá z<br />
- 1) farebných rámov, na základe ktorých vie, robota akej farby hodnotí a<br />
- 2) z radiobuttunov, kde im priradí známky od 1 do 5.<br />
Príklad zdrojových kódov jednotlivých častí:<br />
1)<br />
frame0 = Tkinter.Frame(root,<br />
background="white",borderwidth=5,height=800,width=500)<br />
frame0.grid(column=0,row=0)<br />
frame0.pack(side=TOP,expand=NO)<br />
2)<br />
Radiobutton(frame1, text='1',font=('times', 12), variable=f1,<br />
anchor=SW, fill = 'y')<br />
value=3, background="white").pack(side=LEFT,<br />
Obr. 4 Hodnotiaca tabuľka<br />
Príloha D: Systémová príručka 12
KKUI FEI<br />
3.2.3 Uloženie hodnôt fitness priradených užívateľom<br />
Z hodnotiacej tabuľky sa vyberú priradené hodnoty fitness a uložia sa do premenných.<br />
def fitness(f1,f2,f3,f4,f5,f6,f7):<br />
fitnes=[f1.get(),f2.get(),f3.get(),f4.get(),f5.get(),f6.get()<br />
,f7.get()]<br />
return fitnes<br />
3.2.4 Načítanie súboru s fenotypom<br />
def nacitajGene():<br />
nazov='C:\Program<br />
Files\Webots\projects\contests\\nao_robocup\controllers\\nao_<br />
soccer_player_blue\\all_gene.csv'<br />
a=open(nazov)<br />
k=a.read()<br />
a.close()<br />
zoznam2 = k.split("\n")<br />
zoznam3=[]<br />
for i in zoznam2:<br />
zoznam3.append(i.split(","))<br />
zoznam5=[]<br />
index=0<br />
for riadok in zoznam3:<br />
zoznam4=[]<br />
for clen in riadok:<br />
zoznam4.append(int(clen))<br />
zoznam5 = zoznam5 + [0]<br />
zoznam5[index] = zoznam4<br />
index=index+1<br />
return zoznam5<br />
3.2.5 Zápis fenotypov všetkých tancov do súboru<br />
def zapisAllgene(jedinci):<br />
Príloha D: Systémová príručka 13
KKUI FEI<br />
myfile='C:\Program<br />
Files\Webots\projects\contests\\nao_robocup\controllers\\nao_<br />
soccer_player_blue\\all_gene.csv'<br />
file = open(myfile,"w")<br />
krok1=0<br />
for i in jedinci:<br />
krok=0<br />
for j in i:<br />
if krok
KKUI FEI<br />
3.2.7 Normalizácia hodnôt fenotypu<br />
Je dôležité znormalizovať hodnoty fenotypu, ktoré predstavujú hodnoty rozpätia kĺbov<br />
robota Naa, pretože každý kĺb má iné možné rozpätie udané v uhloch.<br />
def normalize(x,a1,a2,b1,b2):<br />
return (float(b1) + ((float(x) - float(a1)) * (float(b2)<br />
- float(b1))/(float(a2)-float(a1))))<br />
def normalize2(x,a1,a2,b1,b2):<br />
return int(float(b1) + ((float(x) - float(a1)) *<br />
(float(b2) - float(b1))/(float(a2)-float(a1))))<br />
3.2.8 Vytvorenie počiatočnej populácie<br />
def initial():<br />
for i in range(0,velkost_pop):<br />
initial_pop.append([random.uniform(0,1)])<br />
for j in range(0, dlzkajedinca-1):<br />
return initial_pop<br />
initial_pop[i].append(random.uniform(0,1))<br />
3.2.9 Prevedenie fenotypu do binárnej formy<br />
def chrom2parents():<br />
chromosome = nacitajGene()<br />
parents = chromosome<br />
for i in range(0,len(parents)):<br />
120,120,0.0,1.0)<br />
45,45,0.0,1.0)<br />
for j in range(0, dlzkajedinca):<br />
if j == 0 or j == 10:<br />
parents[i][j] = normalize(chromosome[i][j],-<br />
if j == 1 or j == 11:<br />
parents[i][j] = normalize(chromosome[i][j],-<br />
if j == 2 or j == 12:<br />
Príloha D: Systémová príručka 15
KKUI FEI<br />
120,120,0.0,1.0)<br />
parents[i][j] = normalize(chromosome[i][j],-<br />
if j == 3 or j == 13:<br />
parents[i][j] =<br />
normalize(chromosome[i][j],0,95,0.0,1.0)<br />
120,120,0.0,1.0)<br />
90,0,0.0,1.0)<br />
120,120,0.0,1.0)<br />
95,0,0.0,1.0)<br />
120,120,0.0,1.0)<br />
if j == 4 or j == 14:<br />
parents[i][j] = normalize(chromosome[i][j],-<br />
if j == 5 or j == 15:<br />
parents[i][j] = normalize(chromosome[i][j],-<br />
if j == 6 or j == 16:<br />
parents[i][j] = normalize(chromosome[i][j],-<br />
if j == 7 or j == 17:<br />
parents[i][j] = normalize(chromosome[i][j],-<br />
if j == 8 or j == 18:<br />
parents[i][j] = normalize(chromosome[i][j],-<br />
if j == 9 or j == 19:<br />
parents[i][j] =<br />
normalize(chromosome[i][j],0,90,0.0,1.0)<br />
return parents<br />
Príloha D: Systémová príručka 16
KKUI FEI<br />
3.3 Modelovanie robotov a ich prostredia<br />
#VRML_SIM V6.0 utf8<br />
WorldInfo {<br />
}<br />
info [<br />
]<br />
Obr. 5 Model prostredia robotov<br />
"Simulation of Robotic Dance"<br />
"Author: Maria Vircikova"<br />
"Webpage: http://neuron.tuke.sk/~maria.vircik"<br />
"Last modification: May, 1, 2010"<br />
title "Robotdance"<br />
basicTimeStep 40<br />
runRealTime TRUE<br />
Viewpoint {<br />
}<br />
fieldOfView 1.2755<br />
orientation -0.0965735 0.971364 0.217084 2.33838<br />
position 2.24403 1.47012 -2.34318<br />
Background {<br />
skyColor [<br />
Príloha D: Systémová príručka 17
KKUI FEI<br />
}<br />
]<br />
0.760784 0.894118 0.996078<br />
DirectionalLight {<br />
}<br />
ambientIntensity 1.6<br />
direction -0.5 -2 -0.5<br />
intensity 0.3<br />
castShadows TRUE<br />
DirectionalLight {<br />
}<br />
ambientIntensity 1.6<br />
direction 0.5 -0.5 0.5<br />
intensity 0.5<br />
SoccerField {<br />
}<br />
DEF RED_PLAYER NaoV3R {<br />
}<br />
translation 0.698051 0.333275 0.139582<br />
rotation -0.0034669 0.999992 0.0020113 1.56118<br />
color 1 0 0<br />
channel 1<br />
texture [<br />
]<br />
"textures/button_red.png"<br />
controller "nao_soccer_player_blue"<br />
controllerArgs "-p 54100"<br />
synchronization FALSE<br />
name "Red Nao"<br />
windowPosition 0 1<br />
DEF GREEN_PLAYER NaoV3R {<br />
translation 0.468576 0.33345 -1.84979<br />
rotation -0.00903998 0.999916 0.00932435 1.57664<br />
color 0 1 0<br />
texture [<br />
]<br />
"textures/button_green.png"<br />
controller "nao_soccer_player_blue"<br />
controllerArgs "-p 54002"<br />
synchronization FALSE<br />
name "Green Nao"<br />
Príloha D: Systémová príručka 18
KKUI FEI<br />
}<br />
DEF PURPLE_PLAYER NaoV3R {<br />
}<br />
translation 0.995693 0.33317 -0.899636<br />
rotation -0.00596175 0.999957 0.00715972 1.56125<br />
color 0.501961 0 1<br />
texture [<br />
]<br />
"textures/button_purple.png"<br />
controller "nao_soccer_player_blue"<br />
controllerArgs "-p 54003"<br />
synchronization FALSE<br />
name "Purple Nao"<br />
DEF YELLOW_PLAYER NaoV3R {<br />
}<br />
translation 0.297939 0.333264 -1.00003<br />
rotation -0.00307572 0.999991 0.00287274 1.5788<br />
color 1 1 0<br />
texture [<br />
]<br />
"textures/button_yellow.png"<br />
controller "nao_soccer_player_blue"<br />
controllerArgs "-p 54004"<br />
synchronization FALSE<br />
name "Yellow Nao"<br />
DEF MAGENTA_PLAYER NaoV3R {<br />
}<br />
translation -0.00180376 0.333257 -0.000237291<br />
rotation -0.00309718 0.999992 0.0023397 1.57889<br />
color 1 0.501961 0.752941<br />
texture [<br />
]<br />
"textures/button_magenta.png"<br />
controller "nao_soccer_player_blue"<br />
controllerArgs "-p 54005"<br />
synchronization FALSE<br />
name "Magenta Nao"<br />
DEF BLUE_PLAYER NaoV3R {<br />
translation -0.201804 0.333317 -1.30072<br />
rotation -0.00351928 0.999993 0.000959317 1.57746<br />
controller "nao_soccer_player_blue"<br />
Príloha D: Systémová príručka 19
KKUI FEI<br />
}<br />
controllerArgs "-p 54006"<br />
synchronization FALSE<br />
name "Blue Nao"<br />
DEF BLUE_ORANGE NaoV3R {<br />
}<br />
translation 1.3982 0.333257 -0.20024<br />
rotation -0.00312027 0.999992 0.00234169 1.57011<br />
color 1 0.5 0<br />
texture [<br />
]<br />
"textures/button_orange.png"<br />
controller "nao_soccer_player_blue"<br />
controllerArgs "-p 54007"<br />
synchronization FALSE<br />
name "Orange Nao"<br />
3.3 Prevedenie tanca<br />
Zdrojový kód obsahuje komentáre, ktoré by mali uľahčiť orientáciu v ňom prípadným<br />
vývojárom.<br />
#include "GoalKeeper.hpp"<br />
#include "NaoCam.hpp"<br />
//using webots hpp files for inicialization of Servos<br />
#include <br />
#include <br />
#include <br />
// header file which is used for input/output<br />
#include <br />
using std::cerr;<br />
using std::cout;<br />
using std::endl;<br />
// header file for exit function<br />
#include <br />
Príloha D: Systémová príručka 20
KKUI FEI<br />
// time header<br />
#include <br />
// to read from files<br />
#include <br />
using std::ifstream;<br />
// webots namespace<br />
using namespace webots;<br />
//inicialization of variables<br />
const int SIMULATION_STEP = 200;<br />
int numheadYaw;<br />
int numHeadPitch;<br />
int numleftShoulderPitch;<br />
int numleftShoulderRoll;<br />
int numleftElbowYaw;<br />
int numleftElbowRoll;<br />
int numrightShoulderPitch;<br />
int numrightShoulderRoll;<br />
int numrightElbowYaw;<br />
int numrightElbowRoll;<br />
int numheadYaw2;<br />
int numHeadPitch2;<br />
int numleftShoulderPitch2;<br />
int numleftShoulderRoll2;<br />
int numleftElbowYaw2;<br />
int numleftElbowRoll2;<br />
int numrightShoulderPitch2;<br />
int numrightShoulderRoll2;<br />
int numrightElbowYaw2;<br />
int numrightElbowRoll2;<br />
GoalKeeper::GoalKeeper(int playerID) : Player(playerID) {<br />
rightStepsCount = 0;<br />
// load motions<br />
Príloha D: Systémová príručka 21
KKUI FEI<br />
backwardsMotion = new<br />
Motion("../motions/Backwards.motion");<br />
forwards50Motion = new<br />
Motion("../motions/Forwards50.motion");<br />
sideStepRightMotion = new<br />
Motion("../motions/SideStepRight.motion");<br />
sideStepLeftMotion = new<br />
Motion("../motions/SideStepLeft.motion");<br />
}<br />
GoalKeeper::~GoalKeeper() {<br />
}<br />
delete forwards50Motion;<br />
delete backwardsMotion;<br />
delete sideStepLeftMotion;<br />
delete sideStepRightMotion;<br />
void GoalKeeper::stepRight() {<br />
}<br />
playMotion(sideStepRightMotion);<br />
rightStepsCount++;<br />
void GoalKeeper::stepLeft() {<br />
}<br />
playMotion(sideStepLeftMotion);<br />
rightStepsCount--;<br />
//"main function"<br />
void GoalKeeper::run()<br />
{<br />
srand((unsigned)time(0));<br />
//const int STEP = 100;<br />
for(int i = 1; i < SIMULATION_STEP; i++)<br />
{<br />
//enabling the Servos (motors used for our motion)<br />
Servo *HeadYaw = getServo("HeadYaw");<br />
Servo *HeadPitch = getServo("HeadPitch");<br />
Príloha D: Systémová príručka 22
KKUI FEI<br />
Servo *leftShoulderPitch = getServo("LShoulderPitch");<br />
Servo *rightShoulderPitch = getServo("RShoulderPitch");<br />
Servo *leftShoulderRoll = getServo("LShoulderRoll");<br />
Servo *rightShoulderRoll = getServo("RShoulderRoll");<br />
Servo *leftElbowYaw = getServo("LElbowYaw");<br />
Servo *rightElbowYaw = getServo("RElbowYaw");<br />
Servo *leftElbowRoll = getServo("LElbowRoll");<br />
Servo *rightElbowRoll = getServo("RElbowRoll");<br />
//this we now dont use, we can comment this part of code<br />
/*Servo *leftHipRoll = getServo("LHipRoll");<br />
Servo *rightHipRoll = getServo("RHipRoll");<br />
Servo *leftHipPitch = getServo("LHipPitch");<br />
Servo *rightHipPitch = getServo("RHipPitch");<br />
Servo *leftKneePitch = getServo("LKneePitch");<br />
Servo *rightKneePitch = getServo("RKneePitch");<br />
Servo *leftAnklePitch = getServo("LAnklePitch");<br />
Servo *rightAnklePitch = getServo("RAnklePitch");<br />
Servo *leftHipYawPitch = getServo("LHipYawPitch");<br />
Servo *rightHipYawitch = getServo("RHipYawPitch");*/<br />
//every robot has its name<br />
const std::string robot_name = getName();<br />
//ifstream provides an interface to read data from files as<br />
input streams.<br />
ifstream inFile;<br />
// every robot opens his file - for orange robot:<br />
if (robot_name == "Orange Nao")<br />
{<br />
// opening the file<br />
inFile.open("gene1.csv");<br />
Príloha D: Systémová príručka 23
KKUI FEI<br />
}<br />
// red Nao opening his file<br />
if (robot_name == "Red Nao")<br />
}<br />
{<br />
{<br />
inFile.open("gene2.csv");<br />
// magenta Nao opening his file<br />
if (robot_name == "Magenta Nao")<br />
inFile.open("gene3.csv");<br />
}<br />
// purple Nao opening his file<br />
if (robot_name == "Purple Nao")<br />
{<br />
inFile.open("gene4.csv");<br />
}<br />
// yellow Nao opening his file<br />
if (robot_name == "Yellow Nao")<br />
{<br />
inFile.open("gene5.csv");<br />
}<br />
// blue Nao opening his file<br />
{<br />
if (robot_name == "Blue Nao")<br />
inFile.open("gene6.csv");<br />
}<br />
// green Nao opening his file<br />
{<br />
if (robot_name == "Green Nao")<br />
inFile.open("gene7.csv");<br />
}<br />
// if some file cant be read<br />
if (inFile.fail()) {<br />
cerr
KKUI FEI<br />
}<br />
exit(1);<br />
// move to the start of the file<br />
inFile.seekg(0, ios::beg);<br />
inFile >> numheadYaw ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 1st position (2nd number) of the file<br />
inFile.seekg(1, ios::beg);<br />
inFile >> numHeadPitch ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 2nd position (3nd number) of the file<br />
inFile.seekg(2, ios::beg);<br />
inFile >> numleftShoulderPitch;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 3rd position (4th number) of the file<br />
inFile.seekg(3, ios::beg);<br />
inFile >> numleftShoulderRoll ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 4th position (5th number) of the file<br />
inFile.seekg(4, ios::beg);<br />
inFile >> numleftElbowYaw ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 5th position (6th number) of the file<br />
inFile.seekg(5, ios::beg);<br />
inFile >> numleftElbowRoll;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 6th position (7th number) of the file<br />
inFile.seekg(6, ios::beg);<br />
Príloha D: Systémová príručka 25
KKUI FEI<br />
inFile >> numrightShoulderPitch ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 7th position (8th number) of the file<br />
inFile.seekg(7, ios::beg);<br />
inFile >> numrightShoulderRoll ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 8th position (9th number) of the file<br />
inFile.seekg(8, ios::beg);<br />
inFile >> numrightElbowYaw ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 9th position (10th number) of the file<br />
inFile.seekg(9, ios::beg);<br />
inFile >> numrightElbowRoll ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 10th position (11th number) of the file<br />
inFile.seekg(10, ios::beg);<br />
inFile >> numheadYaw2 ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 11th position (12th number) of the file<br />
inFile.seekg(11, ios::beg);<br />
inFile >> numHeadPitch2 ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 12th position (13th number) of the file<br />
inFile.seekg(12, ios::beg);<br />
inFile >> numleftShoulderPitch2;<br />
// forget we hit the end of file<br />
Príloha D: Systémová príručka 26
KKUI FEI<br />
inFile.clear();<br />
// move to the 13th position (14th number) of the file<br />
inFile.seekg(13, ios::beg);<br />
inFile >> numleftShoulderRoll2 ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 14th position (15th number) of the file<br />
inFile.seekg(14, ios::beg);<br />
inFile >> numleftElbowYaw2 ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 15th position (16th number) of the file<br />
inFile.seekg(15, ios::beg);<br />
inFile >> numleftElbowRoll2;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 16th position (17th number) of the file<br />
inFile.seekg(16, ios::beg);<br />
inFile >> numrightShoulderPitch2 ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 17th position (18th number) of the file<br />
inFile.seekg(17, ios::beg);<br />
inFile >> numrightShoulderRoll2 ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 18th position (19th number) of the file<br />
inFile.seekg(18, ios::beg);<br />
inFile >> numrightElbowYaw2 ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// move to the 19th position (20th number) of the file<br />
inFile.seekg(19, ios::beg);<br />
Príloha D: Systémová príručka 27
KKUI FEI<br />
inFile >> numrightElbowRoll2 ;<br />
// forget we hit the end of file<br />
inFile.clear();<br />
// closing the file<br />
inFile.close();<br />
//here we start the simulation of dance<br />
// every number in file is a part of fenotype of each robot<br />
// it means position in angles of each servo<br />
//first position for head yaw servo<br />
HeadYaw->setPosition(numheadYaw);<br />
step(SIMULATION_STEP);<br />
//first position for head pitch servo<br />
HeadPitch->setPosition(numHeadPitch);<br />
step(SIMULATION_STEP);<br />
HeadYaw->setPosition(0);<br />
HeadPitch-> setPosition(0);<br />
//first position for left shoulder pitch servo<br />
leftShoulderPitch->setPosition(numleftShoulderPitch);<br />
step(SIMULATION_STEP);<br />
leftShoulderPitch->setPosition(0);<br />
//first position for left shoulder roll servo<br />
leftShoulderRoll->setPosition(numleftShoulderRoll);<br />
step(SIMULATION_STEP);<br />
leftShoulderRoll->setPosition(0);<br />
//first position for left elbow yaw servo<br />
leftElbowYaw->setPosition(numleftElbowYaw);<br />
Príloha D: Systémová príručka 28
KKUI FEI<br />
step(SIMULATION_STEP);<br />
//first position for left elbow row servo<br />
leftElbowRoll->setPosition(numleftElbowRoll);<br />
step(SIMULATION_STEP);<br />
leftElbowRoll->setPosition(0);<br />
//first position for right shoulder pitch servo<br />
rightShoulderPitch->setPosition(numrightShoulderPitch);<br />
step(SIMULATION_STEP);<br />
rightShoulderPitch->setPosition(0);<br />
//first position for right shoulder roll servo<br />
rightShoulderRoll->setPosition(numrightShoulderRoll);<br />
step(SIMULATION_STEP);<br />
//first position for right elbow yaw servo<br />
rightElbowYaw->setPosition(numrightElbowYaw);<br />
step(SIMULATION_STEP);<br />
rightElbowYaw->setPosition(0);<br />
//first position for right elbow roll servo<br />
rightElbowRoll->setPosition(numrightElbowRoll);<br />
//new step of simulation<br />
step(SIMULATION_STEP);<br />
//second position for head yaw servo<br />
HeadYaw->setPosition(numheadYaw2);<br />
//inicialize position of servo (set to 0)<br />
HeadPitch->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
Príloha D: Systémová príručka 29
KKUI FEI<br />
leftShoulderPitch->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
leftShoulderRoll->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
leftElbowYaw->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
leftElbowRoll->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightShoulderPitch->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightShoulderRoll->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightElbowYaw->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightElbowRoll->setPosition(0);<br />
//new step of simulation<br />
step(SIMULATION_STEP);<br />
//second position for head yaw servo<br />
HeadYaw->setPosition(0);<br />
//second position for head pitch servo<br />
HeadPitch->setPosition(numHeadPitch2);<br />
//inicialize position of servo (set to 0)<br />
leftShoulderPitch->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
leftShoulderRoll->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
leftElbowYaw->setPosition(0);<br />
Príloha D: Systémová príručka 30
KKUI FEI<br />
//inicialize position of servo (set to 0)<br />
leftElbowRoll->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightShoulderPitch->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightShoulderRoll->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightElbowYaw->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightElbowRoll->setPosition(0);<br />
//new step of simulation<br />
step(SIMULATION_STEP);<br />
HeadPitch->setPosition(0);<br />
leftShoulderPitch->setPosition(numleftShoulderPitch2);<br />
//second position for right shoulder pitch servo<br />
rightShoulderPitch->setPosition(numrightShoulderPitch2);<br />
step(SIMULATION_STEP);<br />
//inicialize position of servo (set to 0)<br />
leftShoulderPitch->setPosition(0);<br />
//inicialize position of servo (set to 0)<br />
rightShoulderPitch->setPosition(0);<br />
//second position for left shoulder roll servo<br />
leftShoulderRoll->setPosition(numleftShoulderRoll2);<br />
//second position for right shoulder roll servo<br />
rightShoulderRoll->setPosition(numrightShoulderRoll2);<br />
step(SIMULATION_STEP);<br />
leftShoulderRoll->setPosition(0);<br />
Príloha D: Systémová príručka 31
KKUI FEI<br />
rightShoulderRoll->setPosition(0);<br />
//second position for left elbow yaw servo<br />
leftElbowYaw->setPosition(numleftElbowYaw2);<br />
//second position for left elbow roll servo<br />
leftElbowRoll->setPosition(numleftElbowRoll2);<br />
//second position for right elbow yaw servo<br />
rightElbowYaw->setPosition(numrightElbowYaw2);<br />
//second position for right elbow roll servo<br />
rightElbowRoll->setPosition(numrightElbowRoll2);<br />
step(SIMULATION_STEP);<br />
//second position for left shoulder pitch servo<br />
leftShoulderPitch->setPosition(numleftShoulderPitch);<br />
rightShoulderPitch->setPosition(numleftShoulderPitch);<br />
//new step of simulation<br />
step(SIMULATION_STEP);<br />
leftShoulderPitch->setPosition(numleftShoulderPitch2);<br />
rightShoulderPitch->setPosition(numleftShoulderPitch2);<br />
}<br />
}<br />
step(SIMULATION_STEP);<br />
Príloha D: Systémová príručka 32
KKUI FEI<br />
3.4 Simulátor Choreographe<br />
Pohyb som najprv skúšala implementovať v prostredí Choreographe, ale nevýhoda<br />
tohto simulátora je, že obsahuje iba model jedného robota.<br />
Choreographe je simulátor, ktorý bol priamo navrhnutý a vyvinutý v Aldebaran<br />
Robotics (http://www.aldebaran– robotics.com/en/programmable). Choregraphe je programovací<br />
softvér, ktorý umožňuje používateľom Naa jednoducho vytvárať a upravovať pohyb a<br />
interaktívne správanie. Intuitívne grafické rozhranie a knižnice, pomocou ktorých sa<br />
ľahko naprogramuje správanie robota sú vhodné pre začiatočníkov aj expertov.<br />
Choregraphe má zabudovaný jazyk Urbi, C+ + a Python. Choregraphe je multi–<br />
platformový a môže byť ľahko integrovaný do užívateľovho vývojového prostredia, je<br />
kompatibilný s operačnými systémami Windows, Mac OS aj Linux.<br />
Podľa Aldebaran Robotics 1 jadrom Naovej inteligencie je NaoQi – modul, ktorý<br />
v priebehu pár sekúnd registruje každé zariadenie možné nájsť v robotovi, vrátane<br />
motorov, svetelných diód a podobne.<br />
NaoQi umožňuje dva spôsoby prepojenia zdrojového kódu:<br />
1) Zadaním pokynu NaoQi na načítanie vlastných dynamických knižníc.<br />
2) Napísaním kódu, ktorý sprostredkuje registrovanie vlastných modulov a<br />
interakciu s NaoQi systémom cez TCP/IP.<br />
NaoQi obsahuje rôzne knižnice – napríklad na prepojenie so senzormi (pomocou<br />
ALMemory) alebo riadenie motorov (ALMotion).<br />
Použitím knižnice ALMotion sa pohyb môže simulovať nasledovne:<br />
Na úvod inicializujeme všetky kĺby do počiatočnej polohy:<br />
1) „zabijeme“ všetky procesy, ktoré sa predtým vykonávali príkazom:<br />
ALMotion.killAll<br />
2) nastavíme robota do rovnovážnej polohy:<br />
ALMotion.setBalanceMode(self.pBalanceMode)<br />
1 http://www.aldebaran-robotics.com/<br />
Príloha D: Systémová príručka 33
KKUI FEI<br />
3) môžeme napríklad zmeniť uhol nami vybraného kĺbu príkazom:<br />
ALMotion.changeAngle(self.pJointName1, self.AngleChange1)<br />
4) torzo – oblasť pásu robota nastavíme do polohy udaním súradnice x a y<br />
a času, ako dlho má v tejto polohe ostať:<br />
ALMotion.gotoTorsoOrientation(self.pX, self.pY, self.pDuration,<br />
self.pInterpolationType)<br />
5) chodenie dopredu naprogramujeme príkazom:<br />
ALMotion.walkStraight(self.pDistance, self.pNumSamplesPerStep)<br />
kde na vstupe zadáme vzdialenosť, ktorú má robot prejsť a počet vzoriek za krok<br />
– čo je vlastne rýchlosť pochodu,<br />
otočenia:<br />
6) podobne naprogramujeme otočenie robota, kde na vstupe zadáme uhol<br />
ALMotion.turn(self.pAngle, self.pNumSamplesPerStep)<br />
7) zmeny ostatných kĺbov môžeme zastaviť, kým sa nedokončí pochod robota:<br />
ALMotion.waitUntilWalksIsFinished<br />
Stručná charakteristika simulačného prostredia Webots je uvedená v hlavnej<br />
časti diplomovej práce.<br />
Príloha D: Systémová príručka 34
KKUI FEI<br />
4 Preklad programu<br />
4.1 Požiadavky na technické prostriedky<br />
Program nemá žiadne špeciálne požiadavky na technické prostriedky.<br />
Bol testovaný na operačných systémoch:<br />
- Windows XP Home Edition,<br />
- Windows Vista Business Edition,<br />
- Ubuntu 10.04 LTS.<br />
A na:<br />
- PC lenovo: Intel Pentium, Pentium (R) Dual-Core CPU, 2GB pamäte<br />
RAM.<br />
- Notebooku Eee PC: Intel(R) Atom(TM) CPU N270, 0.99GB pamäte<br />
RAM.<br />
Program na generovanie robotického tanca je prenositeľný na akýkoľvek<br />
operačný systém.<br />
Simulátor Webots je kompatibilný s operačnými systémami:<br />
- Linux, min. glibc 2.3,<br />
- Windows XP, 7 alebo Vista,<br />
- Mac OS X 10.5 alebo novší.<br />
4.2 Požiadavky na programové prostriedky<br />
Aby program fungoval je nutné mať nainštalované:<br />
- Python 2.6.5, ktorý sa dá stiahnuť zo stránky<br />
o http://www.python.org/download/<br />
- GUI je v Pythone urobené pomocou modulu Tkinter, čo je štandardné rozhranie<br />
Pythona k Tk GUI toolkit. Sú kompatibilné s väčšinou Unix platformami, ako aj<br />
Príloha D: Systémová príručka 35
KKUI FEI<br />
s Windows systémami. Samotné Tk nie je časťou jazyka Python, ale nachádza sa<br />
v tzv. Active State. Viac informácií možné nájsť na stránke:<br />
o http://docs.python.org/library/tkinter.html<br />
- Jazyk Tcl/Tk (Command Language), ktorý sa využíva v programe na návrh GUI.<br />
Je to skriptovací jazyk bežiaci na platformách Windows, Unix aj Macintosh. Tcl<br />
je jednoduchý a open-source, možný stiahnuť napríklad cez internetovú stránku:<br />
o http://www.tcl.tk/software/tcltk/<br />
- Vývojové prostredie Webots, ktoré je v plnej verzii dostupné na 30 dní a možné<br />
stiahnuť zo stránky:<br />
o http://www.cyberbotics.com/products/webots/download.html<br />
4.3 Technické pozadie<br />
Systém bol programovaný v jazyku Python, konkrétne vo verzii: 2.6.5, vo vývojovom<br />
prostredí NetBeans IDE 6.7, ktoré je voľné dostupné na stránke:<br />
- NetBeans IDE for Python EA2 Download:<br />
o http://download.netbeans.org/netbeans/6.7/python/ea2/<br />
Príloha D: Systémová príručka 36
KKUI FEI<br />
5. Zhodnotenie riešenia<br />
Tento program predstavuje implementáciu navrhnutého systému pre interaktívnu<br />
evolúciu tanečnej choreografie robotov Nao.<br />
Riešenie bolo vhodné na realizáciu potrebných experimentov, ale na ďalšie<br />
experimenty je nevyhnutné pracovať na reálnych robotoch.<br />
Tým, ktorí budú v tomto projekte pokračovať, odporúčam preštudovať systémy<br />
robotického tanca, z ktorých som vychádzala a ktoré sú uvedené v hlavnej časti mojej<br />
diplomovej práce.<br />
Príloha D: Systémová príručka 37