vrijdag 25 juni 2010

Dag 5: Epic Fail!

Na vier dagen van de ochtendgloren tot aan schemering in Euclides onszelf achter eigenwijze lappen code (die dus heel moeilijk hun wil overgaven aan de onze) uitgeput te hebben, zijn we aangekomen op de dag der demonstratie. Ondanks alle moeite hebben we niet alles tot een geheel kunnen integreren, waardoor we de demonstratie in twee delen lieten zien. Allereerst het fantastisch inschenken van zwarte bessen limonade;




De problemen waar we tegen aan liepen in de eerste poging waren dus zoals gezien kan worden, de gladheid van het flesje. Dat snel opgelost te hebben ( en alles weer gedroogd te hebben!), op naar de tweede poging.




Tevergeefs! De robotarm valt stil net op het moment dat de spanning zijn climax bereikt en iedereen in verbijstering het moment van schenken afwacht...

....

donderdag 24 juni 2010

Dag 4: 24 juni 2010

Het is nog steeds zo dat het gedeelte computer vision en het aansturen van de UMI RTX los van elkaar zijn. Voor het gedeelte vision is er in de reeks bewerkingen van de foto een nieuwe filter en algoritme toegevoegd. De filter zorgt ervoor dat het resultaat niet in zwart-wit maar in zwart-rood wordt getoond en het algoritme vindt het oppervlak van de vloeistof door te kijken naar een rode pixel met een reeks rode pixels daaronder.




Later zagen we in dat wat we tot nu toe hebben echter niet volledig zou functioneren; Op het moment dat er vloeistof ingeschonken wordt en ondertussen foto's worden genomen zal het zo zijn dat het algoritme allereerst de stroom vloeistof zal vinden i.p.v. het oppervlak van de vloeistof in de beker. Dit was niet geanticipeerd, echter is er wel al een mogelijk oplossing voor bedacht; Een extra constraint stellen dat een kandidaat pixel én een reeks rode pixels onder zich zou moeten hebben én een reeks pixels links en rechts van zich. Hierbij is van belang dat de som van rode pixels in de horizontale as groter is dan de breedte van de onderkant van de beker.

Verder hebben we, zoals vermeld in ons vorige logboek, een geel stripje geplakt aan de bovenrand van de beker. Alleen zijn we nog niet toe gekomen aan het schrijven van een algoritme waarbij de hoogte van het stripje wordt bepaald.







Vandaag is Na een tweetal test ronden de code voor het aansturen van de robot afgerond. Na de eerste ronde kwamen we een viertal punten tegen:
  • De roll draaide de verkeerde kant op
  • Het uiteinde van de fles lager dan de hoogte van de beker
  • De beker was op een te dichtbije positie, waar de camera niet een totaal zicht heeft
  • De roll gaat maar tot -132 graden
  • Locatie van beker is onduidelijk
Al deze punten hebben we op een logische wijze opgelost, waarbij er voor de locatie van de beker als oplossing is genomen om de locatie door de robot aan te laten geven. Intussen hebben we tot de 2e test ervoor gezorgd dat er een commando playall beschikbaar werd, waarbij alle joint configuraties achterelkaar worden uitgevoerd en dusdanig één vloeiende beweging maakt tijdens het inschenken. Test twee ging aardig goed:


woensdag 23 juni 2010

Dag 3: 23 juni 2010

Qua computer vision zijn we op het moment zover dat we met een regel in de terminal een foto maken, de gemaakt foto knippen ( zodanig dat we alleen een plaatje hebben van de beker ) en daarop de filter toepassen. Hieronder is dus vanuit het plaatje van de vorige post geknipt gefilterd. Waar nog aan gewerkt wordt is het bepalen van de hoeveel vloeistof in de beker aan de hand van het gefilterde plaatje. Op dit punt zijn we tegen een nieuw probleem aangelopen, namelijk dat het nogal moeilijk is om te bepalen welk percentage van de beker gevuld is. Dit komt doordat we geen vaste positie kunnen nemen voor de webcam (simpelweg te veel moeite). Om dit op te lossen denken wij een geel stripje te plakken aan de bovenrand van de beker. Tot zover computer vision.




We hebben inmiddels een volledig geraamte van alle programma's met hier en daar wat schoonheidsfoutjes: er wordt nog gedacht aan de connectie tussen computer vision en de bewegingen van de robot arm, en het probleem dat het inschenken een continue proces is en de UMI RTX robotarm stap voor stap bestuurd wordt door de umirtxsimulator.

Wat er voor morgen overblijft is dus (1) het berekenen van de hoeveelheid vloeistof in de beker en (2) het koppelen van alle programma's en tot slot (3) het testen.


Dag 2: 22 juni 2010

Om computer vision simpel te houden in het kader van ons probleem, hebben we gekozen voor rode limonade. De filter is ondertussen ook af en geeft als resultaat alle pixels waarvan de rood waarde hoger is dan de groen waarde en blauw waarde uit het RGB model. De vloeistof wordt wit weergegeven, en al het andere zwart.


Met een simpel algoritme kunnen we nu de hoogte van het vloeistof bepalen, namelijk door te kijken naar de eerste witte pixel die 10 (of meer) witte pixels eronder heeft. Tot zover de computer vision.
Voor het inschenken hebben we de methode aangepast, door in 1 keer te draaien naar een hoek van 80/85/90 graden, en dan stapsgewijs verder tot aan 180 graden. Daarbij kijken we continu of de beker vol raakt, en in zo'n geval draaien we het flesje terug.

We hebben besloten om de robot-arm vanuit het IK programma aan te sturen, zodat we toegang hebben tot de roll. Het voordeel van het draaien van de fles over de roll boven het draaien over de pitch is dat de grijper het gewicht van de vloeistof in de fles ondersteunt. Als je draait over de pitch is de kans groter dat de fles uit de grijper valt.

Verder hebben we besloten om het ons eerst zo makkelijk mogelijk te maken door de beker, de fles en webcam op een vaste positie te plaatsen. Het is echter moeilijk om om de webcam altijd op dezelfde positie te plaatsen. Misschien moeten we ook de hoogte van de beker bepalen, zodat we met meer zekerheid kunnen bepalen of de beker vol is.

( Per 17.00 hebben we een werkende webcam! )

Dag 1: 21 juni 2010

We hebben een java implementatie van het cannyEdgeDetection algoritme gevonden en deze met succes kunnen toepassen op foto's van het internet.






We hebben nog geen webcam die op de systemen van de uva werkt, mogelijk door driver support. Op onze eigen laptop hebben we met de webcam een aantal foto's genomen, en vervolgens door de cannyEdgeDetection filter gehaald. Hierbij hebben het flesje gebruikt dat we ook zullen gebruiken tijdens de presentaties. De resultaten waren niet voldoende, dus is er geprobeerd om een betere filter te vinden.



Dusdanig zijn we gestart aan het schrijven van een nieuwe filter, zodanig dat de relevante data uit de plaatjes naar voren worden gehaald, en daarbij de berekening van het volume van de beker mogelijk wordt gemaakt. Inmiddels wordt er gekeken naar applicaties als cheese en gimp, naar de functionaliteiten, gebruik via de terminal en source code. Tot zover was het gedeelte over computer vision.

Daarnaast is er ook gedacht over het inschenk probleem, waarvoor er uiteindelijk twee manieren zijn bedacht voor de oplossing;
(1) De focus ligt op de fles; door te kijken wat het volume van de fles is wordt bepaald over welke hoek de fles moet draaien, waarbij dus niet gekeken wordt of de beker vol is of niet.

(2) De focus ligt op de beker; door te kijken naar de beker bepalen we wanneer het inschenken stoppen moet, waarbij dus niet gekeken wordt naar de fles.

Gezien het feit dat wij mensen ook naar de beker kijken tijdens het inschenken, hebben we besloten om het 2e idee uit te werken.

Technische problemen:
  • We hebben geen werkende webcam ( wel een ingebouwde van een laptop )
  • Geen toegang tot gemaakte foto's ( we weten niet hoe )
  • De bestaande gripperPosition bevat in zijn parameters geen informatie over de roll, welke dus wel relevant is voor het inschenken.