24.07.2013 Views

SYSTÉMOVÁ PRÍRUČKA - TUKE

SYSTÉMOVÁ PRÍRUČKA - TUKE

SYSTÉMOVÁ PRÍRUČKA - TUKE

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!