Labboek
Mens Erger Je Niet
Het labboek van Bruno Jakic en Karel Jolij
Gebruikte Software en Hardware
We hebben de volgende software gebruikt:
-
Besturingssystemen:
- Windows XP
- Linux Fedora Core 3
-
Programmeertalen:
- Python 2.3.4
- Delphi 7
- C (gcc compiler)
-
Overige software:
- Delphi component: TScap32 versie 3.1. Copyright Thomas Stuffe
- MS Paint
- Vim 6.3.86
- TELSimpleSFTP
-
Hardware:
- UMIRTX robotarm
- Verschillende computers
De code van ons project staat hier:
Python code
Deze heeft de volgende twee bestanden nodig:
Delphi code in een zip bestand, heeft Delphi 7 nodig om te compilen
Browse de delphi source code
Dag 1:
26-juni-2006
maandag
Het onderwerp is goedgekeurd.
We gaan een robotarm mens erger je niet (MEJN) laten spelen. Er zijn twee componenten:
- Een webcam die de dobbelsteen worp kan detecteren
- Een padplanning algoritme die de robotarm aanstuurt de pionnen te bewegen volgens de input van de webcam
Activiteiten
We hebben vandaag de volgende activiteiten afgerond:
-
Bruno: met Delphi een webcam analyse programma geschreven die de dobbelsteen gaat analyseren.
Dit houdt de volgende taken in:
- Een gooibakje gemaakt voor de dobbelsteen.
Het gooibakje is gemaakt van karton en is wit van kleur (zie foto).
Het bestaat uit een dubbele kartonbodem die ontworpen is om een amortiserende
werking te hebben op de dobbelsteen in het bakje als het bakje met de dobbelsteen
valt. Door de amortisatie schiet de dobbelsteen omhoog, en verkrijgt zo een
andere waarde (zie schets).
In het bakje gebruiken we een zwarte dobbelsteen om een contrast te kunnen vormen
met het bakje zelf.
- De webcam geconfigureerd en de juiste hoogte bepaald.
- De software kan nu de omlijning van de dobbelsteen zien. Dit wordt naar een grid omgezet.
Om de omlijning te kunnen zien worden een aantal bewerkingen losgelaten
op het beeld genomen met de webcam. Ten eerste wordt het beeld monochroom gemaakt
waarbij de contrast als het uitgangspunt van de monochromisatie wordt genomen.
(Voor meer info, zie de Delphi code)
Daarna wordt bepaald of de achtergrond (meer dan 33% van de pixels) zwart of wit
is in het monochrome beeld. Als de achtergrond zwart is, maken we alle aan de randen
aangrenzende zwarte vlakken wit. We houden een beeld over met daarin de dobbelsteen
en een hoop "ruis".
Om de ruis weg te filteren maken we gebruik van een filterfunctie, die alle vlakjes
kleiner dan 4x4 pixels uit het beeld wegfiltert. Nu is alleen de zwarte dobbelsteen
over in het witte vlak.
Om nu de randen te vinden van de dobbelsteen kijken we naar de eerst voorkomende
pixel van links, rechts, boven en onder. Hier nemen we de xy coordinaten van in
het beeld en slaan we ze op. Voor het gemak worden ze ook in het beeld getekend.
Gezien de dobbelsteen vrijwel nooit mooi recht staat, zal een translatie nodig
zijn van de dobbelsteen naar het herkennigsvlak om de dobbelsteen daar RECHT op
te krijgen.
-
Karel: met Python de Java code van vorige week herschreven naar MEJN versie.
Dit houdt de volgende taken in:
- Nagaan wat de class bestanden doen, en welke methodes en variabelen nodig zijn voor MEJN.
- Iedere klasse omgeschreven naar Python.
- Er was een moeilijke klasse, daar is Olaf voor source code gevraagd ("Class RobotJoints")
- De klassen die we vorige weken geschreven hebben, "PP.java", "IK.java" omzetten naar Python
Commentaar:
Vandaag heb ik nog niks kunnen testen. Het schrijven van de Python bestanden gaat erg goed, en de werking van de programma's van vorige week is mij weer iets duidelijker geworden.
Ik had het gevoel dat behoorlijk wat dingen achterwege gelaten kunnen worden, mede omdat MEJN een simpeler spel is, maar ook omdat ik bepaalde dingen handiger heb kunnen doen in Python.
Een voorbeeld hiervan is het Python built-in Dictionary type. Dit is een lijst waarin je een key:value paar hebt en zo kan aanroepen. Op deze manier heb ik de pionnen opgeslagen. Dit liet toe om veel efficienter te coden met veel functies waar data gevraagd werd (deze zijn vaak maar 4 tot 10 regels).
Een hindernis was de opstelling van het bord.
Laat het duidelijk zijn van een foto of het bord zelf hoe het is ingedeeld. Er zijn daarom 4 functies die conversies uitvoeren, van locatie naar x-y coordinaten en hetzelfde die Cartesians returned.
Het plan voor morgen
Morgen gaan we verder met het schrijven van code. Bruno gaat een lerend systeem op zijn webcam software toepassen zodat het het aantal ogen kan lezen. En Karel gaat de Python software afmaken zodat het in staat is de robotarm aan te sturen met een joints.txt bestand.
Dag 2:
27-juni-2006
dinsdag
Vandaag hebben we verder gewerkt aan de herkenningssoftware en de MEJN klassen.
Activiteiten
-
Bruno is nu bijna klaar met de webcam software.
Hij heeft de volgende dingen vandaag afgerond:
- Filters
De filters bleken een aanpassing nodig te hebben, gezien ze eerst of veel
te passief of veel te aggressief waren. Een ander geconstateerd probleem
is het gebrekkig werken van de normalisatie functie tijdens het monochromiseren
van het beeld; soms komt er door lichtomstandigheden te veel ruis, en soms wordt
er te veel weggefilters door veranderde lichtomstandigheden. Een adaptieve
normalisatiefunctie zal nodig zijn.
- Gridding
De functie om het beeld binnen de EDGES in het brondbeeld te vertalen naar
het herkennigsvlak is gevonden en geschreven. Voor meer toelichting zie de
Delphi code, gezien het niet om een wiskundige maar programmeerkundige
oplossing gaat.
- Herkenning
Er is een leerfunctie gemaakt die de op het moment gerepresenteerde herkennings-
vlak vergelijkt met alle opgeslagen herkenningsvlakken waarnaan een dobbelsteen-
waarde is toegekend.
Als de waarde niet in gelijke mate overeenkomt, zal het systeem
vragen om de waarde te classificeren en deze opslaan voor latere referentie, anders
geeft het systeem de waarde toegekend aan het vergelijkbare opgeslagen herkenningsvlak.
-
Karel is nu bijna klaar met de standaard MEJN klassen.
Hij heeft de volgende dingen vandaag afgerond:
- Argument-passing
- Het bord lezen en schrijven
- Een pion laten bewegen
- Debuggen
Commentaar
Vandaag kwam ik toe aan het debuggen van de IK en PP modules die nog erg veel werk nodig hadden. Mijn eerste poging van het pad plannen was een depth first, dat leidde niet tot een gewenst resultaat. Dit heb ik morgen pas verbeterd.
Ook ging veel tijd zitten in het verbeteren van de andere klassen, daar zaten of een paar syntax of semantische fouten in.
Op het eind van de dag had ik ook code gemaakt die argumenten leest en daar kon de code ook mee werken waardoor je stukken kon verplaatsen over het bord.
De zet werd dan ook weer geschreven naar een board.txt. Ook de joints en positions.txt werden gemaakt, maar de informatie erin klopte nog niet.
Het plan voor morgen
Geen van ons beiden is helemaal klaar met het werk. De webcam software heeft nog een klein probleem met filters en lichtsterkte en de MEJN software maakt nog geen goede robotarm configuraties.
Dit maken wij morgen in orde en dan kunnen we daarna proberen de twee componenten samen te laten werken.
Dag 3:
28-juni-2006
woensdag
Het meeste werk is nu al weer gedaan. We hebben vandaag veel afgekregen en we zijn aan wat nieuwe dingen begonnen.
Activiteiten
We zijn vandaag nog niet aan samenwerken toegekomen, we zijn elk erg druk geweest met ons eigen werk.
-
Bruno heeft de volgende dingen gedaan aan zijn webcam software:
- Betere detectie
Door de functie voor de normalisatie van het beeld tijdens het monochromiseren
aan te passen en afhankelijk te maken van de gemeten lichtwaarden i.c.m. een aantal
gecalibreerde correctiefactoren die te maken hebben met wat de webcam zelf doet is
het gelukt om een monochromisatiefunctie te maken die het vrijwel altijd goed doet.
Hierdoor is de volledige detectiemethode een stuk beter geworden.
- Een beter bakje
Een ander, bijna onoverkomelijk probleem gezien de slechte kwaliteit van het beeld
van de webcam, is de situatie warbij de dobbelsteen in de hoeken van het doosje
belandt. Om dit op te lossen, en tegelijkertijd de dobbelsteen beter laten rollen,
zijn de binnenste hoeken van de dobbelsteen afgerond door er extra papier in te plaatsen.
-
Karel heeft de robot besturing nu zo goed als af. De pionnen kunnen nu over het bord worden bewogen waarbij er tekst voor de robotarm wordt geschreven.
Zonder MEJN bord is deze tekst nog niet helemaal nauwkeurig want het gaat om de afmetingen van het bord, hopelijk is dit het enige dat resteert en zijn er geen semantische bugs.
Het werk heeft het volgende ingehouden:
- Debuggen van alle code
- Het pad plannen verbeteren naar breadth-first
- Een kleine heuristiek toegevoegd aan het pad plannen zodat het nodes die verder wegstaan weghaald
- Proberen zoveel mogelijk te testen
Toen ik hier tevreden over was ben ik begonnen aan de AI. Deze doet nu dit:
- Hij kijkt eerst of hij iets vets kan doen. Zoals:
- Een pion naar het laatst vrije vakje sturen
- Een vijandelijke pion slaan
- In een van de laatste vier vakjes komen (waar hij veilig is)
- Daarna gaat hij wat checks runnen om te zien wat hij anders kan doen. Zoals:
- Met een 6 een pion uit zijn huis zetten, als die er nog zijn
- Vooral dit doen als er een vijand bij de deur staat
- Nog wat dingen die ik morgen ga toevoegen
- En hij kijkt of de zet wel uberhaubt mogelijk is
Commentaar
Vandaag was een goede dag, want het werk van de vorige twee dagen is nu af. Vooral ben ik tevreden over het pad plannen, dat nu breadth-first is. Dit nam veel tijd in beslag omdat ik niet helemaal gewend was met zoekalgoritmes. Ik heb het probleem opgelost met veel te onderzoeken punten te verwijderen (2 van de 4 vallen af omdat ze niet in richting zijn) en veel informatie te printen.
In Python ging dit heel goed, omdat ik veel vrijheid had in wat ik met de variabelen kon doen (makkelijk appenden, slices nemen). Het laatste probleem tackelde ik toen ik doorhad dat bij het doorkijken van ongeldige bewegingen er niet genoeg verwijdert werd omdat de lijst waardoorheen gescanned werd kleiner werd met het uitkammen. Dit was dus met een slice van de lijst opgelost, sindsdien heb ik geen klachten meer gehad van het zoekalgoritme.
Ik ben dus erg blij dat ik dit met Python heb gedaan, en niet met Java.
Toen ik dus klaar was met dit werk ben ik begonnen aan de AI. Dit werd een soort Advice Language 0. Eerst onderzoekt het het bord en maakt veel booleans aan en wat counts. Bijvoorbeeld vraagt hij zich af: hoeveel pionnen heb ik nog thuis, hoeveel pionnen zijn er al in het doel, kan ik met deze rol het doel bereiken, kan ik een andere pion slaan met deze rol? etc
Daarna gaat hij per rol (want als je 6 hebt gegooid dan moet je nog eens rollen) na wat de beste zet is die hij kan doen (met prioriteiten (bv de goal halen heeft de hoogste prioriteit)
Ik kon de code niet uittesten aan het eind van de dag.
Het plan voor morgen
Morgen gaan we proberen de software te testen. Waarschijnlijk wordt komt dit pas aan het eind van de dag. Bruno rond al zijn werk af aan de webcam software, en Karel gaat de laatste paar dingen debuggen in de bord klassen (indien nodig) en de AI verbeteren. We moeten natuurlijk ook een echt MEJN bord maken met pionnen.
Dag 4:
29-juni-2006
donderdag
Vandaag hebben we al onze individuele taken afgerond. In de middag zijn we begonnen aan de integratie van de twee software componenten.
Activiteiten
- Bruno heeft gewerkt aan SFTP waarmee de joints.txt gekopieerd kan worden naar de computer die de robotarm aandrijft. Hij heeft ook een verbetering aangebracht aan de webcam:
- Automatisering
Het dobbelsteenherkenningsprogramma is nu in staat om automatisch de Python
scripts die de gameplay bepalen aan te spreken, en de resultaten ervan te uploaden
op de server via SFTP om de robotarm aan te sturen. Alles is nu dus met een klik op
te lossen.
- Training
Het systeem is een aantal uur getrained om de dobbelsteen vanuit verschillende
hoeken te leren kennen. Dit kan worden teruggebracht door een betere edge-detectie
methode te maken, die bijvoorbeeld in plaats van de eerste pixel van elke kant
het volgende doet:
Eerst wordt de dobbelsteen gevonden, net zoals nu. Dan begint het algoritme langs
de rand te "lopen", en eens beland bij het einde, berekent het het gemiddelde verschil
tussen de xy coordinaten van opeenvolgend bezochte punten: de "tendens".
Vanuit het gevonden midden van de zijde waarop gelopen is wordt dan omhoog en omlaag
het "tendens" geextrapoleerd. Dit wordt voor elke zijde gedaan. De punten waarin de
verschillende zijden dan samenkomen zijn de perfecte selectiepunten, en doordat deze
vrijwel altijd hetzelfde hoek van de dobbelsteen laten projecteren op het herkennings-
grid, kan het leerproces een STUK korter zijn en minder samples behoeven.
- SFTP
Voor de SFTP functie is het demo-component voor Delphi van ElDos, TElSimpleSFTP,
gebruikt. Dit kan worden gedownload op: eldos website
-
Karel heeft de AI afgemaakt en alle bugs verwijdert.
Commentaar
Het werk vandaag bestond uit playtesten en daarna debuggen. Ik kon nog een paar verbeteringen aanbrengen aan de AI.
Ik begon met standaard situaties en die werkend te krijgen, dit had al veel debuggen nodig.
Daarna ben ik exteme situaties gaan testen, zoals finishen, 6 gooien, en dergelijke. Hiervoor moest ik een paar dingen herschrijven in de AI code.
Er rest nu alleen nog het uittesten van de coordinaten op een echt MEJN bord, dat we zelf nog gaan maken.
Het plan voor morgen
Morgen gaan we een MEJN bord zelf maken en uittesten of de gripperpositions kloppen.
Als dit zo is, dan moet een volledig MEJN spelletje te spelen zijn. Inclusief een menselijke speler die zelf kan gooien en zetten.
Dag 5:
30-juni-2006
vrijdag
Vandaag doen we nog een paar kleine dingen om ons voor te bereiden op de presentatie.
Activiteiten
-
Bruno heeft aan de C code gewerkt:
Naast het afmaken van de administratieve bezigheden is nog een C programma aangepast,
oorspronkelijk gemaakt door Gijs Kruitbosch, die automatisch de (meerdere) commandos
van de server kan lezen en doorgeven aan de robotarm. Het hele proces is nu werkelijk
in een klik geintegreerd.
De C Code
-
Karel heeft een MEJN bord getekend en het logboek geupdate