PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Maximale Delta-Richtungswerte einer Maus über USB



tuxologie
21.01.2014, 09:35
Hi @ all

Weiß jemand zufällig wie groß die maximalen Delta-Werte einer Maus über USB sind?

Meine Anwendung:
Ich lese die Maus in Linux aus und möchte mit den Delta-Richtungswerte die Position bestimmen. Diese Deltas sind im 2. und 3. Byte des Mausstreams. Wenn ich mir diese dezimal anzeigen lasse, bekomme ich nur Werte zwischen -127 und +127 heraus. Das Skript habe ich von diesem Thread (https://www.roboternetz.de/community/threads/40365-Optische-Maus-unter-Linux-abfragen). In den Kommentaren steht auch, dass Werte bei -255 und +255 überlaufen.

Was mache ich falsch?

Viele Grüße
tuxologie

sast
21.01.2014, 11:38
Die Werte machen genau das, was du von ihnen im Code verlangst.

char b[3];

Die Werte sind zwar ein Byte groß, werden aber in einem signed char gehalten.
Das heißt, dass beim Bit 7 nur das Vorzeichen unterschieden wird. Steht da eine 1 ist es negativ sonst positiv.
Damit bleiben nur jeweils Bit 0 bis 6 für die Werte und darin lassen sich nur 128 unterschiedliche Werte abbilden.
Es ist also gleichgültig, ob du dann diesen Wert in eine größere Variable speicherst.

Was ist jetzt daran so schlimm, dass du nur insgesamt 256 Werte je Richtung hast?

sast

tuxologie
21.01.2014, 12:10
Vielen Dank für deinen Beitrag! Was ich noch nicht verstehe ist das in dem Skript ein Wertebereich von -255 bis +255 angegeben wurde, bevor ein Überlauf angezeigt wird.

Nochmal zur Anwendung:
Ich möchte mit dieser Maus eine Positionsbestimmung durchführen. Die Maus bewegt sich und aus den Delta errechne ich die Gesamtstrecke. Wenn die Werte nur einen Bereich von -127 bis +127 haben ist die Messung bei schnellen Bewegungen der Maus ungenau. Es wird weniger Weg angezeigt, als die Maus eigentlich gefahren ist. Aus diesen Daten will ich ein Sensormodell der Maus erstellen. Damit sollen sich dann Simulationen ermöglichen.

Viele Grüße
tuxologie

sast
21.01.2014, 12:46
Soo, hab jetzt mal im Internet kurz nach den Daten der Mäuse gesucht und bin unter http://wiki.osdev.org/Mouse_Input fündig geworden.
Danach erhältst du tatsächlich ein volles Byte (8Bit == 256) als Bewegungsdaten. Das Vorzeichen steht in zwei extra Bits in Byte 0.
Wenn du die 256 als positive Werte haben willst, musst du nur das Auslesearray als unsigned char behandeln und die Bewegungsrichtung aus Byte 0 auslesen. Das steht zumindest so in diesem Wiki.
Probieren musst du es nun natürlich selbst.

sast

Habe gerade mal auf dem Raspi einen Test mit dem Code aus deiner Quelle gemacht. xvz und yvz sind die Vorzeichen Flags aus b[0]. 1 bedeutet negativ. Man erkennt, dass die negativen Zahlen im unsigned char als 255 abwärts dargestellt werden. Im Zweierkoplement ist 255(b1111 1111) == -1 und -128 wäre dann b1000 0000


lb=0 rm=0 mb=0 xvz=0 yvz=0 xo=0 yo=0 xd=0 yd=1
lb=0 rm=0 mb=0 xvz=0 yvz=0 xo=0 yo=0 xd=1 yd=1
lb=0 rm=0 mb=0 xvz=0 yvz=1 xo=0 yo=0 xd=0 yd=255
lb=0 rm=0 mb=0 xvz=0 yvz=1 xo=0 yo=0 xd=0 yd=254
lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=255 yd=253
lb=0 rm=0 mb=0 xvz=0 yvz=1 xo=0 yo=0 xd=0 yd=252
lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=255 yd=250
lb=0 rm=0 mb=0 xvz=0 yvz=1 xo=0 yo=0 xd=0 yd=252

Daraus folgt.
Wenn ich die Bytes 2 und 3 als signed behandle ist zu erkennen, dass tatsächlich nur +-127 ausgegeben wird. char ist auf dem Raspian anscheinend ein unsigned char.


lb=0 rm=0 mb=0 xvz=1 yvz=0 xo=0 yo=0 xd=-7 yd=0
lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=-6 yd=-2
lb=0 rm=0 mb=0 xvz=1 yvz=0 xo=0 yo=0 xd=-9 yd=0
lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=-11 yd=-1
lb=0 rm=0 mb=0 xvz=1 yvz=0 xo=0 yo=0 xd=-11 yd=0
lb=0 rm=0 mb=0 xvz=1 yvz=1 xo=0 yo=0 xd=-11 yd=-1

tuxologie
22.01.2014, 10:01
Vielen Dank sast! Ich habe es jetzt auch mal mit dem unsigned Char probiert. Ergebnis für Delta-X-Werte: bewegt man die Maus schnell nach links ist bei -129 Schluss, der Start war -256 macht wieder eine Differenz von 127! Wird die Maus schnell nach rechts bewegt geht sie ebenfalls nur bis 127... Bedeutet es, dass die Wertebereich unabhängig von dem Char-Array des Mausstreams ist und nur von -127 bis +127 geht.

Meine Messung würde dann ergeben, dass meine Lasermaus nur korrekte Deltas für für Geschindigkeit bis 0,4m/s erfassen kann. Bei höheren Geschwindigkeiten würde Strecke "verloren" gehen, da der Wertebereich limitiert ist. Meinst du meine Annahmen sind richtig?

Viele Grüße,
tuxologie

sast
22.01.2014, 12:33
Hattest du denn bei den schnellen Bewegungen auch einen Überlauf? Das würde dann die +-127 bestätigen. Ich hab meine Vermutungen jetzt nur aus dem Link den ich beim letzten Post angegeben habe und von meinen nächtlichen Tests.
Eventuell ist es auch eine Fehlinterpretation beim Datentyp. Hab lange nicht mehr in C auf einem Rechner programmiert. Obwohl mir jetzt auf die Schnelle auch nicht einfällt, was da falsch sein könnte.

Ich habs nicht hinbekommen, dass ein Überlauf angezeigt wurde.

sast

tuxologie
22.01.2014, 15:22
Hallo sast,

ich habe es bei mir auch probiert, ohne Erfolg es wird weder in x- noch in y-Richtung ein Überlauf angezeigt. Plattformen beider Tests waren X86 und ARM11. Die Limitierung bei schnellen Bewegung blieb bestehen. Kann das ein Fehler im Code sein? Ich versuche heute Abend ein Python-Programm, das auch auf die Maus zugreift und die Deltas ausgibt.

Viele Grüße
tuxologie

tuxologie
29.01.2014, 11:15
Hallo,

ich habe es nun mit dem Python-Programm (http://johnroach.info/2011/02/16/getting-raw-data-from-a-usb-mouse-in-linux-using-python/) versucht. Es wurde auch hier keine Überläufe in X- oder Y-Richtung angezeigt. Ich habe nun eine andere Maus getestet. Es handelt sich um eine Logitech MX-518. Diese ist zwar auch bis 127 beschränkt jedoch ist sie auch bei schnellen Bewegungen genauer als die Lasermaus.

Was meint ihr? Ist es die Lasermaus oder liegt es an der Verarbeitung der Daten vom USB-Bus. Ich könnte ja noch die Deltas direkt vom Maussensor abgreifen...

Viele Grüße
tuxologie

tuxologie
07.02.2014, 08:17
Hallo,

was meint ihr dazu? Sind alle USB-Mäuse in diesem Bereich beschränkt? Die MX-518 war aber viel genauer bei schnellen Bewegungen als meine Lasermaus.
Ich habe auch probiert die USB-Pollingrate als Kernelparameter anzupassen (Quelle (https://wiki.archlinux.org/index.php/Mouse_Polling_Rate)). Auslesen kann man ihn mit: cat /sys/module/usbhid/parameters/mousepoll
Leider wurde die Pollingrate dadruch nicht schneller... Vorschläge?

Viele Grüße
tuxologie