Telefon als Nummernfeld

Während der letzten Weihnachtsferien habe ich durch diesen Kommentar auf hackaday.com inspiriert ein altes Telefon (PTT Typ T65 de Luxe Smaragt von Ericsson von einem Niederländischen Flohmarkt, das Modell entspricht ungefähr einem FeTap 611) mit meinem Arduino verdrahtet und ein kleines Sketch geschrieben um die Impulse zu zählen, die von der Wählscheibe beim Wählen kommen.

Telefon an einem Arduino

Die Schaltung gestaltet sich denkbar einfach; die Wählscheibe verhält sich nicht anders als ein Schalter, der ein und aus geht. SerialServer von Dan O’Sullivan und ein kleines Java Programm, das sich mit dem Server verbindet um den Tastendruck zu simulieren machen das Telefon zu einem (fast) vollständigen Nummernfeld, das unabhängig von der aktuellen Anwendung mit der es genutzt werden soll funktioniert (AAC Keys hätte es auch getan, läuft aber nicht auf Linux soweit ich weiß).

Natürlich wäre es noch besser gewesen eine USB-Tastatur zu simulieren, aber dann währe warscheinlich ein USB-Shield für mein Arduino notwendig gewesen und das wäre mir zu viel Aufwand.

Hier eine kurze Demonstration:

Advertisements

Pixel Clustering

Im Moment studiere ich mit meiner Schulklasse ein Theaterstück ein (,,Wie es euch gefällt“ von William Shakespeare), so dass ich während den Szenen, in denen ich nicht mitspiele viel Wartezeit habe, während der ich nichts zu tun habe. So kam ich zu folgendem Gedankenexperiment, dass ich noch am selben Tag in die Tat umgesetzt habe.

Ich habe mich gefragt, was wohl passiert, wenn man jeden Pixel eines Bildes als Punkt in einem fünfdimensionalen Raum ansieht. Dabei sind die ersten beiden Koordinaten die x- und y Koordinaten des Pixels im Bild selber und die letzten drei Koordinaten ergeben sich aus den RGB-Werten des Pixels. Ein Pixel an der Stelle x=7 und y = 23 mit der Farbe R=55, G=88, B = 180 hat ist also ein Punkt im fünfdimensionalen Raum: P(7|23|55|88|180).

Wenn man dann alle Pixel eines Bildes in Punkte umwandelt erhält man also Punktwolken im fünfdimensionalen Raum, die man mit einem einfachen Clusteringverfahren zusammenfassen kann. Wenn man das tut und die so als ,,zusammenhängend“ erkannten Pixel gleichfarbig einfärbt, so dachte ich mir, müssten doch ganz nette Bilder entstehen.

Nach der Umsetzung bestätigte sich das auch:

Ich habe die Bilder direkt von meiner Webcam genommen, leider ist an ein in Echtzeit berechneter Effekt  nicht umsetzbar, da es sehr lange dauert, bis der Clustering-Algorithmus bei so vielen Bildern sehr lange zum terminieren braucht. Wer an dem Programm interessiert ist, kann gerne mit mir in Kontakt treten. Es ist in Java geschrieben und dadurch einigermaßen plattformunabhängig.

Motion Tracking

Die letzten Tage habe ich Captain Tomates Catchup Games – Folge 3 bei Ehrensenf gesehen und dabei einen Link gefunden, der mich sehr beeindruckt hat. Leider bin ich kein glücklicher Besitzer einer Wii wie Herr Jhony Chung Lee und habe mir deshalb gedacht, dass  meine iSight zwar nicht eine so hohe Auflösung hat wie die Infrarotkamrea der Wii Remote, aber trotzdem genauso im Stande ist Infrarotlicht zu sehen. Die hardwarebeschleunigte Trackingfunktion in der Wii Remote, so dachte ich mir, kann ja auch nicht schwer nachzuahmen sein.

Da die Programmiersprache, die mir am meisten liegt Java ist, und ich an einem Mac arbeite, auf dem die JMF leider nur eingeschränkt lauffähig ist, habe ich die alten Klassen von meinem TicTacToe Projekt im Rahmen meiner 12 Klassarbeit mit denen ich dieses Problem mit Hilfe von Quicktime für Java umgangen hatte wieder herausgekramt und auf meine JVM losgelassen. Nach einigen Fehlstarts hatte ich auch ein Bild mit ordentlicher Framerate.

Um nun Trackingpunkte zu extrahieren, habe jeweils alle Pixel des einkommenden Bildes untersucht und sie, wenn ihre Helligkeit einen bestimmten Schwellwert überschreitet, zu einer Liste hinzugefügt. Auf die Pixel in der Liste habe ich dann ein Clusteringverfahren (eine leicht angepasste und speedoptimierte Version von hirachical clustering) angewendet um die Pixel zu Trackpoints zusammen zu fassen. Anschließen habe ich noch die Anzahl der in die Liste aufgenommenen Pixel auf ein Fünftel reduziert, indem ich nur die Pixel aufgenommen habe, die nicht komplett von hellen Pixeln umgeben sind, um die Performance zu erhöhen. Es werden dann nur die Randpixel eines hellen Punktes aufgenommen. Die Genauigkeit leidet so gut wie garnicht darunter.

Die erfassten Koordinaten der hellen Stelle können dann für beliebige Zwecke genutzt werden. Zum Beispiel um ein kleines Zeichenprogramm daraus zu basteln.

Unter dunkleren Lichtverhältnissen (am besten Abends) funktioniert es sogar erstaunlich gut mit einer kleinen LED Taschenlampe.

In Planung ist jetzt einen IR-Filter vor die Kamera zu kleben und mit einem IR-Pen zu arbeiten. Dann gehts auch bei hellerem Licht (hoffentlich). Mehrere Trackpoints zu erkennen funktioniert auch schon, habe ich aber noch nicht angewendet, da ich noch nicht das Problem gelöst habe die Trackpoints in jedem Bild wieder zu erkennen und zuzuordnen, so dass mehrere Trackpoints nicht verwechselt werden.

Labyrinth Bots — technische Umsetzung

Nachdem ich meine Zielsetzung definiert hatte, habe ich mir Gedanken zur Umsetzung des Experimentes gemacht. Eine Simulation für neuronale Netze und ein Evolutionsframework habe ich bereits in Java geschrieben, deswegen habe ich mich entschieden auch dieses Projekt mit Hilfe von Java umzusetzen.

Um den Roboter in seiner physikalischen, dreidimensionalen Welt zu simulieren, habe ich mich für Simbad entschieden, da es die nötigen Tools wie Entfernungsmesser und Physikengine in einer 3D-Welt bereits bereitstellt und nebenbei noch recht schnell ist.

Um die Berechnungen der Fitness der Roboter zu beschleunigen habe ich außerdem noch ein kleines Client-Server System entwickelt, mit dem ich Rechenaufgaben auf andere Computer im Netzwerk auslagern kann.

Ausgestattet mit diesen neuen Werkzeugen konnte ich mit meinen Experimenten beginnen.