Difference between revisions of "Tatrabot LineFollowing"
(→Špecifiká problému - Dopredné Neurónové siete) |
|||
(49 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | |||
== Zadanie == | == Zadanie == | ||
Cieľom projektu bolo pomocou genetického algoritmu vyvinúť neurónovú sieť, | Cieľom projektu bolo pomocou genetického algoritmu vyvinúť neurónovú sieť, | ||
pomocou ktorej bude robot ovládaný tak, že bude nasledovať čiaru. | pomocou ktorej bude robot ovládaný tak, že bude nasledovať čiaru. | ||
+ | |||
+ | [[Image:curvedline.jpg|200px]] | ||
== Použité technológie == | == Použité technológie == | ||
Line 10: | Line 11: | ||
Použitý bol robot Tatrabot vybavený 4 svetlocitlivými senzormi na snímanie čiary. | Použitý bol robot Tatrabot vybavený 4 svetlocitlivými senzormi na snímanie čiary. | ||
+ | |||
+ | [[Image:tatrabotjur.jpg|150px]] | ||
== Špecifiká problému - Dopredné Neurónové siete == | == Špecifiká problému - Dopredné Neurónové siete == | ||
− | Dopredné neurónové siete nie sú schopné si pamätať predošlé stavy. Preto neurónova sieť, ktorá ovláda tohto robota musí spraviť rozhodnutie iba z aktuálnych dát prijímaných zo senzorov. To by na vyriešenie nášho problému malo stačiť. | + | Dopredné neurónové siete nie sú schopné si pamätať predošlé stavy. Preto neurónova sieť, ktorá ovláda tohto robota musí spraviť rozhodnutie iba z aktuálnych dát prijímaných zo senzorov. |
+ | To by na vyriešenie nášho problému malo stačiť. | ||
+ | |||
+ | |||
+ | Naša neurónová sieť ma jednoduchu topólogiu, so 4 vstupnými neurónmi(dostávajú dáta od senzorov), 3 skrytými neurónmi(spracúvajú dáta) a 2 výstupnými neurónmi(vrátia hodnoty podľa, ktorých robot urobí rozhodnutie či pokračovať rovno, zabočiť vľavo, či vpravo). | ||
+ | [[Image:NNDiagram.png|Size: Upright]] | ||
== Špecifiká problému - Genetický algoritmus == | == Špecifiká problému - Genetický algoritmus == | ||
− | + | Neurónové siete sa zvyknú na úlohy poväčšinou trénovať pomocou Reinforcement Learningu. Avšak teraz sme sa rozhodli zvoliť metódu genetického algoritmu. | |
− | + | ||
− | + | Vytvorili sme 200 náhodných jedincov - prvú generáciu neurónových sietí. Následne sme s nimi odsimulovali robota a ohodnotili ich schopnosť riešiť náš problém - tzv. fitness jedinca. Táto fitness sa vyhodnocovala ako vzdialenosť, ktorú robot prejde po čiare( počet opakovaní rozhodovacieho programu, opakovanie skončí, keď žiadny senzor nevidí čiaru). | |
+ | |||
+ | Ďalej sa použijú metódy kríženia( priemerujeme hodnoty váh dvoch jedincov), mutácie( s 10% šancou zmením váhu o 20% nahor, z 10% o 20% nadol) a migrácie( pridáme ďaľších náhodne vygenerovaných jedincov) na tvorbu nových jedincov. | ||
+ | Nová generácia obsahuje 100 mutovaných, 50 migrovaných a 50 krížených jedincov. Zároveň si však do archívu odkladáme najlepšieho jedinca z každej generácie. | ||
+ | |||
+ | Po niekoľkých generáciach by mali vznikať lepší jedinci, potenciálne aj takí, ktorí už náš problém vedia riešiť. | ||
+ | |||
+ | [[Image:Graph.png|Size: Upright]] | ||
+ | |||
+ | |||
+ | == Source Code == | ||
+ | Kód pre riadenie robota | ||
+ | |||
+ | int end = 0; | ||
+ | while(!end){ | ||
+ | uint8_t ln = senseLine(); | ||
+ | if(ln == 0){ | ||
+ | end = 1; | ||
+ | } | ||
+ | int i = resolveNeuralNetwork(ln); | ||
+ | //oba motory | ||
+ | if(i == 0){ | ||
+ | motorsOff(); | ||
+ | setMotor(3, 4000); | ||
+ | } | ||
+ | //tocivy pohyb dolava | ||
+ | else if(i == 1){ | ||
+ | motorsOff(); | ||
+ | setMotor(1,4000); | ||
+ | } | ||
+ | //tocivy pohyb doprava | ||
+ | else if(i == 2){ | ||
+ | motorsOff(); | ||
+ | setMotor(2, 4000); | ||
+ | } | ||
+ | chThdSleepMilliseconds(20); | ||
+ | } | ||
+ | motorsOff(); | ||
+ | |||
+ | |||
+ | V linku nižšie sú zdrojové kódy simulácie. | ||
+ | |||
+ | [[Media:robotSimulation.zip]] | ||
+ | |||
+ | |||
+ | Parametre Simulácie: | ||
+ | |||
+ | const double wheelDist = 6; //vzdialenost kolesa od stredu robota | ||
+ | |||
+ | const double sensorDist = 8; //vzdialenost senzorov od stredu robota | ||
+ | |||
+ | const double sensorSpread = 1; //vzdialenost senzorov kolmo k facingu robota | ||
+ | |||
+ | Veľkost generácie = 200, z toho migranti 50, mutanti 100 a kríženci 50. | ||
+ | |||
+ | == Výsledky simulácie == | ||
+ | |||
+ | Bohužiaľ nemám informácie k najlepšej fitness jedincov každej generácie. | ||
+ | Môžem odsimulovať doplniť výsledky z ďaľšej simulácie. | ||
+ | |||
+ | == Video Dokumentácia == | ||
+ | <youtube>zvtQjQqzf-I</youtube> | ||
+ | <youtube>MDRYsCrXJx4</youtube> | ||
+ | Robot 10-tej generácie prechádza dráhu. | ||
+ | |||
+ | == Záver == | ||
+ | Robot nepracuje úplne podľa očakávaní. Tento problém sa vyskytol najmä v domácich testovacích podmienkach. Pravdepodobne sa jedná o chybu v jeho virtuálnej simulácií a kalibráciu jeho parametrov, prípadne je možné, že mám príliš ostré zákruty, respektíve zlý terén. | ||
+ | |||
+ | Ďaľším potenciálnym problémom by mohla byť konfigurácia senzorov. | ||
+ | |||
+ | Podarilo sa mi zefektívniť výkon robota, tým, že v prípade , že žiadnu čiaru nevidí drží si svoju načatú tendenciu a zastaví až po istej dobe mimo čiary. Týmto sa spôsobom sa mu môže podariť dostať sa späť na čiaru. |
Latest revision as of 20:31, 3 July 2016
Contents
Zadanie
Cieľom projektu bolo pomocou genetického algoritmu vyvinúť neurónovú sieť, pomocou ktorej bude robot ovládaný tak, že bude nasledovať čiaru.
Použité technológie
Nosnú časť projektu som programoval v jazyku C# v prostredí Visual Studio 2015. Jednalo sa o simuláciu robota vo virtuálnom priestore. Testovanie Fitness jednotlivcov a následný genetický algoritmus na zdokonaľovanie jedincov.
Samotný robot beží pod jazykom C a tu som naprogramoval len vyhodnotenie jednoduchej doprednej neurónovej siete v prostredí ChibiStudio.
Použitý bol robot Tatrabot vybavený 4 svetlocitlivými senzormi na snímanie čiary.
Špecifiká problému - Dopredné Neurónové siete
Dopredné neurónové siete nie sú schopné si pamätať predošlé stavy. Preto neurónova sieť, ktorá ovláda tohto robota musí spraviť rozhodnutie iba z aktuálnych dát prijímaných zo senzorov. To by na vyriešenie nášho problému malo stačiť.
Naša neurónová sieť ma jednoduchu topólogiu, so 4 vstupnými neurónmi(dostávajú dáta od senzorov), 3 skrytými neurónmi(spracúvajú dáta) a 2 výstupnými neurónmi(vrátia hodnoty podľa, ktorých robot urobí rozhodnutie či pokračovať rovno, zabočiť vľavo, či vpravo).
Špecifiká problému - Genetický algoritmus
Neurónové siete sa zvyknú na úlohy poväčšinou trénovať pomocou Reinforcement Learningu. Avšak teraz sme sa rozhodli zvoliť metódu genetického algoritmu.
Vytvorili sme 200 náhodných jedincov - prvú generáciu neurónových sietí. Následne sme s nimi odsimulovali robota a ohodnotili ich schopnosť riešiť náš problém - tzv. fitness jedinca. Táto fitness sa vyhodnocovala ako vzdialenosť, ktorú robot prejde po čiare( počet opakovaní rozhodovacieho programu, opakovanie skončí, keď žiadny senzor nevidí čiaru).
Ďalej sa použijú metódy kríženia( priemerujeme hodnoty váh dvoch jedincov), mutácie( s 10% šancou zmením váhu o 20% nahor, z 10% o 20% nadol) a migrácie( pridáme ďaľších náhodne vygenerovaných jedincov) na tvorbu nových jedincov. Nová generácia obsahuje 100 mutovaných, 50 migrovaných a 50 krížených jedincov. Zároveň si však do archívu odkladáme najlepšieho jedinca z každej generácie.
Po niekoľkých generáciach by mali vznikať lepší jedinci, potenciálne aj takí, ktorí už náš problém vedia riešiť.
Source Code
Kód pre riadenie robota
int end = 0; while(!end){ uint8_t ln = senseLine(); if(ln == 0){ end = 1; } int i = resolveNeuralNetwork(ln); //oba motory if(i == 0){ motorsOff(); setMotor(3, 4000); } //tocivy pohyb dolava else if(i == 1){ motorsOff(); setMotor(1,4000); } //tocivy pohyb doprava else if(i == 2){ motorsOff(); setMotor(2, 4000); } chThdSleepMilliseconds(20); } motorsOff();
V linku nižšie sú zdrojové kódy simulácie.
Parametre Simulácie:
const double wheelDist = 6; //vzdialenost kolesa od stredu robota
const double sensorDist = 8; //vzdialenost senzorov od stredu robota
const double sensorSpread = 1; //vzdialenost senzorov kolmo k facingu robota
Veľkost generácie = 200, z toho migranti 50, mutanti 100 a kríženci 50.
Výsledky simulácie
Bohužiaľ nemám informácie k najlepšej fitness jedincov každej generácie. Môžem odsimulovať doplniť výsledky z ďaľšej simulácie.
Video Dokumentácia
Robot 10-tej generácie prechádza dráhu.
Záver
Robot nepracuje úplne podľa očakávaní. Tento problém sa vyskytol najmä v domácich testovacích podmienkach. Pravdepodobne sa jedná o chybu v jeho virtuálnej simulácií a kalibráciu jeho parametrov, prípadne je možné, že mám príliš ostré zákruty, respektíve zlý terén.
Ďaľším potenciálnym problémom by mohla byť konfigurácia senzorov.
Podarilo sa mi zefektívniť výkon robota, tým, že v prípade , že žiadnu čiaru nevidí drží si svoju načatú tendenciu a zastaví až po istej dobe mimo čiary. Týmto sa spôsobom sa mu môže podariť dostať sa späť na čiaru.