ESEA Gruppe X's hjemmeside i ESEA
Lab logbog
Project Logbog:
Kodeudvikling Project Log Entry 1
Project Log Entry 2 Project Log
Entry 3 Project Log Entry 4 Project
Log Entry 5 Project Log Entry 6 Project
Log Entry 7 Diskussion Installationsvejledning
Simulator Referencer
Kodeudvikling. |
| Date: 06/06/06 |
Til Toppen |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCar.c LearningLegoCar.h
pattern.c pattern.h sample.c
sample.h samplestack.c
samplestack.h tool.c tool.h
|
Kodeudviklingen
Udviklingen af styringsalgoritmen i C til RCX-robotten har i stor
stil været præget af prototypeafprøvninger, løbende tilpasninger
og utidige tilføjelser og ændringer. Denne form for kodeudvikling
forløb gennem hele projektet helt op til demonstrationsdagen,
hvor robotten blev præsenteret. En sådan form for iterativ udvikling
af kodebasen har medført et generelt ustruktureret og temmelig
uoverskueligt stykke kode, som kun med stort besvær kan vedligeholdes
og videreudvikles.
Efter demonstrationen af robotten og styringsalgoritmens potentiale,
blev det derfor besluttet at give koden et grundigt ”make over”,
hvor vægten var lagt på overskuelighed og konsistens i både strukturering
og kodestil. Denne sene ændring af koden har den konsekvens, at
enkelte beskrivelser af kodenavngivning og generel strukturering
som beskrevet i dagbogsrapporten ikke nødvendigvis stemmer 100
% overens med den endelige kode.
De mest betydningsfulde ændringer fra gammel til ny kode beskrives
i det følgende ganske kort.
- Opdeling i flere filer
- Den oprindelige kode bestod af én stor uoverskuelig fil med
alle mulige deklarationer og definitioner i et stort virvar.
I den reviderede version er der lavet en logisk opdeling af
koden i flere forskellige filer. I alt er der fem C-filer med
tilhørende deklarationsfiler (header filer). Dette har givet
en langt mere overskuelig kode, men har først og fremmest gjort
koden langt lettere at vedligeholde og udvide.
- Opdeling af strukturer (structs)
- Den originale kode indeholdte en forholdsvis stor struktur (Sample),
der indeholdte information der dækkede to begreber (Sample og
Pattern) og kunne helt naturligt opdeles i hver deres struktur.
Det gamle begreb (Sample) dækkede således både sensorer og motorernes
tilstand samt måden, der skulle reageres i tilfælde af ”sample
clicking”.
- I den nye kode er en ”Sample” blot et stillbillede af tilstanden
af input og output på RCX’en (output fortolket til tilstand
på motor). Et ”Pattern” er et nyt begreb i den reviderede version
der så kombinerer en Sample og en reaktion (Behaviour) på en
naturlig måde.
- Generelle forbedringer og større grad af konsistens
- I den nye kode er der, for at opnå bedre konsistens i
koden, lavet op til flere ændringer af variabel- og funktionsnavne
samt deres typer. Enkelte variabler og funktioner er blevet
overflødige og findes således ikke længere.
- Der er desuden lavet mindre forbedringer af koden, både udseendemæssigt
og enkelte steder i minimal grad størrelses- og ydelsesmæssigt.
Beskrivelse af koden.
Koden er delt op i fem forskellige C-filer med tilhørende header-filer.
LearningLegoCar er den vigtigste og indeholder hele fundamentet
for hele styringsalgoritmen.
De øvrige filer er en slags hjælpefiler hvori der er uddelegeret
funktionalitet der logisk set adskiller sig fra det øvrige program.
Sample- og pattern-filerne består af definitionen af henholdsvis
sample- og pattern-datatyperne og funktioner til oprettelse
og kopiering.
SampleStack indeholder funktioner til at holde styr på og håndtere
de samples der løbende indsamles af robotten.
Sidst og mindst er der en tool-fil, der indeholder alt det
der passer ind over det hele uden rigtigt at høre til noget
specielt sted. I skrivende stund indeholder filen blot en enkelt
funktion, Abs, der udregner den absolutte værdi af et heltal.
|
Project
Log Entry 1 |
| Date: 26/04/06
|
Til Toppen
|
| Duration of activity: |
4 timer |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
Mål: Formålet med dagens
møde er at beslutte hvilket projekt vi skal lave. Vi har mere
eller mindre allerede besluttet os for at vi gerne ville lave
noget der har med selvlæring at gøre, dvs. en robot der skal kunne
lære at løse forskellige opgaver, og vi har også gjort os nogle
tanker på forhånd. Yderligere håber vi på også at have en grov
løsningsmodel skitseret ved dagens udgang.
Overordnet projektidé:
At få en Legorobot til at lære forskellige opgaver, såsom at undgå
forhindringer, følge en væg eller en linie. Selve robotten skal
bygges, vha. de Legosensorer der er til rådighed her på stedet.
Vi forestiller os at robotten bliver en Legobil, med 2 hjul,
styret af 2 motorer og med 1-2 lyssensorer for og 1-2 bag. Herudover
skal robotten have 2 bump-sensors både for og bag, det hele styret
af én RCX. That's it! Det er dog en god chance for robot-designet
vil ændre sig undervejs i projektet, da vi ikke har lagt os helt
fast på hvilke opgaver vi vil have den til at løse. Indtil videre
ser den ud som på fig. 1, nedenfor. Det er tanken at placeringen
af sensorer og deres type og antal skal være underordnet i forhold
til at robotten selv skal lære sine sanser og deres betydning
at kende.
Med parallel til biologien, har vi altså tænkt os at udstyre robotten
med en fornemmelse af smerte, modelleret ved at robottens bump-sensorer
trykkes ned. Herudover har den et prædefineret sæt af reflekser
a la: drej lidt til højre, bak lidt og drej lidt til venstre osv.
, samt en mængde udefinerede stimuli, i form af sensor-input.
Pointen er at den, ligesom mange dyr, ud fra disse primitiver
skal kunne udvikle en adfærd der gør den i stand til at undgå
"smerten", vha. at udvikle en adfærd der opfylder dette formål
ud fra sine grund-reflekser og fortolkning af stimuli fra omgivelserne.
Dette kan så bruges til at man kan opnå en bestemt adfærd gennem
negative stimuli, med andre ord ikke ligefrem moderne pædagogik.
Skitsering af løsningsmodel for projektet:
Som det første har vi i løbet af vore diskussioner været nødt
til at udvikle en konkret terminologi, da det hele hurtigt blev
uoverskueligt mht. at formidle vores ideer til hinanden uden misforståelser.
Den kommer her, for de centrale begreber:
- Et "sample" er en liste af sensor-værdier, både input og
output værdier. De repræsenterer robottens omgivelser og tilstand
i et givet øjeblik.
- "Kritiske sensorer" er de sensorer der trigger/udløser
en refleks, dvs. "smerte"-sensorerne.
- En "criticalEvent" er når robotten er i en kollision eller
udenfor en linie mm. Det er også situationer, som robotten
har den ikke har mulighed for at komme ud af, med dens udvalg
af reaktioner.
- Et "Warning-sample" er et sample der kommer lige før vi
har oplevet en critical-event. Det beskriver altså at vi er
tæt på at opleve en situation, som vi ikke ønsker at opleve.
- Et "pattern" er en sample som bruges til at prøve at undgå
en kritisk situation, dvs. en succes indtil andet er bevist.
Hvis det ikke er muligt at undgå en kritisk sensor, bliver
et pattern "udnævnt" til at være kritisk. Værdierne i dette
sample er tæt på et sæt værdier, registreret ved en critical-event. Alle
warning-samples bliver til patterns og patterns bliver så,
afhængigt af om de er i stand til at undgå den kritiske situation,
markeret som værende kritiske patterns (og dermed en criticalEvent)
eller patterns der reagerer. Et pattern bruges til at identificere
situationer som leder til kritiske tilstande. Til et pattern
er tilknyttet et reaktionsmønster eller opførsel (behaviour),
der skal udføres for at undgå at havne i den kritiske situation.
I tilfælde af at den kritiske tilstand ikke kan undgås, noteres
det pågældende pattern til at være en kritisk situation
i sig selv.
- At et pattern "klikker" vil sige at 2 sæt sample-værdier,
er sammenlignet og fundet matchende ud fra nogle opstillede
kriterier. Disse kriterier er et af de komplekse problemer
vi står overfor når vi skal lære robotten op.
 Fig.
1: Sample-historik. En liste af tilstands-snapshots der
går tilbage i tid. |
Der oprettes et sample i hver iteration af loop'et, og der gemmes
hele tiden en historik over de x foregående samples. Se Fig.
1
Når robotten får trykket sine kritiske sensorer ind, rejses
en criticalEvent. Når der sker en criticalEvent, så registreres
det sample i nuværende itteration – 1. Dvs. vi registrerer det
sample til den tid der kom lige før den kritiske oplevelse i
den holdte historik. Dette er et warning-sample. Næste gang
der vi oplever et sample der matcher en warning-sample, forsøges
der med en reaktion for at undgå at komme i en criticalEvent.
Den pågældende warning-sample indeholder information om hvilke
reaktioner der er forsøgt til at undgå at komme i en kritisk
tilstand. Hvis ingen reaktioner på et warning-sample undgår
critical event, så markeres dette warning-sample som critical
og denne værdi vil efterfølgende betragtes som en critical-event,
da den i praksis svarer til en kollision, da den ikke kan undgås
vha. de indbyggede reaktioner. Næste gang robotten så kommer
i denne tilstand, gemmes et nyt warning-sample til tiden lige
før dette, altså igen den forrige entry i historikken. På denne
måde skulle robotten gerne ende med at lære at undgå critical-events
i tide. Hvis vi efter at have mødt et warning-sample forsøger
os med en reaktion, og vi ud fra et endnu ikke præcist defineret
succes-kriterium, ikke ender i en critical-event, gemmes dette
warning-sample som et pattern dvs. en situation som robotten
nu har lært at genkende, og har knyttet en succesfuld undgåelsesadfærd
til. Når et pattern efterfølgende klikker, vil den tilknyttede
reaktion/adfærd blive udført.
Teori:
Vores løsning er i første omgang baseret på egne idéer mht.
læringsmekanismen, som er det centrale i projektet. Prioriteringsmekanismer,
adfærdsstyring og kontrol-strategier er inspireret af stoffet
fra kurset mht. disse
ting. Dette vil blive uddybet i næste labsession, hvor vi forventer
at have arkitekturen på plads.

Figur 2
Figur2 beskriver vores indlæringsmekanisme meget abstrakt.
Princippet er baseret på at genkende. Enten er en genkendelse,
en genkendelse af en kritisk situation/hændelse eller også er
det en genkendelse der medfører en handling. Afhængigt af hvad
der bliver genkendt uddrages forskellig læring/erfaring. Denne
nye læring/erfaring indgår nu i det genkendelige. Figuren er
bevidst lavet meget abstrakt, så den giver mulighed for at tænke
over andre måder at opnå indlæring på, end den implementation
vi har valgt at realisere og derudover ikke begrænser tankegangen.
Fx hvordan lærer man af en handling? Lærer man positivt, negativt
eller en blanding? Dvs. vurderer man sine handlinger som værende
en succes, ved at der kommer noget godt ud af dem, at der ikke
kommer dårligt ud af dem eller en blanding.
Mål med projektet:
Projektet forventes at have en høj usikkerhed mht. de resultater
vi gerne vil opnå. Ingen af os har erfaring med lærings-teorier,
neurale netværk mm.
Vi håber på at kunne lære robotten forskellige opgaver, såsom
follow-wall, obstacle avoidance og follow-line, udelukkende
ved at andre på dens grund-reaktioner, og dens smerte-tilstand.
Mht. obstacle avoidance skulle den gerne kunne lære dette unsupervised,
og mht. follow-line forestiller vi os at vi kan lære den det
supervised, altså ved at vi hver gang den kommer udenfor linien,
kan sige "fy" ved at give den et tryk på dens smerte-sensorer.
Målet for projektet bliver dermed at give robotten følgende
egenskaber:
- At være uafhængig af sensorers placering.
- At være uafhængig af antal sensorer.
- At være uafhængig af sensor-typer.
- At være uafhængig af hvilke porte forskellige sensorer
er tilknyttet.
- At kunne lære at genkende ugunstige situationer vha. smerte-princippet.
- At kunne lære at benytte prædefinerede reaktioner og kombinationer
at disse til at undgå ugunstige situationer.
- Vha. ovenstående egenskaber at blive i stand til at lære
at løse forskellige opgaver, udelukkende ved at ændre robottens
grundreaktioner, og smerte-definition.
Ambitiøst? Ja, men vi tror det bliver fandens sjovt og lærerigt!
Simulator:
Der vil i løbet af projektet også blive udviklet en simulator,
hvor vi, med bedre debugmuligheder, kan teste idéer under ekstremt
kontrollerede forhold og vi tror også vi får mulighed for at prøve
flere forskellige løsningsmodeller og evt. bruge simulatoren til
at teste forskellige løsningsmodeller og variabelværdier overfor
hinanden. Simulatoren er beskrevet sidst i logbogen. |
|
Project Log Entry 2 |
|
| Date: 10/05/06 |
Til Toppen
|
| Duration of activity: |
7 timer |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCarv1.c
|
|
Mål: Der var flere formål med dagens møde. For det første skulle
en kodestruktur (beskrevet i pseudokode) skitseres, så der blev
skabt et fælles overblik over hvordan læringsprocessen for vores
Lego-bil, skal implementeres. For det andet skulle en løs milestone-plan
vedtages. Efter disse første to ting kom på plads, påbegyndtes
kodning.
Konkretisering af idéen:
Vi har nu diskuteret ideen igennem, og har lavet en skabelon af
implementationen i form af pseudo-kode. Nogle af dagens vigtige
diskussionsemner var:
- Hvor tit skal vi oprette samples?
- Hvor mange patterns har den mon brug for at lære, og har
vi overhovedet plads til det i RCX'en?
- Hvordan sammenligner man et sample med et pattern? Hvad
er kriterierne for et klik?
- Hvilke reaktioner skal den udstyres med, og hvordan skal
den udvælge disse?
- Hvordan skal robotten konkludere om en reaktion er en
succes?
- Virker ideen mon overhovedet?
1, 2 og 6 er der ikke meget at sige om, da det er ting vi først
får ordentligt hold om, når vi får lavet nogle eksperimenter.
Mht. de øvrige punkter har vi tænkt os følgende: Simple
Pattern Matching (pkt. 3)
Dette en central del af systemet. Vi har besluttet os for
at starte med en simpel model, og lave en sammenligning kun
på lyssensor-værdier, og bruge et offset a la +-10, og dermed
sige klik, hvis værdierne ligger indenfor intervallerne defineret
via dette offset. Alle tidligere patterns bliver løbet igennem
under hvert gennemløb. Hvis der er et klik på et tidlige pattern
skal der så laves en reaktion på det. Det næste der så skal
kigges på er om vi nåede at klikke tidligt nok på det genkendte
pattern. Dette gøres ved at undersøge om de kritiske sensorer
er blevet aktiveret. Hvis det er tilfældet skal der oprettes
et nyt pattern fra samplingen før og tilføjer den til listen.
React mekanisme (pkt. 4)
Vi vil ud over at afstemme hvornår der skal reageres på input
værdier fra lys sensorer også lave en mekanisme der skal udvælge
det mest succesfulde reaktionsmønster, når en forhindring skal
undgås. Denne react mekanisme skal gå ind og afprøve forskellige
handlinger når et pattern udløser at den skal reagere. Vi har
tænkt os at definere en liste med reaktioner, som robotten prøver
igennem. Dvs. at den første gang den klikker på et warning-sample,
prøver første reaktion i listen, og hvis dette ikke medfører
succes, vil den hvis den en anden gang klikker på dette warning-sample
prøve den næste reaktion i listen. Vi tænker på at lave listen,
på en sådan måde at den kan løbes igennem flere gange, men hver
gang med f.eks. et drej i en retning i lidt længere tid end
forrige gang. På denne måde skulle den gerne lære kun at dreje
det der er nødvendigt, og ikke bare ende med at vende 180 grader
hver gang den møder en forhindring. Hvis man forestiller sig
at robotten udstyres med et mål, det kunne være at køre efter
en lyskilde, vil denne fremgangsmåde forhåbentligt sikre at
robotten tager den korteste vej mod lyset. Så kan man sige at
listen med reaktioner skal løbes igennem 4 gange med forskellige
tider på drejet, før man konkluderer at der ikke var nogen reaktioner
der gav et gunstigt resultat.
React success (pkt. 5)
For at en givet reaktion kan klassificeres som en success,
har vi besluttet at der skal gå et stykke tid efter reaktionen
er udført, hvor robotten kører ligeud, uden at støde ind i
noget, så hvis den i de efterfølgende x millisekunder rammer
en critical-event, vil reaktionen bliver klassificeret som
ugunstig, og ellers som gunstig.
Pga. usikkerheden mht. hele ideen, var vi enige om at vi skulle
hurtigt i gang med at lave en grund-implementation, så vi kunne
afprøve konceptet. Det virker umiddelbart ret enkelt, at lave
en grundstruktur, der let kan udvides med mere avancerede overbygninger.
Pseudo kode
I den første omgang pseudokode, forsøgtes kontrolstrukturen/arkitekturen
at blive lagt fast.

Der er mange ting der mangler I ovenstående pseudokode. Koden
skal kun læses som en meget forenklet udgave af learningalgoritmen,
der (forhåbentligt) giver et overblik over princippet. Herunder
følger en lidt mere opdateret udgave af learning algoritmen,
hvor de forskellige samples’ reaktioner bliver testet, for
at afgøre om en sample er kritisk eller ej.
Main er stadig den samme.

Der er brugt flere metoder i ovenstående kode, de vil blive
beskrevet herunder. Dog er det kun formålet med metoderne
og en meget enkel implementation af dem der vil blive beskrevet.
Dette skyldes at der indenfor rammerne af ovenstående struktur,
gennem metoderne, er forskellige måder at udvikle learning-elementerne
på.
- GetCurrentSample()
Opdaterer den sample som bruges til sammenligninger. Dvs.
metoden opdaterer øjebliksbilledet.
- React(Sample pSample)
pSample ”afprøver” en reaktion, i den nuværende implementation
skifter React bare retning. (Frem og tilbage)
- ReactOnCriticalEvent()
I den nuværende implementation skifter ReactOnCriticalEvent()
bare retning.(Frem og tilbage)
- 4. FindTheBestFittingSample()
Sammenligner alle lærte samples med currentSample og returnerer
den der ”ligner mest”.
- ReactionUpdate()
Opdaterer en reaktion hvis en sådan er i gang.
Tidsplan.
For at vi ikke mister overblikket over hvad vi vil nå at lave
på projektet har vi opstillet en simpel tidsplan. Det
første vi vil ha på plads er en overordnet struktur af designet.
Efterfølgende vil vi så udvikle på matching(klik)-mekanismer og react-mekanismer,
hvor vi så endeligt kan afprøve vores løsningsmodel.
|
Milestones:
|
Milestone-test
|
Deadline
|
|
Simulator
|
Løbende test.
|
10/05/06
|
|
Implementation af
overordnet Struktur af programmet
|
Backward/Forward-test.
(Simpel test af indlæring af reaktionstid)
|
14/05/06
|
|
Match-mekanisme
|
Line follow og Wall follow.
|
21/05/06
|
|
React-mekanisme
|
Wall avoid på blåt bord.
|
28/05/06
|
Sample weeding
(Hvad gøres hvis antal samples bliver for højt?)
|
Test undladt, rettelse i koden medførte en kraftig nedsættelse af antal
samples.
Det blev derfor besluttet at bruge tiden på indstilling og test af de
forskellige variable.
|
31/05/06
|
|
Funktionel implementation
|
Præsentation for Ole Caprani (+ resten)
|
01/06/06
|
Arkitektur
Vi har i vores design af programmet, ikke brugt tråde. Det kunne
være relevant at have dele af koden, såsom CriticalSensorTriggered,
og sample-matching mekanismen i tråde for sig, da de kan ses
som selvstændige processer, der kan informere andre dele af
systemet, om deres resultater. Det ville til reducere kompleksiteten
i den konceptuelle logik, og give en sund adskillelse af disse
funktionaliteter i koden. Vi mener dog ikke at det skulle være
noget problem at konstruere systemet uden tråde, og da der ofte
kan følge bøvl med tråde i form at synkroniseringsproblemer,
race-conditions mm., har vi derfor valgt ikke at bruge tråde
i håbet om at spare tid. Dette forenkler projektet, der i forvejen
har en stor usikkerhed.
Vores projekt bygger på at knytte situations-betingelser til
reaktioner. Vores overordnede tilgang kan derfor ses som en
"purely reactive" kontrol-strategi, som beskrevet i [1,3], men
med dynamiske definitioner af condition-action pairs, defineret
gennem vore lærings-algoritme. Maja karakteriserer i [1] den
rent reaktive kontrol-strategi således: "Purely reactive strategies
have proven effective for a variety of problems that can be
completely specified at designtime. However, such strategies
are inflexible at runtime, due to their inability to store information
dynamically."
Vores erfaring med en ren reaktiv strategi står i modsætning
til [1], i det vi netop mener at kunne lave en fornuftig kombination
af den rene reaktive strategi med dynamisk opbygning af condition-action
pairs. Vi definerer ikke på design-time en fast binding mellem
conditions og actions, og vi opnår en dynamisk udvikling af
disse bindinger på run-time. Ingen af de nævnte begrænsninger
er dermed noget vi oplever i vores strategi, der eller må betegnes
som en ren reaktiv strategi - en erfaring der ligeledes er gjort
af [2].
Herudover bygger princippet i vores arkitektur på traditionel
Sense-Plan-Act, hvor Plan måske burde hedde Learn, da der netop
ikke er implementeret en planlægningsstrategi, men kun et udgangspunkt
for selv-udvikling.
Proportional control er når kontrol-algoritmen reagerer proportionalt
med en fejl-værdi, det kunne være en afstand til en væg for
eksempel. Vi har forsøgt at modellere proportional control,
som beskrevet i Martin [3], ved i vores læringsalgoritme at
lade robotten afprøve reaktioner inkrementelt, hvor reaktionerne
hver gang bliver lidt længere. På den måde håber vi på at opnå
at det robotten lærer, er at knytte proportionale reaktioner
til de situationer hvor det er passende, dvs. at den eksempelvis
kun laver små drej, hvor dette er nok, og store drej, hvor små
drej ikke er nok.
Mht. hvordan de forskellige behaviors prioriteres har vi valgt
følgende enkle fremgangsmåde. For de overordnede adfærdsmoduler,
wander og react-to-some-known-situation, har vi fast definerede
prioriteter med sidstnævnte som havende højeste prioritet. Sidstnævnte
adfærd initieres af robottens selv-lærte evne til at genkende
ugunstige situationer. Som vi har implementeret det, vil robotten
ikke forsøge at genkende situationer mens den er ved at afprøve
en reaktion, men vil dog reagere på at dens kritiske sensorer
aktiveres, hvorved den igangværende reaktion termineres, og
den nye kritiske situation bliver udgangspunkt for dens videre
udvikling. Problemet med at lade robotten genkende ugunstige
situationer mens den er ved at afprøve en reaktion, er at det
gør det komplekst at definere hvornår en reaktion så er en succes,
da reaktionen så får en binding til andre lærte situationer,
som kan være sunde, men også kan være usunde, da robotten jo
kan lære dårlige vaner.
Flere patterns kan klikke ved et gennemløb, men hvert klik tildeles
en match-værdi, hvor vi kun bruger det bedst matchende. Dette
definerer en prioriterings-strategi mht. hvilke reaktioner der
får lov at blive udført.
Vi har derudover givet mulighed for at lave suppression, som
beskrevet i subsumption arkitekturen af Brooks [4]. Dette er
gjort på samme måde som vi gjorde i Lab Session 6. Dvs. at man
kan smide ordrer ud til motorerne, men de bliver først realiseret
når Actuate()-metoden bliver kaldt, og med de først indkomne
med lavest prioritet, og de sidste med højeste.
Sample-oprettelse og sample-sammenligning
Når vi sammenligner patterns vil der kunne være flere der klikker,
og vi tildeler en match-værdi til de patterns der klikker, og
tager kun det bedst matchende. Herved undertrykker vi de andre
mulige reaktioner på denne situation. I forbindelse med dette
kunne man overveje at bruge en subsumption arkitektur som beskrevet
i [4]. Ideen kunne så være at lave hvert adfærdsmodul have specifikke
reaktioner, og lade dem hver især have en match-metode, der
bygger på den pågældende adfærds karakteristika. En adfærd kunne
f.eks. være uinteresseret i motorernes tilstand, og en anden
kunne være ligeglad med lyssensor-værdier, men de kunne alle
reagere samtidigt, og så lade output være styret af en suppression-mekanisme.
Dette var en overvejelse, men i og med at vi blev enige om at
afprøvelsen af reaktioner i en ugunstig situation skulle ske
sekventielt, var ideen om parallelismen i [4] ikke relevant.
Den specifikke løsning til at tilføje inputsamples udpeger den
umiddelbart forrige sample som værende indikator for en begivenhed
der kræver en eller anden form for reaktion. Dette medfører
en meget lang indlæringstid afhængig af hvor ofte der samples.
En mere generel oprettelse af samples tager højde for flere
af de tidligere samples end blot den forrige. Dette vil medføre
en hurtigere indlæringstid og øget resistens overfor støj på
inputsensorerne (fx: Undskyld tjener, der er en flue i min sensor).
Man kan ikke sige noget generelt om hvor mange samples man bør
overveje da forskellige sensorers optimale samplerate og variation
af inputværdier er afhængig af deres natur og beskaffenhed.
En generel løsning til udvælgelsen af antallet af samples kunne
være at se på samples over tid. F.eks kunne man lade et gennemsnit
eller lignende af inputværdierne fra de sidste 2 sekunder udgøre
en sample.
Samplesammenligning er nødvendig for at opdage hvornår der er
behov for en reaktion. Måden man sammenligner samples på er
tæt knyttet til måden samples oprettes på. Igen er der en simpel
men specifik måde at sammenligne samples på. Man udvælger én
fast værdi, der afgør hvor meget de enkelte værdier i de pågældende
samples må afvige for at være ”ens”. Den lidt mere generelle
løsning er en værdi for hver eneste inputværdi, ikke bare en
enkelt for alle inputværdierne. Dette er en simpel og åbenlys
udvidelse da variation af forskellige sensorers værdier som
nævnt er afhængig af de enkeltes sensorers natur. Det vil således
være nærliggende at udvælge en passende variationsværdi til
de enkelte sensorer baseret på måden man opretter samples på.
Videre overvejelser til forbedringer:
En alternativ måde at sammenligne samples på kunne være at tildele
enhver sammenligning en værdi mellem 0 og 100. Jo mere to samples
ligner hinanden jo tættere kommer en sammenligning på 100. Derudover
kunne det tænkes at man kunne tildele de forskellige sensorer
forskellig betydning. Dvs en ens variation på forskellige sensorer
ikke nødvendigvis har samme udslag i værdien af sammenligningen.
Metoden giver en meget fleksibel måde at sammenligne samples
på og dermed mulighed for et bedre input til de algoritmer der
afgør systemets reaktion.
Fx kunne man forestille sig at en sensor har haft en min værdi
på x og en maksværdi på y og at man ønskede sig at dens værdier
var delt op i 30 områder. Man ville derved kunne lave en dynamisk
relaxation på (y – x) / 30. Udover det ville man kunne teste
hvor ofte de forskellige ”relaxationområder” blev brugt og indsnævre
deres værdier. Man ville derved opnå en mere præcis CompareTo-funktion.
(Da de områder hvor der er mulighed for en lille relaxation,
bliver udnyttet/delt op)
Implementation
De centrale elementer vi har valgt at lægge ud med at implementere
her ved den første gang er opbygning af patterns. Genkendelsesmekanismen
til at behandle de patterns der er gemt i en simpel udgave,
hvor opbyggelsen sker i vores update metode. Da det er en del
information der skal gemmes anvendes der structs, som så gemmes
i et array. De informationer det drejes sig om er inputværdier
fra sensorerne, samt information om hvilken retning og fart
bilen er kørt er kørt med da den kritiske handling skete. Desuden
gemmes der også information om succesraten og hvilken handling
der skal foretages bagefter.
Update metoden fungerer på den måde hver gang den kaldes løbes
alle de tidligere patterns igennem. Hvis der findes et hit hvor
både lys sensor værdier og kørselsretning er ens (eller er ”tæt”
på at være ens) kigges der på hvor succesfuldt dette pattern
er. Hver gang der er en genkendelse og dens handling forsøges
udført holdes der så styr på hvor mange gange det er lykkes
at gennemføre handlingen. Hvis der findes et pattern med bedre
succesrate vælges dette i stedet for. Nu udføres så handlingen
der er gemt for det fundne mønster ved at der laves et kald
til react metoden. Hvis det er at der ikke er noget match kigges
der på om den kritiske sensor er blevet aktiveret. Hvis det
er tilfældet skal der oprettes et nyt mønster og så laves et
retningsskift af bilen.
Da vi havde brugt en del tid til at diskutere en pseudoløsning
nåede vi ikke at færdiggøre implementeringen af den overordnede
kodestruktur ved denne labsession.
|
| |
|
|
Project
Log Entry 3 |
| Date: 15/05/06 |
Til Toppen
|
| Duration of activity: |
7 timer |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCar1.c |
| Mål:
At færdiggøre koden til den overordnede struktur.
Implementering:
De sidste ting der skulle til for at lave en simpel kørende
løsning er ved denne labsession blevet færdiggjort. Det var
små ændringer af koden og opbyggelse af patterns samt genkendelses
af patterns. De ting vi bruger til at genkende et pattern er
input værdier fra lyssensorerne, og kørselsretningen, samt en
relaxations variabel. Det gør at vi ikke skal vide hvor lys
sensorerne er placeret på bilen, da vi kigger på hvilken retning
bilen kører i. Relaxation variablen bruger vi til at markere
et treshold for vores inputværdier. Den er nødvendig at have
med da vi ved genkendelse skal have et hit fra begge sensorinput.
Ved at vi har kørsels retningen med i sammenligningen gør at
vi ikke klikker på vores pattern når vi er i gang med at køre
væk fra det kritiske område. Da der til denne udgave ikke skal
være nogen reaktionsoptimering lader vi bare bilen køre frem
og tilbage. Når bilen så skal reagere vendes kørselsretningen
om frem for at finde den optimale kørselsretning.

De centrale elementer fra vores update funktionen.
Problemer
Mangel på c erfaring gjorde at vi havde lidt svært ved at tyde
memory copy fejl vi fik. Efter at vi havde slavet os igennem
koden fik vi dog rettet dem alle sammen sådan at koden kunne
kompilere korrekt hvilket gjorde at vi kunne teste. Gunden til
problemerne var at vi ikke kunne finde ud af at kopiere flere
variabler af gangen, f.eks. en struct. Dette kunne kompileres
men gav linker fejl. Derfor var det nødvendigt for os at lave
forskellige hjælpefunktioner til disse opgaver(copySample).
Test
Til at afprøve vores løsning har vi valgt at teste den i et
kontrolleret miljø. Med det menes der hvor bilen til at starte
med kun kan køre frem eller tilbage. At lys sensorerne ikke
flyttes rundt til andre placeringer under testene. Under den
første test med den overordnede model udførte vi testen på denne
måde, for at mønstrene kunne genkendes var det dog nødvendigt
at sætte treshold op for hvor tæt inputværdierne skulle være
inde for et mønster. Med denne test vil vi afprøve om de grundlæggende
elementer fungere i vores kode. I første omgang drejer det sig
om bare at genkende et tidligere læst pattern. Vi vil også under
samme test finde ud af om den måde vi lagre et pattern er brugbar.
Testen medførte at vi efter at vi havde ramt med en kritisk
sensor en gang og samplet et pattern kunne genkende det og nå
at stoppe tids nok til at kunne reagere på det. Testen var en
succes og bilen havde ingen problemer med at reagere. Det betød
dog at bilen kom til at reagere et stykke fra muren, da den
ikke lavede nogen optimering af reaktionstiden. Vi kunne ved
samme test hvor relaxation ikke var høj se at vores lagring
af patterns ikke så ud til at skabe problemer. Vi kunne dog
se at vi havde fået lavet et godt fundament som fungerede og
var godt til at bygge videre på.
|
|
Project
Log Entry 4 |
| Date: 17/05/06 og 22/05/06 |
Til Toppen
|
| Duration of activity: |
18 timer |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCar2.c |
Mål:
Videreudvikling af match mekanisme sådan at det bliver muligt
for bilen at finde ud af hvornår der skal reageres på et pattern.
Løsningsidé
I starten var det planen at bruge en træ- eller liste-struktur
af samples til at vurdere, om en sample, der har reageret på at
den har ”klikket”, er en success eller ej. Efter at have brugt
noget tid på realisering af denne løsning og diskussioner om den,
blev det besluttet at lave en enklere løsning, hvor der bruges
en tidstest i stedet. Denne tidstest er indtil videre lavet ved
at have en ”evaluation period”. Et patterns reaktion anses som
værende en success, indtil det modsatte er bevist. Hvis CriticalSensor
bliver udløst inden ”evaluation period” er ovre, så bliver patternreaktionen
markeret som critical. Denne markering af bliver brugt som tidligere
beskrevet.
Når en ”evaluation period” er i gang, så undertrykkes criticalPattern-
og CriticalSensor-reaktion.
I denne løsning er der flere ting som kan der kan ”leges” med:
- Timermekanisme
- Akkumulativ tid. Evaluation Periods længde stiger,
i takt med at der er en længere og længere kæde af critical
events, der har resulteret i den sample, hvis reaktion
der skal testes. (Denne kæde behøver ikke være udspecificeret,
derimod kan man lade hver sample indeholde hvilken længde
evaluation period, de ikke bestod.)
- Derudover kunne man evt. sætte mere komplicerede
movementPatterns sammen og bruge dette til at generere
mere komplicerede reaktioner og opførsel.
- Random tid eller konstant tid.
- Reaktioner
- Test af forskellige reaktioner. Det kunne fx være at
en Sample bliver testet med fire eller flere reaktioner
og kun bliver markeret som critical hvis alle rammer CriticalSensor
indenfor ” evaluation period”.
Erfaringer
Vi har via implementeringen i simulatoren fået en god ide
til hvordan algoritmen skal opbygges. Hver gang at et pattern
klikker bliver der holdt øje med at der ikke er aktivering
af en kritisk sensor inde for det tidsrum hvor reaktionen
på genkendelsen sker. Hvis kritisk sensor aktiveres indenfor
tidsrummet(evaluation period), markeres dette pattern som
kritisk og den sampling der var lige inden, der var en genkendelse,
bliver gemt som et nyt pattern. Næste gang det så mødes laves
den samme undersøgelse igen, er det muligt at reagere så der
ikke aktiveres en kritisk sensor.
Test
Vi har i denne test igen valgt at teste i det kontrollerede
miljø hvor vi kun kan køre frem eller tilbage. Det skulle nu
være muligt for bilen at finde en reaktionstid så den senest
muligt reagerer og kører i modsat retning. Relaxation er sat
ned til 3, så samples til at finde vægen bliver meget finkornet..
Efter at have kørt frem og tilbage ca. 10 gange skiftede bilen
retning, tidsnok til at den ikke kørte ind i muren. Der bliver
altså opbygget et reaktionsmønster hvor tidligere patterns er
markeret som kritiske, når bilen så har mødt dem igen er der
blevet oprettet et pattern ud fra det sample lige inden.
Matchmekanisme
Matchmekanismen (CompareTo, senere CompareToCurrent)
er blevet implementeret i en meget primitiv udgave. Hvis de
nuværende motortilstandene er de samme som pattern'ets motortilstande,
så tilføjes 50 point til et patterns score for hver inputport
x (x = 1, 2) hvor:
nuværende inputx - relaxation < pattern.inputX
< nuværende inputx + relaxation
Hvis matchværdien er over clickThreshold, som i nuværende
kode betyder at ovenstående dobbeltulighed er opfyldt for
både x = 1 og x = 2, så sættes pattern til at reagere. I nuværende
implementation er det det først klikkende pattern som får
lov til at reagere. Dette vil blive udvidet senere hvor det
bliver den der er nærmest de nuværende værdier, der bliver
sat til at reagere.
Man kan i matchmekanismen lege med mange forskellige ting.
Vi har undladt at implementere eller på anden måde at gå i
dybden med disse ting, men de idéer der har været oppe er:
- Sandsynligheder ud fra normalfordelinger eller andre fordelinger.
- Brug af statistik over de forskellige input, til at tolke
signifikansen af deres variation.
- Sammenholdning af patterns med samme type reaktion/action
til at identificere en vægtning af de forskellige input.
Grunden til at vi ikke har forfulgt nogle af disse aspekter
er, at vi ville have en funktionel version først som vi kunne
bruge til test og til at videreudvikle på. Uddybning følger.
|
|
Project Log Entry 5 |
| Date: 24/05/06 og 29/05/06 |
Til Toppen
|
| Duration of activity: |
18 timer |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCar.c |
Mål:
Til denne gang er det vores mål at få implementeret en fornuftig
action selection mekanisme, som skal afprøve forskellige handlinger
som vil bringe bilen ud af den kritiske situation. Vi vil teste
mekanismen ved at bruge robotten til oplæring af forskellige ugeopgaver.
Grundide til implementation
Ideen til hvordan vores actionselection mekanisme skal fungere
er sådan at når et pattern bliver genkendt skal bilen afprøve
nogle forskellige handlinger. For at vurdere om en handling
er en succes kigges der på om der inden for en tid efter at
handlingen er begyndt rammes en kritisk sensor. Hvis det er
tilfældet at handlingen fejler skal der angives en ny handling
til det tilhørende pattern. Næste gang at dette pattern så klikker
skal den nye handling afprøves. De actions som bilen afprøver
er sådan at den gradvist prøver at lave et større sving, og
skift mellem venstre og højre. På den måde findes der lige præcis
den handling der tilstrækkelig til at bilen kan komme ud af
den kritiske situation. For at optimere på om handlingen bliver
en succes har vi valgt at der skal være en reaktionstid efter
at handling er blevet udført hvor bilen kører lige ud, hvis
bilen har lavet et lille sving som ikke tog så lang tid skal
den altså kører længere tid lige ud efter handlingen. Hvis denne
reaktionstid ikke er med kan lille sving bliver klassificeret
som en succes, hvor den ikke burde være det da bilen ikke er
nået ud af den kritiske region..
 |
ActionSelection. Figur 3.
Figuren viser afprøvningsmønsteret for at finde den optimale
handling. Alt efter hvor direkte bilen kører ind skal
der færrere antal handlinger til at finde ud af hvilken
handling, der var den mest optimale. |
 |
ReactionTime. Figur 4
For at kunne nå at vurdere om en kort handlinger er en
succes vurderes der i en reaktionstid efter at handlingen
er blevet udført. |
Implementation
For at vi nemt kan lave nye actions til bilen har vi tilføjet
dem som structs. Hver action består af to motorstates og to
motorpowers, samt en tid for hvor langt handlingen skal foregå.
Den centrale funktion til denne funktionalitet er ReactionUpdate.
Her bliver der vurderet om en action er blevet udført med succes,
hvis ikke vælges der her en ny action. Under hvert gennemløb
af updatefunktionen kaldes ReactionUpdate. Hvis der har været
et klik på et pattern er der blevet angivet en handlings tid.
Så længe der er tid tilbage fortsættes handlingen. Hvis ikke
der er handlingstid tilbage bliver bilen sat til at udføre default
action som er at køre fremad. I samme funktion undersøges der
om den kritisk sensor er blevet aktiveret. Hvis det er tilfældet
er den nuværende handling ikke en succes, og der skal skiftes
til en anden handling, som så kan afprøves næste gang at dette
pattern klikker.
Kode ind fra reaction Update funktion

Beskrivelse af konstanter:
Da vi under netop disse labsession virkelig fandt ud af hvordan
forskellige konstanter havde betydning for hvor godt indlæringen
af robotten foregik vil de nu blive forklaret lidt grundigere.
For hver konstant er der forklaret følgende:
- Formål
- Hvor bliver den brugt.
- Hvilken indflydelse har dens værdi på indlæringen.
- Hvilke ting kunne den udvides med, hvis vi havde 3 måneder
mere at arbejde på det. Hvilken indflydelse har ændringer
af de forskellige konstanter i programmet?
- - LearnedSamples
- Størrelsen af LearnedSamples afgør hvor mange forskellige
situationer der kan læres. Hvis man vil have et lavt
antal lærte samples og stadig have at robotten genkender
de vigtige situationer, så kan man vælge at sætte
relaxationvariablen til en høj værdi.
- - Relaxation
- Relaxationværdien afgør hvor finkornet robotten anskuer
samples på. Ved en lav værdi, vil robotten skulle lære
mange flere samples, end ved n høj relaxationværdi.
Den vil dog skelne bedre mellem forskellige situationer
ved en lav værdi og er bedre i stand til at lære præcis
opførsel.
- Lav relaxationVærdi vil medføre at robotten får et
mindre antal ”false positives”. Ved høj relaxation vil
antallet af ”false positives” stige.
- Relaxationværdien har også stor indflydelse på ”oplæringsperioden”,
da relaxationværdien der stor indflydelse på hvor hurtigt
robotten ”konkluderer” kritiske situationer og reaktioner
derpå.
- actionTimeSlice (actionTimer) (En variabel på den enkelte
action-struct)
- Hvis den værdi er lav, så medfører det at der skal
læres flere situationer for at undgå en kritisk situation,
da den kun delvist vil komme ud af den ”tæt-på-kritiske-situation”.
Fx kunne man forestille sig at robotten skal dreje til
venstre når den er ved at støde ind i en væg. Med en
lille actionTimeSlice, så vil den ikke få drejet 90
grader, men måske kun 10 grader. Denne action bliver
ikke markeret kritisk, da det først er når der køres
fremad igen, at der opnås kritisk tilstand. Den skal
derfor lære at dreje til venstre igen, når den står
med en 10 graders vinkel foran en væg. Det er nu tydeligt
at actionTimeSlice har en stor indflydelse på indlæringstiden
og antallet af samples der skal læres. Men ved denne
større indlæringstid, får man også en bedre og mere
præcis avoidence
- ReactionTimeSlice (ReactionTimer)
- ReactionTimeSlice er længden af Evaluation Period.
Ved oplæring af en robot, indlæring hvor man som person
skal give CriticalSensorTriggered, kan man sætte ReactionTimeSlice
op, så man kan nå at give robotten input til dens actions.
Dvs. hvis den drejer til højre ved en sampleclick og
man vil have den til at dreje til venstre i stedet,
så er skal man nå at trykke på CriticalSensor inden
ReactionTimeSlice løber ud.
- PowerConstant
- En variabel der angiver hvor meget power der skal sættes
på de forskellige outputporte. At have motorens power
som konstant begrænser antal patterns og dermed indlæringstiden
for bilen.
- ClickThreshold
- Angiver mindsteværdien for at en sample-sammenligningsscore
bliver anset for at være et ”klik”.
- Man kunne overveje at lave denne mere dynamisk, men
for at holde programmet simpelt, så er det undladt.
- PossibleActions[possibleActionAmount]
- Dette array indeholder de mulige opførsler en sample
skal prøve at bruge. Et stort antal actions ville kunne
bruges til at opnå bedre reaktioner, men ville også øge
indlæringstiden. En ting man kunne gøre var at lave forskellige
opførsler, og for hver opførsel have flere tider de blev
prøvet i. Man kunne udvide dette aspekt, ved at have sekvenser
af opførsler. Men på den anden side opnås dette allerede
med samples. (uddyb evt. her)
Tests:
- Follow-wall
- ReactionTimeSlice blev sat ned til 1000ms.
- Og ActionTime blev sat til 100ms.
- Tog omkring et par minutter og den havde 20 samples,
måske lidt mere.
- Follow-line
- Relaxation blev sat op til 10.
- Tog ca. 4 minutter før den fulgte banen i nogenlunde
stil, den kørte dog stadig af banen en gang imellem. Den
klarede sig med under 10 samples.
- Follow-road på Lego-roadsystem
- Delvist success. Det gik galt pga. den drejede i for
lang tid. Vi ville have opnået den rigtige opførsel, ved
at sænke reactionTimeSlice og actionTimeSlice. Dette blev
dog ikke gjort, da der var andre og vigtigere ting at
bruge tid på.
Oplæring af Robotten
Oplæringen af Lego-bilen foregår ved hvad man kan kalde kalibrering
af dens opførsel. I oplæringssetups er der flere ting som man
skal tænke over:
- Er det muligt for bilen en at konkludere rigtigt, ved hjælp
af de sensorer man har stillet til rådighed for den.
- Hvordan kan placeringen af sensorerne bruges til at give
bilen bedst mulig information, så den kan drage de bedste
mulige konklusioner.
- Hvordan laves støttehjulene (dvs. det der sørger for at
der kommer criticalSensorTriggered på de rigtige tidspunkter)
så det ikke ændrer på bilens ”verden” at de bliver fjernet.
Man kan sige at man koder bilens opførsel, ved at give den
de forudsætninger og motivationer som resulterer i en bestemt
opførsel. (hvis man da har tænkt sig ordentligt om) I løbet
af projektet har vi primært testet ved at oplære Lego-bilen
til wall-avoidence, men vil nu give eksempler på setups til
at oplære en Lego-bil til et par forskellige ting.
Follow-line setup:

Figur 5 Setup til oplæring af Lego-bil til followline behaviour.
Billede af followline
På billedet af followline-setup, ses en linie (a), 2 lyssensorer
(b), bumpsensorer (c) og vægge (d). Tanken bag ovenstående setup
er at få robotten til at lære at afvigelse fra linien er dårligt.
Væggene og bumpsensorne agerer, med andre ord, støttehjul i
followline-oplæringen.
Det er nødvendigt i dette setup at sørge for at afstanden til
væggene giver mulighed for at Lego-bilen kan drage de rigtige
konklusioner og at væggene ikke har indflydelse på lyssensorværdierne.
I vores followline brugte vi dog ikke dette setup, derimod lavede
vi supervised oplæring.
Follow-wall setup:
Som Followline, bare med lyssensorer ud til siden.

Billede af followwall
Avanceret Opførsel
Man kunne forestille sig at man kunne opbygge forskellige opførsler
og overgange mellem opførsler. Man kunne forestille sig at man
oplærte en Lego-bil til follow wall, men at den ved en eller anden
hændelse gik over i en anden opførsel, som man havde lært den,
det kunne fx være followline. Det ville dog være nødvendigt med
en mere avanceret sammenligningsfunktion en den der er i programmet
nu, da det ville være nødvendigt at man på en eller anden måde
sorterede de ikke-relavante input fra. (enten ved at programmet
gennemskuer det eller ved at ”træneren” definerer det). Man kunne
forestille sig at man havde en Lego-bil som skulle mappe et vejsystem.
Den umiddelbare løsning ville være at lave thresholds og kalibrere
disse. Afhængigt af hvilke farver vejene/grøfterne er eller sensorer
man bruger, vil man sammenligne i forhold til dette threshold.
Derudover ville man have selve kortlægningsalgoritmen. Med det
princip vi har implementeret og en lignende generalitet i mapping-koden,
ville man kunne oplære Lego-bilen, uafhængigt af hvilke typer
veje og sensorer der bruges. Der vil i diskussionsafsnittet komme
lidt mere om hvordan man kunne forestille sig at man gjorde dette.
Udover at man har denne generiske oplæring, så ville man også
kunne kode Lego-biler helt enkelt ved at oprette patterns statisk.
Dvs. i stedet for at sidde og kode ”drej-til-venstre-når-denne-threshold-er-overskredet”,
kan man oprette et pattern med en værdi og passende relaxation,
med en tilhørende ”turn-left”-reaction.
|
|
Project
Log Entry 6 |
| Date: 30/05/06, 31/05/06 og 05/06/06 |
Til Toppen
|
| Duration of activity: |
20 timer |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCarv1.c LearningLegoCar.h
samplestack.c samplestack.h |
| Mål At teste
bilens opførsel ud fra hvordan de forskellige centrale variabler
er blevet indstillet.
Eksperiment d. 30/5/06.
1. Deleksperiment Ændring af relaxation.
Eksperiment 1.1:
(på bane-bordet)
I dette eksperiment brugte vi følgende værdier:
Lyssensor click-interval: +-4, Det vil sige at et hit
på den enkelte sample kan ligge inden for et interval
på 4 over og under den gemte værdi i det pågældende
pattern.
Faste variabler
ReactionTImeslice: 1000
ActionTimeslice: 800
Samplelength: 5
ClickThreshold: 80
samplerate: 30ms.
Refleks-adfærd: Rot.left, Rot.right, forward(default),
collision back up(hvis fremad)
Billede til højre viser de fysiske opsætninger.
2 lyssensorer og en bumbsensor kørende på bane bordet. |
 |
Efter 5 minutters kørsel klarede robotten knap 1½ minut uden
kollisioner. Den havde på dette tidspunkt lært 152 samples.
Herefter ramte den ned i et hjørne, hvor den desværre fik
lært en masse dårlige ting. Vi udskriver antal lærte patterns
i displayet, og kunne se det vokse hurtigt, og uden fornuft.
Det er en kompleks situation at befinde sig i, da den fik
placeret sig selv så den havde mur 1 cm foran sig, og 1 cm
bag sig.
Eksperiment 1.2:
Ændring af click-interval til +-8
Vi forventer at den vil lære færre samples, men at den vil
få en bredere klassificering, altså få en knap så finkornet,
Resultat:
Kørte efter 5 min. Ca. lige så godt som i forrige eksperiment,
men med kun 95 samples lært, altså en hel del hurtigere oplæring..
Eksperiment 1.3:
Vi prøver nu med et click-interval på+-20
Herefter håber vi at få et billede af denne værdis betydning
for…
Efter ca. 1½-2 minutter kørte den ret godt på banen i forhold
til de 2 forrige, og på det tidspunkt havde den lært 15 patterns.
Efter yderligere 1 minut kørte den stabilt og godt uden at
støde ind i ting, men den valgte pudsigt nok næsten aldrig
at dreje til venstre for at undgå at støde ind i ting. Det
at den valgte højre, må jo siges at være fint nok, idet denne
adfærd faktisk var en succes. Når den kom skråt ind mod en
kant på dens venstreside, kunne den nå at dreje så meget til
højre at den kørte i den modsatte retning langs med kanten.
Den anden vej kunne den følge kanten hele vejen rundt, faktisk
ind til vi manuelt ændrede dens retning med vores tykke pølsefingre.
Vi lod den køre yderligere 20 min., til den havde kørt ½ time
i alt. På det tidspunkt havde den lært 91 patterns, og var i
stand til at køre næsten fejlfrit, dvs. der gik mere end 5 minutter
uden kollisioner til sidst, og der kunne formentligt have gået
langt længere, hvis det ikke var fordi vi havde flere planer
med tiden i dag, og derfor skulle videre. Til gengæld var den
blevet lidt mere forsigtig da vi kom tilbage, dvs. den drejede
meget tidligt i forhold til hvor tæt den var på kanten. På det
tidspunkt var solen gået væk, og det var overskyet, og vi mener
at disse ændrede lysfohold fik den til at klikke tidligere på
de enkelte patterns, og de ændrede forhold kan derfor have været
medvirkende til robottens øgede evne til at undgå kanterne.
2. Deleksperiment ændring af relaxation ved lav action-duration
Eksperiment 2.1
Vi prøver nu med (stadig) +-20 på click-interval, da det gav gode
resultater, men nu justerer vi parameteren ”action-duration”,
altså hvor lang tid en reaktions-adfærd, forsaget af en kollision,
varer. Vi forventer at det vil have indflydelse på hvilke reaktioner
robotten lærer er hensigtsmæssige, og dermed vigtige for dens
generelle evne til at undgå forhindringer. I de tidligere eksperimenter
har vi haft en action-duration på 1 sec., og i de følgende starter
vi med at prøve at sætte den ned til 0.2 sec. Tillige sætter vi
evaluationperiod ned til 0.3 (begge starter samtidigt, dvs. eval
varer kun 0.1 sec længere)
Resultat:
Hold da fast! Vi blev meget overraskede over resultatet. Efter
ca. 2 minutter kørte robotten næsten fejlfrit, men denne gang
med rigtig mange reaktioner meget tæt på kanterne, og stadig
uden at støde ind i dem. Reaktionerne virker tillige mere
naturlige, idet det nu fremtræder som om at en sekvens at
små handlinger udgør en samlet reaktion. Det ser fedt ud.
En anden vigtig ting vi nu kan se er at træningsudgangspunkt
meget vigtigt. Vi genstartede nemlig robotten fra et dårligere
udgangspunkt, nemlig ned mod et hjørne, og det betød at den
hurtigt fik samlet en hel del dårligere patterns op meget tidligt.
Dette forstyrrer kvaliteten af det robotten lærer. Den lærte
meget hurtigere flere samples, hvilket jo må være en naturlig
konsekvens af at den reaktioner nu varer kortere, og den derfor
vil have flere kollisioner. Alt i alt et meget spændende eksperiment
med overraskende og lærerige resultater.
Robottens valg af reaktioner er pt. Primitivt. Den går en liste
af mulige reaktioner igennem sekventielt, og starter eksempelvis
altid med at forsøge et højredrej. Det er helt sikkert medvirkende
til at robotten igennem flere af eksperimenterne har udviklet
en adfærd der bygger på at undgå forhindringer vha. højredrej.
Vi overvejer at ændre denne sekventielle gennemgang af adfærd
i kollisionssituationer, men den er guld værd her, idet den
giver en meget god forståelse af hvordan robotten faktisk lærer.
I teorien burde det ikke have indflydelse, da et højredrej i
en given situation burde klassificeres ud fra om det var en
succesfuld reaktion eller ej, men virkeligheden er mere nuanceret.
Det tyder på at evaluationperiod kunne være for lav, hvis et
højredrej klassificeres som godt, hvor et venstredrej faktisk
ville være bedre, set fra vores ekspert-øjne.
Eksperiment 2.2
Vi forsøgte at skrue click intervallet ned til 8, og bibeholde
de andre værdier fra forrige eksperiment. Dette var ikke en
succes. Robotten havde en tendens til at stå og oscillere
når den kom ned i et hjørne.
Eksperiment 2.3
Vi prøver nu med clickinterval tilbage på de 20, og med actionduration
på 200 og evaluationperiod på 500. Efter de første 200 vil
bilen kun køre ligeud, men vi forventer at det vil have en
effekt på hvor skarpt bilen lærer at dreje, og at det vil
få den til at blive bedre til at lære at dreje til venstre.
Resultat:
PROBLEM:
”Hold da fast!” Eksperimentet fungerer ikke længere med tilnærmelsesvis
den samme succes. Vi er sikre på at koden er den samme, helt
sikre, og at vi kører med de samme parametre. Altså må det være
lysforholdende, eller robottens startbetingelser. Selv efter
at have prøvet flere forskellige startbetingelser, giver det
ikke noget der minder om det tidligere resultat, altså må det
være lysforholdende. Kl. er nu 18, og det ER blevet væsentligt
mørkere indenfor de sidste timer. Dog utroligt, hvis det skulle
være det der er galt.
Vi prøver nu at skrue lyssensor click-intervallet ned fra
+-20 til +-8
Resultat: Det blev værre. Vi afsluttede eksperimenterne for
denne dag da vi mente at lysforholdende havde for stor påvirkning
på eksperimenterne.
NOTER:
Followline experiment(og måske follow wall, da vi jo har prøvet
det), og supervised vs. Unsupervised learning.
30/5 duration: fra 1200 til 1930, 7½ time. Primært med eksperimenter
med parametrenes betydning for robottens evne til at lære
og reagere. Dog også en hel del med rapport-skrivning.
31/5/06
Dagens første eksperiment: kl. 1010
Vi prøvede med HK-eksperimentet fra i går, men med +-40, hvilket
var meget højt. Vi håbede på at robotten ville blive bedre
til at dreje til venstre, da den i højere grad ville klikke
på de samme patterns, og dermed få afprøvet flere forskellige
reaktioner.
Resultat: Robotten blev bedre til at dreje til venstre, ikke
meget, men dog en hel del. Til gengæld fik den en hel del
sværere ved frontale sammenstød med væggen, og i hjørnerne,
hvor den havde en kraftig tendens til at blive hængende og
prøve alt muligt.
Eksperiment 2: (Kl. 1330)
Implementeret semi-incremental reaktionstid, og random valg
af om den vil til venstre eller højre. Ideen skulle være at
den forsøger de samme reaktioner igen og igen, men i længere
tid hver gang. (0.2, 0.4, 0.8 pt. ) og med +-20
#Reaktioner: 6
Reaktionsvarighed: 800
Evalueringsvarighed: 1000
Resultat:
Udmærket resultat. Robotten lærte både at køre til højre og
til venstre, og blev faktisk god til at køre udenom væggene.
Vi har stadig et problem med hjørnerne, hvor den ikke kan
finde ud af hvad der er bedst for den. Det er sådan set fair
nok, idet den ikke med de nuværende sensorer ikke kan sige
hvilken væg den kommer ned langs, når den rammer et hjørne.
Eksperiment 3: (Kl. 1340)
Vi kører nu med 8 reaktioner, men ellers samme som før.
Resultat:
Bedre til at komme ud af problemer i hjørnerne.
Eksperiment 4: (kl. 1630)
Vi har nu ændret systemet, så den ikke opretter lærte patterns,
mens den er i gang med en undvigelsesreaktion. Vi mener at meget
af det den lærer under reaktionerne er ubrugeligt, og forventer
at den nu lærer færre patterns, og vil køre mere præcist.
Resultat:
Robotten lærer nu væsentligt færre patterns. Efter 5 min. Har
den ikke lært mere end 20, men kører faktisk rimeligt præcist.
Det tager altså væsentligt længere at lære tingene nu, men det
lader til at kvaliteten af dens lærdom er bedre.
Eksperiment Final
Relax -+20, Reactiontime 1600, Eval
Time 1600, 8 Actions
Resultat:
Den kører rigtig godt med disse indstillinger, svingene kan
blive store men kun hvis det er den mest optimale handling at
foretage i den situation. Små sving sker stadigvæk hvis vinklen
ikke er så skarp ind til muren. Efter 5 min. kan den køre rigtig
godt rundt på banen med kun 15 samples. For lige at være sikker
på resultatet blev eksperimentet gentaget et par gange med det
samme resultat til følge.
Eksperiment passive lyssensorer.
Test med passive lyssensorer Lav relaxation på 5.
Resultat: Ok, men ikke så godt som de forrige Den er god til
at genkende patterns men det kunne være bedre med et lavere
lysinterval. Da vi ikke har mere tid må vi stoppe her.
Konklusion på tests 30/05/06 og 31/05/06
Vi kunne efter at vi havde udført de forskellige tests
kunne vi se at bilen på flere punkter opførte sig som forventet.
Ved høj relaxation var der få samples, men flere fejl-tolkninger.
Hvis der sammetid var mange mulige forskellige actions kunne
vi også se at det var nødvendigt med en ikke alt for lav relaxation,
da det ellers var for svært at klikke på det samme pattern igen.
Desuden fandt vi ud af hvilke minimums grænser for evaluerings
tiden for en action, der var nødvendigt for at en action ikke
for hurtigt blev vurderet til succes. Med resultaterne af testen
fandt vi desuden den opsætning til præsentation til den næste
dag. Denne opsætning er hvor relaxation er på 20 og 8 actions
hvor tiden til evaluation af action ændres i forhold til hvor
stort svinget er.
Eksperiment 05/06/06
Mindre antal Samples
Et problem ved indlæringen i ovenstående forsøg er at der
var et højt antal samples. Dette skyldtes at hver gang en
behaviour blev testet af og gik galt, så blev der oprettet
et nyt pattern. Efter at have ændret dette, så faldt antallet
af patterns drastisk og indlæringen blev bedre. Denne bedre
indlæring blev vist til fremvisningen og vil blive gået lidt
mere i dybden med herunder.
Testen:
Testen i dag, gik ud på at dokumentere indlæringen af Lego-bilen
kvantitativt, i stedet for de mere beskrivende forsøg tidligere.
Test-setup:
-
- Mål:
- At lære Lego-bilen at bruge to aktive lyssensorer til
at undgå at støde ind i vægge. Når bilen ikke har andet
at lave (avoid) så kører den fremad.
- Hvor
- Testen blev foretaget på banebordet (Det blå bord)
- Kritisk sensor input:
- Kritisk sensorinput er to pressure-sensorer, forbundet
til ”kofangere”. (De kan nok kun fange noget lidt mindre
end køer, måske hamstre, måske mindre endnu.)
- Data:
- Hvert 30. sekund aflæses antal patterns lært og antal
gange den kritiske sensor er blevet udløst.
- Antal tests:
- Der er blevet kørt 2 forskellige tests og hver test er
kørt 3 gange.
- I den første testtype startede bilen med at køre vinkelret
ind på væggen, i den anden testtype startede bilen med at
køre skråt ind mod et hjørne.
- Settings:
- Standard opsætningen som også blev brugt under præsentationen.
- Forventninger:
- Det forventes at Lego-bilen begynder at køre nogenlunde
stabilt inden der er gået 5 minutter, dog vil den stadig
mangle at lære nogle situationer at kende.

Figur 6: Startsituationer ved oplæring
- Argumentation for test:
- Test af konsekvenserne af hvordan starten af oplæringen
påvirker indlæringstiden.
- Testværdier hver 30. sekund giver en tilpas opløsning
til at det er muligt at se både situationerne hvor Lego-bilen
tester reaktioner og den længerevarende forbedring i mindsket
antal kollisioner med væggen.
- Der er lidt forskel på informationerne i testene. De
første (1 og 2) blev ikke tjekket for antal lærte patterns.
Det gjorde 3 og 4, men de kørte ikke længe nok til at
frembringe den tydelige udjævning i antal kollisioner
med væggene. De sidste to tests blev kørt i 16½ minut.
- X-aksen er tid, y-aksen er det samlede antal kritiske
sensor input og lærte patterns, til tid x.
Herunder ses graferne over Test 5 og 6.

Det ses at der i starten af begge kurver for antal CriticalSensorTriggered
stiger ud med at stige hurtigt, men begynder efter nogle minutter
at jævne ud. Der ses en tydelig forskel på Test 5 og 6 i hvor
hurtigt og pludseligt udjævningen i stigningen i antallet af
CriticalSensorTriggered.
Vi mener at denne forskel skyldes at Test 6 fik håndteret hjørnesituationen
fra starten og da det er denne der er ”sværest” og som udløser
flest CriticalSensorTriggered. Dette medfører, udover at der
er et knæk i kurven for CriticalSensorTriggered, at der også
kan ses et knæk i antal lærte patterns. Dette knæk skyldes at
de patterns der skal læres for at komme ud af et hjørne (Aktive
lyssensor har en afstand, hvor de næsten ikke skifter værdi
mere) bliver lært fra starten.
Derudover ser det ud til at det tager under 20 minutter at lære
Lego-bilen op til at undgå at støde ind i væggene. Men allerede
efter 4-5 minutter kørte den forholdsvist pænt i alle testene.
Det skal nævnes at vi efter 8 - 10 min begyndte at give bilen
udfordringer. |
|
Præsentation
af projekt |
| Date: 31/05/06 |
Til Toppen
|
| Duration of activity: |
4 timer |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCar.c LearningLegoCar.h
samplestack.c samplestack.h |
Mål: Lave en
præsentationsplan som kan bruges som udgangspunkt til præsentation
i studenterhallen den 1. juni.
Overskrifter:
- Koncept og motivation
- Implementation
- Eksperimenter
- Problemer, ting vi ikke nåede
1 Koncept og motivation
1.1 Abstrakt
Et generelt læringssystem til robotter, der selv skal kunne
tilpasse sig forskellige opgaver, udelukkende ved hjælp af
reaktioner og de stimulus der trigger reaktionerne. Eksempelvis
skal dette system kunne lære både obs. Avoid, follow-line,
og follow wall vha træning /oplæring både supervised og unsupervised.
1.2 Indgangsvinkel
Systemet lærer specifikke situationer at kende og forsøger
at tilknytte forskellige reaktioner /adfærdsmønstre til disse
situationer. Når den forsøger sig med given reaktion til en
situation måles succesen i fht. om den efter denne reaktion
ikke ender i en av-tilstand i x antal sekunder efter. Hvis
den gør det vil den forsøge sig med en anden reaktion næste
gang den genkender samme situation. Ellers husker den sin
succes.
2 Implementation
- 2.1 Definitioner:
- Kritisk hændelse:
- En tilstand som Legobilen skal lære at undgå. I vores
eksempel bruges bumpsensor. (og patterns)
- Sample:
- Et snapshot af Legobilens tilstand.
- Pattern:
- Et billede af Lego-Bilens tilstand før der skete en
kritisk hændelse. Pattern bruges til at prøve at undgå
den kritiske hændelse. Hvis dette ikke er muligt, så markeres
det enkelte pattern, selv som kritisk hændelse. En pattern-kritisk-hændelse
er lidt ”mildere” end en sensor-kritisk-hændelse.
- Reaktion (Actions)
- Et grundsæt af simple handlinger som Lego-bilen har
til rådighed.
- Klikker
- At et pattern klikker, betyder at den inden for en udregnet
sandsynlighed er det pattern som svarer til den tilstand
Lego-bilen er i.
- 2.2 Algoritmen
- Mainloop: Sense – Plan – (Learn) - React
- Initialisering
- a. Der køres en kort historik over sensorinput. Når
en kritisk hændelse sker, så oprettes et pattern, baseret
på historikken og robottens tilstande.
- Kritiske hændelser
- b. Når Legobilen rammer en kritisk hændelse, går den
i panik. Fx kan den køre baglæns medmindre den er i
gang med at køre baglæns, ellers forlæns.
- Genkendelse
- c. Mens den kører rundt, prøver den hele tiden, at
genkende de ting den ser. Hvis den ser noget den kender
i forvejen, så reagerer den. Denne reaktion er delt
op i to tilfælde. Den ene hvor den prøver at reagere
fornuftigt og i det andet tilfælde, den hvor pattern
er kritisk hændelse, gås der i panik.
- Reaktion
- d. Når pattern som ikke er kritisk hændelse ”klikker”
prøver det de mulige reaktioner af. Den opdager at en
reaktion ikke var god, når den går galt.
- 2.3 Vigtige ting i implementationen:
- Hvordan vurderes et pattern til at være en klikker?
- Hvordan vurderes en reaktion?
- 2.4 Referencer
- Klik = Prioritet.
- Reaktioner = Subsumption.
3. Eksperimenter
- 3.1 Variabler og betydning
- Relaxation
- En variabel der bruges i klik-funktionen.
- Reaktions-længder
- Længden af reaktioner definerer hvor finmotorisk eller
groft Lego-bilen reagerer.
- Evalueringslængden af reaktioner
- Den tid efter reaktionen der skal kunne køres ligeud
uden at opleve kritisk sensor.
- 3.1.1 Wall-avoiding:
- Selflearning, vha. bumpsensor.
- 3.1.2 Line-follow:
- Oplæring (medmindre der blev lavet en cool testbane,
dvs. glasvægge.)
- 3.1.3 Wall-follow:
- 3.1.4 Road-follow/ditch-avoid.
- Oplæring eller smart ditch.
- 3.2 Erfaringer fra eksperimenter:
- Lysforhold betyder meget. Også mere end vi havde forventet,
ud fra vores tidligere erfaringer.
Skiftende lysforhold medførte at Lego-bilen skiftevis
var meget modig og meget forsigtig. Og nogen gange en
komplet idiot.
- 3.3 Betydning af sensor placeringer
- Betydning af at tænke over hvor man sætter sensorer,
både dem der bruges i patterns og de kritiske sensorer.
- 3.4 Vigtige variable
- Relaxation
- Lavt antal patterns vs. højt antal patterns
- Kort oplæring vs. længere oplæring
- Flere false positives ved høj relaxation.
- Reaktionslængder
- Yndefuldt vs. Klodset/stivemandsreaktioner
- Længere oplæring vs. kortere oplæring
4. Problemer og ting vi ikke nåede
- Sample weeding / Merging
- Bedre udvælgelse af reaktioner
- At markere de succesfulde reaktioner og bruge dette til
at vurdere patterns.
- Problemer med præference for en retning (højre eller venstre)
- Bedre klikfunktion
- Større antal og/eller bedre sensorer.
- Længere varende vurderingsmekanismer ovenpå det implementerede.
- Patternbillede kunne udvides med ”chain-of-events”-mekanisme
eller anden ”over-tid”-vurdering
- Indsamling af information om de enkelte sensorer. Både
deres variation (som kan bruges til relaxation) og hvornår
de bare er støj. Kort sagt, deres udvikling over tid. Derudover
mulighed for at opdage at de generelle lysværdier har ændret
sig over tiden.
- Brug af neuralt netværk.
- Man kunne bygge mere komplicerede opførsler op ved at
lære robotten op til forskellige ”tilstande”. Disse kan
så skifte ved at lave en struktur med:
- Opførsel1 – transition eventX – OpførselX – osv.
|
|
|
Diskussion |
| Date: 06/06/06 |
Til Toppen
|
| Duration of activity: |
1 time |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCar.c LearningLegoCar.h
pattern.c pattern.h sample.c
sample.h samplestack.c
samplestack.h tool.c tool.h
|
Hvor godt er projektet lykkedes?
Vi er meget tilfredse med den endelige løsning der giver gode
muligheder for videreudvikling i forskellige retninger. Set i bagklogskabens
ulideligt klare lys, var det nok ikke nødvendigt at lave simulatoren.
Når det er sagt, så tror vi dog at den ville kunne bruges som
et godt testværktøj til at udvikle de forskellige over- og ud-bygninger
af vores kode. Vi mener at det er lykkedes os at lave et system der faktisk er i stand til at lære basale ting udfra en primitiv biologisk model, baseret på smerte, fortolkning af stimuli og situationsgenkendelse. Vi har faktisk løst flere af de tidligere lab-opgaver (rent funktionelt) vha. vores system, nemlig folow-wall, follow-line og obstacle avoidance, kun ved træning og ændring af reaktiontider.
Vi har i løbet af vores projekt og også denne labrapport haft
mange idéer til mere avancerede løsninger af de enkelte dele
af vores algoritme. Derudover har vi overvejet brug af programmet til mere
avancerede opførsler og opgaver - desværre ikke nogen vi har haft tid til at lave. Nogle af disse videreudviklinger og vores
tanker om deres løsning (som vi desværre ikke har haft tid til
at lege med) vil blive beskrevet herunder.
Udvidelse af sample/pattern
Hvis man forestiller sig 2 patterns, med kun 2 lysværdier i hver, og med den samme reaktion tilknyttet begge patterns (disse eksisterer i hobetal i vores tests), kan man definere en ny type pattern. Hvis vi kalder lysværdierne i disse patterns for hhv. L11, L12 og L21,L22 og antager at L12 ligger tæt på L22, og L12 langt fra L21 kunne man prøve at lave et nyt pattern, hvor hver sensor-værdi i pattern'et får tilknyttet en vægt, der kan benyttes til at skabe en match-værdi for den pågældende sensor. I eksemplet ovenfor ville vi så øge vægt-tallet for den sensor der har de tætliggende værdier (L11, L21) og sænke vægten for den anden sensor. I beregningen af match-værdien for hele pattern'et vil vi så få en match-værdi der reflekterer at en sensor har større vægt i sammenligningen end en anden sensor. Dette princip har vi selv fundet på, men efter at have læst lidt om neurale netværk, kan vi se at det faktisk er et af grundprincipperne i disse netværk. Dette ville vi RIGTIG gerne have haft tid til at eksperimentere med, da det ville give vores system muligheden for at klassificere patterns, og "merge" dem.
Avancerede opførsler og reaktioner
Vi ville gerne have udstyret vores robot med en higher-purpose adfærd, altså et "drive" for dens eksistens. Det kunne være at lede efter lyskilder eller noget andet, for det er netop i lyset af en højere mening at adfærd i sig selv giver mening. Det ville ydermere have illustreret pointen med at reaktionerne ikke skal være arbitrære, da reaktionerne skal komplementere meningen med dens eksistens, altså dens højere mål. Vi ville også gerne have eksperimenteret noget mere med flere, mere advancerede adfærds-mønstre, med et større tidsperspektiv og andre, mere komplekse, succes-kriterier for adfærd/reaktioner, men som sagt har tiden været knap.
Weeding mekanismer
I vores implementation lever et pattern for evigt, uanset dets berettigelse. Det sker jævnligt at robotten lærer noget skidt, false-positives, men denne lærdom forbliver en del af dens lærdom. Hvis man til et pattern associerede en beretigelse-værdi, der hver gang robotten klikkede på dette pattern og udførte den tilhørende reaktion med succes, ville få talt sit beretigelses-værdi op, og talt ned når den tilhørende reaktion ikke virkede, ville man på denne måde få et tal, der altid skulle være større end 0 ved sunde reaktioner, og på et tidspunkt mindre end 0 ved usunde reaktioner. Dette kunne man bruge til at fjerne patterns, med en beretigelse-værdi mindre end 0, og dermed fjerne usunde erfaringer fra dens lærdom.
Yderligere overvejde vi at sikre at robotten ikke kan lære "endegyldige" sandheder. Endegyldige sandheder passer ikke godt til skiftende omgivelser, og derfor overvejde vi følgende: Alle patterns fjernes indenfor et tidsrum, men med en sandsynlighed baseret på deres beretigelses-værdier. På denne måde vil alle patterns med tiden blive dræbt, og nye skulle læres, men de mest brugte, og de mest sunde ville have den længste levetid. Dette ville give robotten bedre muligheder for at klare sig i skiftende omgivelser over tid.
Flere sensorer
Ved at bruge et større antal sensorer, ville man kunne få bedre
genkendelser af omgivelserne. Vi har brugt relativt få sensorer i vores projekt, og det har været medvirkende til robotten kun har kunne lære simple situationer at kende, og at den har haft lidt svært ved at finde ud af hvordan den f.eks. kommer ud af hjørner. I takt med at vi ville have øget antallet af sensorere, ville behovet for en mere avanceret klik-mekanisme a la ovenstående med vægte, nok have indfundet sig, idet at antallet af sensorer har en direkte indflydelse hvor mange patterns robottens ville lære indenfor et givet tidsrum, med den nuværende implementation. Der ville dog stadig være mange ting man skulle tage stilling til.
Det ville være nødvendigt at tage
ind i overvejelserne af sammenlignings/klik-funktionen, hvor
mange sensorer der "er hinandens modsætninger" (fx
lyssensor frem vs bagud) og deraf hvor mange sensorer der bør
være enige, før man mener at det er muligt at konkludere et
klik. Ved et større antal sensorer, ville sandsynlighedsregning
og statistik helt klart være noget der var meget at vinde ved
at tage med. (fx gennem neurale netværk eller lignende) Grunden
til at sandsynlighedsregning og statistik sikkert ville blive
nødvendigt, er hvis man stadig vil være uafhængig af viden om
sensorne, så er det nødvendigt at man prøver at gå ind og identificere
hvilke sensorer og hændelser der er uafhængige. Især hvilke
sensorer der er afhængige inden for en bestemt reaktion. Dette
er ikke noget vi har diskuteret ret meget, men det er helt sikkert
noget der ville være godt med gods i at undersøge.
Afsluttende bemærkning
Alt i alt føler vi at det har været et meget spændende projekt
vi har været igennem, hvor der stadig er mange gode muligheder
for viderudviklling. Det har været svært, sidst i projektet,
at lade være med at forfølge nogle af de idéer vi har haft tumlende
både i vores hoveder og verbalt til vores møder. Det lykkedes
dog at afgrænse os og vi mener vi har fået lavet en implementation,
der er tilpas færdig til at den kan bruges som platform for
videre udvikling, hvis vi eller andre får lyst til det. I forhold til at udvikle programmer der ikke skal forholde sig til ydre, diffuse inputs, har dette været en anderledes måde at lave programmer på. Hvor man ofte er vant til at man laver logiske fejl, har dette projekt været præget af at programmets ydeevne afhang af indstilling af parametre for at få hold på ustabile, og ofte utilregnelige inputs. Den fysiske verden er ganske rigtigt mere kompleks end dens vituelle pendant - men også på mange måder sjovere i kraft af uforudsigeligeheden og et mere håndgribeligt og ofte underholdende og overraskende resultat.
Anders Jacobsen
Martin Mortensen
Bjørn Petersen
Thomas Østergaard
|
Opsætning
og kørsel af den endelige kode. |
| Date: 06/06/06 |
Til Toppen
|
| Duration of activity: |
1 time |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
LearningLegoCar.c LearningLegoCar.h
pattern.c pattern.h sample.c
sample.h samplestack.c
samplestack.h tool.c tool.h
|
| Guide til kompilering og
afprøvning af LearningLegoCarp-kode
Programmet består af en række filer. Med mappen indeholdende
al koden som værende den aktuelle mappe, kompileres disse
til object-filer med gcc som følgende.
1. /users/legolab/RCX/`uname -s`/h8300-hitachi-hms/bin/gcc
-O2 -Wall -I/users/legolab/RCX/include -c LearningLegoCar.c
pattern.c sample.c samplestack.c tool.c
Object-filerne linkes til den resulterende srec-fil med følgende
kommando.
2. /users/legolab/RCX/`uname -s`/h8300-hitachi-hms/bin/ld
-T/users/legolab/RCX/Manual.dir/rcx.lds -o LearningLegoCar.srec
LearningLegoCar.o pattern.o sample.o samplestack.o tool.o
Den resulterende LearningLegoCar.srec overføres til RCX’en
som vanligt.
Robotten startes ved et tryk på ”Run”-knappen. Under kørsel
vises antal lærte patterns til venstre i RCX’ens display.
Tallet til højre viser den aktuelle behaviour. Et tryk på
”Run” under kørsel nulstiller robotten.
|
Simulator |
| Date: 06/06/06 |
Til Toppen
|
| Duration of activity: |
20+ |
| Group members participating: |
Anders, Bjørn, Martin og Thomas. |
| Source files: |
RobotSimulation.exe Learner.cs
LightSensor.cs Math.cs
Robot.cs RobotSimulation.cs
Sample.cs SampleStack.cs
Sensor.cs World.cs
WorldObject.cs |
Simulatoren
Hele konceptet med at lade systemet lære at reagere fornuftigt
på foranderlige forhold ved at sammenligne indkomne input
med gemt input var ganske nyt og uprøvet for os. Hvor godt
indlæringen ville fungere og om konceptet overhovedet var
brugbart var således uklart. For at afgøre en række presserende
spørgsmål, så mon, hvor godt fungerer konceptet, uforudsete
problemstillinger og hvad er muligt at opnå med konceptet
(fra hovedløs frem og tilbage til liniefølger), lavede vi
en simpel simulator, en windows-applikation (kræver .NET).
Hvis det ikke kunne virke under simulerede perfekte forhold,
ville konceptet ganske vist heller ikke virke på en Legorobot.
Simulatoren består ganske simpelt af en verden indeholdende
statiske vægge. I denne verden kan man så placere en eller
eventuelt flere robotter, som kan køre rundt og støde
ind i væggene. Grafisk er simulatoren ligeledes ganske
primitiv. Der er ikke noget med flotte billeder eller
noget, kun linier i 2D plan. Nedenstående skærmbillede
illustrerer simulatoren i en nøddeskal.

Screenshot af Simulator.
Skærmbilledet viser en robot der ved at køre frem og
tilbage har lært at undgå at støde ind i væggen.
Venstre halvdel af billedet er illustrationen af verdenen
i simulatoren. Fire vægge skaber et lukket rum hvori robotten
frit kan boltre sig. På billedet ses en enkelt robot med
4 sensorer; 3 afstandsmålere (de stiplede linier) og 1
tryksensor. Grundet simplicitet anvender simulatoren afstandsmålere
frem for de lyssensorer vi har anvendt på Legorobotten.
Afstandsmålerne måler den nærmeste afstand til en væg
i en given retning relativ til den robot hvortil måleren
er tilknyttet.
Ud over robottens færd ses en række brugbare informationer
om robottens tilstand og indlæringsmekanismen. Disse er
indrammet i kasser i højre halvdel af skærmbilledet.
Det var oprindeligt planen, at simulatoren skulle udvikles
sideløbende med Legorobotten og hjælpe os til hurtigt
og nemt at kunne afprøve ideer og ligeledes være bevendt
ved fejlfinding. Desværre var vi relativt tidligt i projektet
nødsaget til at nedprioritere simulatoren og udelukkende
fokusere på at få Legorobotten til at fungere tilfredsstillende.
Simulatoren i sin nuværende form styrer således robotten
efter en forældet implementering af vores styringsalgoritme.
Arbejdet med simulatoren var dog ikke helt forgæves. Vi
nåede således, allerede inden vi havde en kørende Legorobot,
at få afprøvet konceptet ved at lade simulatorrobotten
lære ikke at støde ind i væggene, når den kun kunne køre
frem og tilbage.
|
|
Referencer |
[1] Maja J Mataric, Behavior-Based
Control: Examples from Navigation, Learning, and Group Behavior,
Journal of Experimental and Theoretical Artificial Intelligence,
special issue on Software Architectures for Physical Agents,
9(2-3), H. Hexmoor, I. Horswill, and D. Kortenkamp, eds., 1997,
323-336.
[2] Schopper 87, Chapman 89. See [1] for further reference.
[3]Sequential and reactive control strategies
Chapter 5, pp.190-233 of Fred G. Martin, Robotic Explorations:
A Hands-on Introduction to Engineering, Prentice Hall,2001.
[4] A Robust layered Control System For A Mobile Robot,
Rodney A. Brooks, 1986 |
|
|