cwiid Nunchuck auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
xam090
User
Beiträge: 8
Registriert: Samstag 2. März 2013, 19:06

Hallo.
Ich versuche gerade mit dem Modul cwiid das Wii Nunchuk auszulesen. Wenn ich mir alle Daten anzeigen lasse bekomme ich folgendes zurück:

Code: Alles auswählen

{'led': 0, 'rpt_mode': 18, 'ext_type': 1, 'buttons': 0, 'rumble': 0, 'error': 0, 'nunchuk': {'acc': (254, 128, 128), 'buttons': 1, 'stick': (0, 0)}, 'battery': 112}
Aber da ich nur die Daten vom Joystick auf dem Nunchuk haben will habe ich es schon mit:

Code: Alles auswählen

print(wii.state['nunchuk']) 
versucht. Da kommt aber folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "nunchuk.py", line 27, in <module>
    print(wii.state['nunchuk'])
KeyError: 'nunchuk'
Kennt sich irgendjemand mit dem Modul cwiid aus?

:K MVG xam090
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo xam090, willkommen im Forum,

Führe mal ein

Code: Alles auswählen

print(wii.state)
aus

Wenn da ein Key namens 'nunchuk' dargestellt wird, solltest du auch darauf zugrefen können.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
xam090
User
Beiträge: 8
Registriert: Samstag 2. März 2013, 19:06

Hallo und Danke.

Wenn ich

Code: Alles auswählen

print(wii.state)
ausführe bekomme ich folgendes zurück:

Code: Alles auswählen

{'led': 0, 'rpt_mode': 18, 'ext_type': 1, 'buttons': 0, 'rumble': 0, 'error': 0, 'nunchuk': {'acc': (254, 128, 128), 'buttons': 1, 'stick': (0, 0)}, 'battery': 112}
Das ist mein aktueller Quellcode:

Code: Alles auswählen

import cwiid
import time
 
print 'Press 1 + 2 on your Wii Remote now ...'
time.sleep(1)
 
# Connect to the Wii Remote. If it times out
# then quit.
try:
	wii=cwiid.Wiimote()
except RuntimeError:
	print "Error opening wiimote connection"
	quit()
 
print 'Wii Remote connected...\n'
print 'Press PLUS and MINUS together to disconnect and quit.\n'
 
wii.rpt_mode = cwiid.RPT_NUNCHUK | cwiid.RPT_BTN
 
while True:
	if (wii.state['buttons'] - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0):
		print '\nClosing connection ...'
    		wii.rumble = 1
    		time.sleep(1)
    		wii.rumble = 0
    		exit(wii)
	print(wii.state)
	time.sleep(1)
BlackJack

@xam090: Laut Ausgabe gibt es den Schlüssel 'nunchuk'. Allerdings wird im Quelltext nirgends auf diesen Schlüssel zugegriffen, das heisst selbst wenn es ihn nicht gäbe, könnte kein `KeyError` deswegen kommen.

Ist `wii.state` ein normales `dict`-Objekt oder hat das einen anderen Typ?

Abgesehen von eigentlichen Problem: Du solltest weder `quit()` noch `exit()` verwenden, sondern `sys.exit()`. Die beiden anderen Funktionen sind nicht dokumentiert, also kann man sich auch nicht darauf verlassen, dass es sie gibt.

``print`` ist in der von Dir verwendeten Python-Version keine Funktion sondern eine Anweisung. Also sollte man es auch nicht so schreiben das es aussieht als wäre es eine Funktion. Die Klammern bei der ``if``-Bedingung sind ebenfalls überflüssig, beziehungsweise falsch gesetzt wenn es um die Verdeutlichung der Auswertungsreihenfolge geht. Ich hätte da auch eher auf Bitverknüpfungen statt auf Subtraktion gesetzt.
xam090
User
Beiträge: 8
Registriert: Samstag 2. März 2013, 19:06

Tschuldigung hab den falschen Quellcode hochgeladen.
Hier ist noch mal der aktuelle:

Code: Alles auswählen

import cwiid
import time
import sys
 
print 'Press 1 + 2 on your Wii Remote now ...'
time.sleep(1)
 
# Connect to the Wii Remote. If it times out
# then quit.
try:
	wii=cwiid.Wiimote()
except RuntimeError:
	print "Error opening wiimote connection"
	sys.exit()
 
print 'Wii Remote connected...\n'
print 'Press PLUS and MINUS together to disconnect and quit.\n'
 
wii.rpt_mode = cwiid.RPT_NUNCHUK | cwiid.RPT_BTN
 
while True:
	if wii.state['buttons'] - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0:
		print '\nClosing connection ...'
    		wii.rumble = 1
    		time.sleep(1)
    		wii.rumble = 0
    		sys.exit()
	print wii.state["nunchuk"]
	time.sleep(1)
Trotzdem erhalte ich noch immer folgende Fehler Meldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "nunchuk.py", line 28, in <module>
    print wii.state["nunchuk"]
KeyError: 'nunchuk'
Ich glaube schon das wii.state ein normales Dictonary ist.

MVG xam090
BlackJack

@xam090: Ersetze den Glauben durch Wissen — mit der `type()`-Funktion. Am besten änderst Du die Ausgabe von ``print wii.state["nunchuk"]`` zu

Code: Alles auswählen

    state = wii.state
    print type(state)
    print state
    print state['nunchuk']
und schaust mal was da vor dem Stacktrace an Ausgaben stehen.
xam090
User
Beiträge: 8
Registriert: Samstag 2. März 2013, 19:06

Es kommt noch immer eine Fehler Meldung:

Code: Alles auswählen

<type 'dict'>
{'led': 0, 'rpt_mode': 18, 'ext_type': 0, 'buttons': 0, 'rumble': 0, 'error': 0, 'battery': 112}
Traceback (most recent call last):
  File "nunchuk.py", line 25, in <module>
    print (type(state["nunchuk"]))
KeyError: 'nunchuk'
BlackJack

@xam090: Was ja auch nicht weiter verwunderlich ist wenn man sich die Ausgabe des Wörterbuchs darüber anschaut: Der Schlüssel ist ja ganz offentlich nicht enthalten. Also was hast Du anders gemacht als der in der Ausgabe noch enthalten war?
xam090
User
Beiträge: 8
Registriert: Samstag 2. März 2013, 19:06

Danke.
Ich habe eine Website gefunden wo der Fehler erklärt wurde.
Ich poste gleich nochmal den gesamten Quelltext. :idea:
http://wiki.python.org/moin/KeyError
xam090
User
Beiträge: 8
Registriert: Samstag 2. März 2013, 19:06

Hier ist der fertige Quellcode:

Code: Alles auswählen

import cwiid
import time
import sys
 
print 'Press 1 + 2 on your Wii Remote now ...'
time.sleep(1)
 
# Connect to the Wii Remote. If it times out
# then quit.
try:
	wii=cwiid.Wiimote()
except RuntimeError:
	print "Error opening wiimote connection"
	sys.exit()
 
print 'Wii Remote connected...\n'
print 'Press PLUS and MINUS together to disconnect and quit.\n'
 
wii.rpt_mode = cwiid.RPT_NUNCHUK | cwiid.RPT_BTN
 
while True:
	time.sleep(1)
	if wii.state['buttons'] - cwiid.BTN_PLUS - cwiid.BTN_MINUS == 0:
		print '\nClosing connection ...'
    		wii.rumble = 1
    		time.sleep(1)
    		wii.rumble = 0
    		sys.exit()
	nunchuk = wii.state.get("nunchuk")
	acc = nunchuk.get("acc")#
	print(acc[1], acc[2])
BlackJack

@xam090: Den `KeyError` hätte man auch in der Python-Dokumentation nachschlagen können.

Beim neuen Quelltext wirst Du einfach nur einen anderen Fehler bekommen, nämlich einen `AttributeError` weil `None` keine `get()`-Methode hat.
Antworten