WiiRemote

Allgemeine Funktion der WiiRemote

Bei der Nintendo WiiRemote handelt es sich um einen handelsüblichen Controller einer Spielkonsole, jedoch hat dieser erstaunliche viele Sensoren und eine leicht anzusprechendes Interface, da sämtliche Kommunikation über Bluetooth verläuft.

Der Controller selbst verfügt über drei Beschleunigungssensoren (siehe Abbildung) sowie einer Infrarot Kamera. Diese Kamera ermöglicht mit Hilfe von Referenzpunkten die Ausrichtung des Controllers. Im Normalfall wird dieses genutzt um einen Cursor für die Spielkonsole zu ermitteln. Dabei wird die sog. Sensorbar1 an den Fernseher angebracht und die WiiRemote auf diesen gerichtet. Die WiiRemote erkennt durch die Infrarot Kamera die Punkte und interpretiert daraus direkt XY Koordinaten.
Jeder gefunden Punkt wird dann mit XY und Größe übertragen. Aus diesen Punkten wird dann die jeweilige Cursorposition errechnet. Dabei muss beachtet werden, dass es sich grundsätzlich um eine Kamera handelt, welche die IR- Lichter so überträgt, wie sie diese erhält. Wenn der Controller nach unten rechts bewegt wird, bewegen sich die Referenzpunkte nach oben Links. Gewünscht ist jedoch meistens der Invertierte Fall.

Das entspricht dem Standardaufbau, Sensorbar am Fernseher und WiiRemote in der Hand des Nutzers.

WiiRemote Abused

Für unseren Aufbau haben wir nach dem Konzept von Johnny Lee den normalen Aufbau verworfen und diesen umgedreht.
Die WiiRemote wird nun am Fernseher aufgebaut und Richtung Nutzer ausgerichtet. Der jeweilige Anwender bringt die Sensorbar bzw. die IR-LEDs in der Nähe seiner Augen an. Durch diese Konstellation erhalten wir die Möglichkeit, jeweils die Augen des Nutzers zu lokalisieren und die Abbildung an deren Position anzupassen.
Da wir aus dem System jeweils nur X und Y Koordinaten bekommen, müssten die Z Koordinaten selbst errechnet werden. Es muss dabei jeweils von einer Näherung die Rede sein, da:
die Auflösung der Infrarot Kamera auf 1024 x 768 beschränkt ist. Dieser Effekt steigert sich, je höher der Abstand der WiiRemote von der Sensorbar ist. Dieses Sichtfeld ist desweiteren stark eingeschränkt. Die WiiRemote kann nur ca. 41° in ihrem FoV (Field of View) aufnehmen.
der übertragene Wert rein aus der Nachkommastelle errechnet wird.
der Winkel der Sensorbar zur WiiRemote nicht exakt gleichbleibend bzw. 90° beträgt.
für eine exakte Aufstellung Abbildungsgröße sowie die genaue Distanz der LEDs benötigt würde.
öfters ein Verlust von Infrarot (IR) Lichtern passiert.
Wir errechnen unsere Z Distanz also mit der Annahme einer idealen Ausrichtung der WiiRemote und der Sensorbar

    z = Math.sqrt(dx * dx + dy * dy);

Diese Gleichung (Pythagoras) ergibt jeweils immer den genauen Abstand der LEDs voneinander. Da wir wissen, dass die originale Sensorbar von Nintendo 20cm Abstand für die LEDs vorgesehen hat, könnten wir durch einen simplen Dreisatz auf die originale Distanz schließen.

    Z = 20/z;

dabei sind dx jeweils die Differenzen der beiden X Punkte und dy dementsprechend der Y Punkte.
Problematisch ist jedoch, dass die WiiRemote nicht durchgehend Kontakt zu allen IR Lichtern bekommt, weshalb wir eine Art „Caching“ für die IR Lichter eingeführt haben. Beim Aktualisieren wird nach den jeweils ‚nächstliegenden‘ Punkten geschaut und diese werden dann mit Hilfe der neuen Daten aktualisiert. Dabei gibt es noch mehrere Ansätze um die Vibrationen zu minimieren. Wir lassen z. B. minimal Abweichungen nicht mit aufnehmen, um etwas Stabilität in die Darstellung zu bekommen. Die Mittelwertbildung übernimmt die Klasse Smooth (pluginWii.core.Smooth), welche für jeden Punkt jeweils einmal instanziiert wird. Die Klasse IRLightManager (pluginWii.core.IRLightManager) sorgt für die Verwaltung der IR- Lichter. Sollte es jeweils Aktualisierungen geben, so sorgt diese für deren Abarbeitung. Gleiches gilt für das Verschieben, wenn ein Objekt nicht gefunden wurde.

Aufbau