interactions avec un écran tactile (tactile display testing)

10
 Technical report © Sylvain Hanneton (2015) Interactions avec un écran tactile Table des matières Introduction............. .......................................................................................................................................1 Le problème............. ..................................................................................................................................1 Spécifications de l'écran............. ............................................................................................................... 1 MacOsX....................................................................................................................................................3 Dans le gestionnaire de fenêtre X11..............................................................................................................3 Sortie de xinput.............. ........................................................................................................................... 3 Sortie de lsusb............ ...............................................................................................................................3 Détachement de la dalle tactile............... ............................................................................................ .......4 Dump des données de la dalle............. ......................................................................................................4 Lecture directe de l'entrée USB..................................................................................................................... 5 Utiliser le module evdev avec Python........... ............................................................................................ .....6 Port d'entrée des événements..... ................................................................................................................6 Les événements générés par la dalle tactile................................ .............................................................. 6 Ce que dit l e kernel Linux (extrait).................................. .................................................................. ..6 Les événements générés par la dalle.....................................................................................................7 Le script.....................................................................................................................................................8 OSC output............... ................................................................................................................................. 9 Introduction Le problème L'objectif de ce document est de montrer comment l'on peut capturer les données d'interaction avec l'écran tactile sans que celui-ci soit actif en tant que dispositif de pointage dans le gestionnaire de fenêtre de l'ordinateur. En effet, si celui-ci reste actif, alors les interactions avec les fenêtres restent possibles ce qui peut gêner la capture des données de mouvement. Spécifications de l'écran L'écran tactile testé ici est un iyama 24 pouces avec une résolution maximale de 1920 par 1080 pixels. La référence du modèle est T2452MTS-B4 ( http://www .iiyama.com/be_fr/prod uits/prolite-t2452mts-4/ ) 1

Upload: sylvain-hanneton

Post on 03-Nov-2015

36 views

Category:

Documents


0 download

DESCRIPTION

How to get multitouch data from a tactile display and how to send the data via the OSC protocol. The trick uses Python and the doc is in french.

TRANSCRIPT

  • Technical report Sylvain Hanneton (2015)

    Interactions avec un cran tactile

    Table des matiresIntroduction....................................................................................................................................................1

    Le problme...............................................................................................................................................1Spcifications de l'cran............................................................................................................................1MacOsX....................................................................................................................................................3

    Dans le gestionnaire de fentre X11..............................................................................................................3Sortie de xinput.........................................................................................................................................3Sortie de lsusb...........................................................................................................................................3Dtachement de la dalle tactile..................................................................................................................4Dump des donnes de la dalle...................................................................................................................4

    Lecture directe de l'entre USB.....................................................................................................................5Utiliser le module evdev avec Python............................................................................................................6

    Port d'entre des vnements.....................................................................................................................6Les vnements gnrs par la dalle tactile..............................................................................................6

    Ce que dit le kernel Linux (extrait)......................................................................................................6Les vnements gnrs par la dalle.....................................................................................................7

    Le script.....................................................................................................................................................8OSC output................................................................................................................................................9

    Introduction

    Le problmeL'objectif de ce document est de montrer comment l'on peut capturer les donnes d'interaction avecl'cran tactile sans que celui-ci soit actif en tant que dispositif de pointage dans le gestionnaire de fentrede l'ordinateur. En effet, si celui-ci reste actif, alors les interactions avec les fentres restent possibles cequi peut gner la capture des donnes de mouvement.

    Spcifications de l'cranL'cran tactile test ici est un iyama 24 pouces avec une rsolution maximale de 1920 par 1080 pixels. La rfrence du modle est T2452MTS-B4 (http://www.iiyama.com/be_fr/produits/prolite-t2452mts-4/)

    1

  • Technical report Sylvain Hanneton (2015)

    Diagonale 23.6"; 60cm

    Technologie tactile optique, multitouch (2 contacts simultanes possibles - HID, fonctionneseulement sous Windows 7), activ par le doigt ou par pointeur Matrice TN LED

    Surface de travail (Hx L) 293.2 x 521.3 mm; 11.54" x 20.51"

    Temps de rponse 2 ms Contraste 1000 : 1 typique Contraste 5 000 000 : 1 ACR

    Luminosit 260 cd/m typique

    Angle de vision horizontal/vertical: 170/ 160; droit/gauche : 85/ 85; en avant/en arrire :80/ 80 Affichage des

    couleurs 16.7 million

    Taille du pixel (hor. xvert.) 0.272 x 0.272 mm

    Rsolution native Full HD 1080p, 1920 x 1080 ( 2.1 megapixel) Frquence horizontale 24 - 80 KHz

    Frquence verticale 55 - 75 Hz Synchronisation Separate Sync Le ratio d'aspect 16 : 9

    Transparence de lalumire 88%

    Les dimensions sont les suivantes :

    largeur : 523.5 mm

    2

  • Technical report Sylvain Hanneton (2015)

    hauteur : 295 mm

    Ce qui donne une rsolution maximale de 523,5 /1920 = 0,273 mm et 295/1080 = 0,273 mm en largeur et hauteur. Cela en fait un dispositif de capture de mouvement thoriquement trs prcis.

    MacOsXSur ce site : http://at.or.at/hans/research/nime/hid/apis.html

    Apple HID Manager

    HID Manager is the standard USB HID API on Mac OS X. It also includes Apple Desktop Bus (ADB)devices like PowerBook keyboards and trackpads. It is very close to the USB HID API and therefore alsorelatively close to the Windows Driver Development Kit (DDK) HID API. Since it is quite low level,programming with this API is relatively complicated. Understand C pointers well before diving in!

    Apple HID Utilities

    HID Utilities is an easy-to-use layer on top of HID Manager. It is provided as free software which can beused or modified. Using it is much easier than HID Manager, but it is designed with a very specificapplication type in mind, so it can limit flexibility. Also, building the device list can be quite heavy, whichmay cause audio to skip or other undesirable effects. Internally, it uses a number of global variables,which means that multiple instances of [hidio] connected to the same device will steal events from eachother.

    Cela veut dire que si l'on veut capturer les donnes de l'cran tactile sous OS X, il est ncessaire d'utiliser HID Utilities.

    Dans le gestionnaire de fentre X11

    Sortie de xinputLa commande Xinput est un outil (utilitaire) Linux qui permet de lister, de tester, de manipuler lesdispositifs d'interaction avec le gestionnaire de fentre X11.

    $ xinput Virtual core pointer id=2 [master pointer (3)] Virtual core XTEST pointer id=4 [slave pointer (2)] Logitech USB Optical Mouse id=8 [slave pointer (2)] Quanta OpticalTouchScreen id=10 [slave pointer (2)] Virtual core keyboard id=3 [master keyboard (2)] Virtual core XTEST keyboard id=5 [slave keyboard (3)] Power Button id=6 [slave keyboard (3)] Power Button id=7 [slave keyboard (3)] DELL Dell USB Entry Keyboard id=9 [slave keyboard (3)]

    La dalle tactile apparat comme le dispositif 10 (id=10) sous le nom de Quanta OpticalTouchScreen . Ilest dsign comme un pointeur esclave.

    3

  • Technical report Sylvain Hanneton (2015)

    Sortie de lsusbLa commande lsusb permet de lister les dispositifs usb connects l'ordinateur.

    $ lsusb Bus 002 Device 004: ID 0bda:0184 Realtek Semiconductor Corp. RTS5182 Card Reader Bus 002 Device 005: ID 0408:3008 Quanta Computer, Inc. Bus 002 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub Bus 002 Device 002: ID 8087:8000 Intel Corp. Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 004: ID 413c:2107 Dell Computer Corp. Bus 001 Device 003: ID 046d:c077 Logitech, Inc. Bus 001 Device 002: ID 8087:8008 Intel Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub La dalle tactile apparat sur la seconde ligne dispositif n5 Quanta Computer, Inc.

    Dtachement de la dalle tactileIl est possible de demander au gestionnaire de fentre de ne plus tenir compte des donnes fournies par ladalle tactile pour piloter la souris. La dalle tactile devient alors un dispositif flottant . Elle reste activemais ne sert plus piloter la souris. Pour cela il faut entrer la commande suivante :

    xinput float 10le rsultat est le suivant :

    $ xinput float 10 $ xinput Virtual core pointer id=2 [master pointer (3)] Virtual core XTEST pointer id=4 [slave pointer (2)] Logitech USB Optical Mouse id=8 [slave pointer (2)] Virtual core keyboard id=3 [master keyboard (2)] Virtual core XTEST keyboard id=5 [slave keyboard (3)] Power Button id=6 [slave keyboard (3)] Power Button id=7 [slave keyboard (3)] DELL Dell USB Entry Keyboard id=9 [slave keyboard (3)] Quanta OpticalTouchScreen id=10 [floating slave]

    La dalle tactile apparat maintenant avec la proprit floating slave . Nous pouvons essayer de lire les donnes qu'elle fournie.

    Dump des donnes de la dalleOn peut pour cela utiliser l'option test de la commande xinput.

    xinput test 10Si l'on trace un petit carr sur l'cran avec le doigt on obtient la rponse suivante :

    4

  • Technical report Sylvain Hanneton (2015)

    motion a[0]=1043 a[1]=349 button press 1 a[0]=1043 a[1]=349 motion a[0]=1046 a[1]=349 motion a[0]=1048 a[1]=349 motion a[0]=1051 a[1]=350 motion a[0]=1053 a[1]=350 motion a[0]=1063 a[1]=351 motion a[0]=1065 a[1]=351 motion a[0]=1066 a[1]=351 ...motion a[0]=1050 a[1]=344 motion a[0]=1050 a[1]=344 button release 1 a[0]=1050 a[1]=344

    La rponse de la dalle tactile donne donc trois types d'vnements :

    motion : donne les coordonnes courantes du doigt

    button press 1 : lorsque le doigt touche la dalle (prcd toujours d'un vnement motion)

    button release 1 : lorsque le doigt quitte la dalle

    Il faut noter que dans la configuration de base, X11 ne gre pas l'utilisation de plusieurs doigts en mmetemps. Il est sans doute possible de changer cela en modifiant les paramtres du gestionnaire (voir lesautres options de Xinput).

    En utilisant les donnes fournies par xinput et en les redirigeant vers un autre utilitaire, il serait djpossible de capturer l'activit de la dalle pour s'en servir dans une application.

    Lecture directe de l'entre USBOn peut essayer de lire directement les donnes qui arrivent pas le port srie USB. Attention il faut lefaire en tant que superuser car le port est protg. La dalle tactile apparat sous la dnomination hidraw2 dans le rpertoire /dev.

    Si l'on applique la commande sudo cat /dev/hidraw2 alors on obtient une sortie du type :~$ sudo cat /dev/hidraw2 # #-# ##### #-# ##### #-# ##### #-# ##### #-# ##### #-# ##### #-# ##### #-# ##### #- # ##### #,# ##### #,# ##### #,# ##### #,# ##### #,# ##### #,# ##### #-# ##### #- # ##### #-# ##### #-# ##### #-# ##### #- # ##### #.# ##### #.# ##### #.# ##### #/# ##### #0# ##### #2# ##### #3# ##### #5# ### ##y#7# #####r#9# #####k#;# #####d#># #####]#A# #####W#C# #####Q#F# #####K#I# #####E#K # #####E#K# #####@#N# #####;#Q# #####6#T# #####0#X# #####+#[# #####'#^# #####"#a# ### ####d# #######g# #######j# #######n# ######r# #####

    Ce qui n'est pas satisfaisant du tout ! Les donnes sont binaires et non ASCII. Elles ne sont pas directement comprhensibles.

    La mme chose peut tre faite au niveau du gestionnaire d'vnements de Linux . La dalle tactile y

    5

  • Technical report Sylvain Hanneton (2015)

    apparat comme mouse 1 :

    sudo cat /dev/input/mouse1On obtient l encore des donnes binaires, qui sont les vnements traits par le systme input deLinux.

    Donc on ne peut utiliser cette technique pour lire les donnes venant de l'cran tactile ( moins deconnatre le codage des donnes). En effet les donnes ne sont pas envoyes en code ASCII mais enhexadcimal. Essayer de dcoder ces donnes reviendrait faire le travail accompli par les outils desgestionnaires de fentre. Le plus simple est donc de travailler au niveau des vnements grs par legestionnaire de fentre lorsque des donnes sont produites par l'cran tactile.

    Sous linux, il est possible de travailler avec le gestionnaire d'vnements de X11. Mais une solution peut-tre plus intressante est de travailler avec la librairie SDL qui permet de grer un grand nombred'vnements et surtout qui a l'avantage de fonctionner sur plusieurs types d'OS. Il existe aussi la librairiepython pygame qui gre les vnements de faon similaire la SDL.

    Malheureusement :

    la SDL ne peut grer que les vnement lies une fentre. Or si l'on dtache la dalle tactile dugestionnaire de fentre, les vnements de type toucher ne sont pas dtects

    pygame ne sait pas encore grer les entres tactiles, il y a bien une librairie touchpy mais quiest encore en stade de dveloppement (https://code.google.com/p/touchpy/wiki/About).

    La solution : utiliser le module evdev de Python

    Port d'entre des vnementsLe module evdev de python permet de grer les vnements issus des dispositifs HID. Il faut pour pouvoir utiliser le dispositif connatre le port de gestion des entres (/dev/input) auquel il est rattach.

    ('/dev/input/event9', 'Quanta OpticalTouchScreen', 'usb-0000:00:1d.0-1.5/input0') ('/dev/input/event8', 'HDA ATI HDMI HDMI/DP,pcm=3', 'ALSA') ('/dev/input/event7', 'HDA Intel PCH Front Mic', 'ALSA') ('/dev/input/event6', 'HDA Intel PCH Rear Mic', 'ALSA') ('/dev/input/event5', 'HDA Intel PCH Line Out', 'ALSA') ('/dev/input/event4', 'HDA Intel PCH Front Headphone', 'ALSA') ('/dev/input/event3', 'DELL Dell USB Entry Keyboard', 'usb-0000:00:1a.0-1.2/input0') ('/dev/input/event2', 'Logitech USB Optical Mouse', 'usb-0000:00:1a.0-1.1/input0') ('/dev/input/event1', 'Power Button', 'LNXPWRBN/button/input0') ('/dev/input/event0', 'Power Button', 'PNP0C0C/button/input0')

    Dans mon cas, le port est /dev/input/event9). Il a t dtermin par ttonnements.

    Important : ne pas oublier avant cela de (1) dtacher l'cran tactile par un xinput float et (2) permettre l'accs au port d'entre par un sudo chown user /dev/input/event9

    6

  • Technical report Sylvain Hanneton (2015)

    Les vnements gnrs par la dalle tactileCe que dit le kernel Linux (extrait)

    The protocol is divided into two types, depending on the capabilities of thehardware. For devices handling anonymous contacts (type A), the protocol describeshow to send the raw data for all contacts to the receiver. For devices capable oftracking identifiable contacts (type B), the protocol describes how to send updatesfor individual contacts via event slots. Drivers for type B devices separate contactpackets by calling input_mt_slot(), with a slot as argument, at the beginning of eachpacket. This generates an ABS_MT_SLOT event, which instructs the receiver to preparefor updates of the given slot.For type B devices, the kernel driver should associate a slot with each identifiedcontact, and use that slot to propagate changes for the contact. Creation,replacement and destruction of contacts is achieved by modifying theABS_MT_TRACKING_ID of the associated slot. A non-negative tracking id is interpretedas a contact, and the value -1 denotes an unused slot. A tracking id not previouslypresent is considered new, and a tracking id no longer present is considered removed.Since only changes are propagated, the full state of each initiated contact has toreside in the receiving end. Upon receiving an MT event, one simply updates theappropriate attribute of the current slot.

    Here is what a minimal event sequence for a two-contact touch would look like for a type B device:

    ABS_MT_SLOT 0 ABS_MT_TRACKING_ID 45 ABS_MT_POSITION_X x[0] ABS_MT_POSITION_Y y[0] ABS_MT_SLOT 1 ABS_MT_TRACKING_ID 46 ABS_MT_POSITION_X x[1] ABS_MT_POSITION_Y y[1] SYN_REPORT

    The process of finger tracking, i.e., to assign a unique trackingID to each initiatedcontact on the surface, is a Euclidian Bipartite Matching problem. At each eventsynchronization, the set of actual contacts is matched to the set of contacts fromthe previous synchronization. A full implementation can be found in [3].

    voir : https://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt

    Les vnements gnrs par la dalleLes vnements qui nous intressent sont :

    7

  • Technical report Sylvain Hanneton (2015)

    Type NOM CODE SignificationEV_ABS ABS_X 0 Position horizontale (pixels)

    ABS_Y 1 Position verticale (pixels)

    ABS_MT_POSITION_X 53 Position horizontale (pixels)(MT = multi-touch)

    ABS_MT_POSITION_Y 54 Position verticale (pixels)(MT = multi-touch)

    ABS_MT_SLOT 47

    ABS_MT_TRACKING_ID 57 The TRACKING_ID identifies an initiatedcontact throughout its life cycle [5]. The valuerange of the TRACKING_ID should be largeenough to ensure unique identification of acontact maintained over an extended period oftime. For type B devices, this event is handled byinput core; drivers should instead useinput_mt_report_slot_state().

    EV_SYN SYN_REPORT 0

    EV_KEY BTN_TOUCH 330 Valeur = down lorsque l'on touche la dalleEV_KEY BTN_TOUCH 330 Valeur = up lorsque le doigt quitte la dalle

    Le script# Processing multitouch events with evdev# and sending touch data via osc# Author : Sylvain Hanneton 2011# 17 juillet 2015

    import libloimport sysfrom evdev import InputDevice, categorize, list_devices, ecodes

    def main(): # initializations try : target = liblo.Address(1234) # to be modified if non-local addressing except liblo.AddressError, err: print str(err) sys.exit() # list devices for convenience devices = [InputDevice(fn) for fn in list_devices()] for dev in devices: print(dev.fn, dev.name, dev.phys)

    8

  • Technical report Sylvain Hanneton (2015)

    # select the concerned device # to be changed if it is not correct dev = InputDevice("/dev/input/event9") print(dev) # event processing loop for event in dev.read_loop(): if event.type == ecodes.EV_ABS: # events of type ABS if event.code == 0 : liblo.send(target,"/tactile/x",event.sec,event.usec,event.value) if event.code == 1 : liblo.send(target,"/tactile/y",event.sec,event.usec,event.value) if event.code == 53 : liblo.send(target,"/tactile/mtx",event.sec,event.usec,event.value) if event.code == 54 : liblo.send(target,"/tactile/mty",event.sec,event.usec,event.value) if event.code == 57 : liblo.send(target,"/tactile/tracking_id",event.sec,event.usec,event.value) if event.code == 47 : liblo.send(target,"/tactile/slot",event.sec,event.usec,event.value) if event.type == ecodes.EV_KEY: # events of type EV_KEY if event.code == 330 : if event.value == 1 : liblo.send(target,"/tactile/button_down",event.sec,event.usec) if event.value == 0 : liblo.send(target,"/tactile/button_up",event.sec,event.usec) if event.type == ecodes.EV_SYN: # events of type EV_SYN if event.code == 0 : liblo.send(target,"/tactile/syn_report",event.sec,event.usec)

    #Run the script if executedif __name__ == "__main__": main()

    OSC outputOn peut obtenir la liste des messages OSC en utilisant l'utilitaire oscdump. Pour un simple petit trait en diagonale, voici les messages obtenus :

    $ oscdump 1234/tactile/tracking_id iii 1437150172 245328 182/tactile/mtx iii 1437150172 245328 845/tactile/mty iii 1437150172 245328 266/tactile/button_down ii 1437150172 245328/tactile/x iii 1437150172 245328 845/tactile/y iii 1437150172 245328 266/tactile/syn_report ii 1437150172 245328/tactile/mtx iii 1437150172 349328 848/tactile/mty iii 1437150172 349328 268/tactile/x iii 1437150172 349328 848/tactile/y iii 1437150172 349328 268

    9

  • Technical report Sylvain Hanneton (2015)

    /tactile/syn_report ii 1437150172 349328/tactile/mtx iii 1437150172 357326 850/tactile/mty iii 1437150172 357326 270/tactile/x iii 1437150172 357326 850/tactile/y iii 1437150172 357326 270.../tactile/syn_report ii 1437150172 581326/tactile/mtx iii 1437150172 597280 953/tactile/mty iii 1437150172 597280 373/tactile/x iii 1437150172 597280 953/tactile/y iii 1437150172 597280 373/tactile/syn_report ii 1437150172 597280/tactile/tracking_id iii 1437150172 669326 -1/tactile/button_up ii 1437150172 669326/tactile/syn_report ii 1437150172 669326

    10

    IntroductionLe problmeSpcifications de l'cranMacOsX

    Dans le gestionnaire de fentre X11Sortie de xinputSortie de lsusbDtachement de la dalle tactileDump des donnes de la dalle

    Lecture directe de l'entre USBLa solution: utiliser le module evdev de PythonPort d'entre des vnementsLes vnements gnrs par la dalle tactileCe que dit le kernel Linux (extrait)Les vnements gnrs par la dalle

    Le scriptOSC output