Utilizzo Data Glove e Tracker in Panda3D -...

Post on 10-Jul-2020

9 views 0 download

Transcript of Utilizzo Data Glove e Tracker in Panda3D -...

Utilizzo Data Glove e Tracker in Panda3DUtilizzo Data Glove e Tracker in Panda3D

Davide GadiaDavide Gadia

Corso di Ambienti Virtuali Immersivi e InterattiviCorso di Ambienti Virtuali Immersivi e Interattivi

Laurea Magistrale in Informatica per la ComunicazioneLaurea Magistrale in Informatica per la Comunicazione

a.a. 2012/2013a.a. 2012/2013

• Connessione USB

• Dll molto semplice per l'acquisizione dei dati e per il loro utilizzo in un applicativo Autocalibrazione Gesture Acquisizione dati singoli sensori (finger

tracking)

Data Glove 5DT 14 Ultra

• Valori di flessione minima e massima in ogni sensore dipendono da caratteristiche mano dell' utente

• E' necessario calibrare il dispositivo Manualmente:

inserisco valori predeterminati tramite le chiamate specifiche (applicazione chiede un range limitato e predefinito di valori)

inserisco dati di calibrazione precedenti per l'utente e li carico nel sistema

Automaticamente (impostazione di default): dopo l'apertura e chiusura (un paio di volte) delle dita

vengono acquisiti i nuovi valori minimi e massimi per l'utente Necessario preparare una breve fase preliminare in cui viene

chiesto all'utente di aprire e chiudere la mano Il dispositivo parte con valori di default non adeguati

Data Glove - Autocalibrazione

Data Glove - Gesture

Image courtesy of www.5dt.com

• Possibilità di mappare posizioni predefinite delle dita a segnali di input dell'applicazione Metodo getGesture() ritorna un intero (slide precedente) Non tutte intuitive Non tutte facili da fare Troppe gesture difficili da ricordare\gestire

E' necessario avere configurazioni “di riposo” che non siano mappate ad un'azione

Data Glove - Gesture

Data Glove – Dati raw dei sensori

Image courtesy of www.5dt.com

• Sensori di flessione e abduzione• Acquisizione dati scalati in [0.0, 1.0]

Singolarmente: getSensorScaled(sensor) Tutti insieme: getSensorScaledAll() Possono essere utilizzati per esempio per controllare i joint delle

dita di una mano 3D

• Dll fornita con il dispositivo è in C• Non esiste una versione Python ufficiale da utilizzare in Python

• Binding Python nel modulo glove del Python Computer Graphics Kit (cgkit)

cgkit non aggiornata da 2 anni Non funziona con Panda 1.8

• Supporto VRPN parziale No gesture Dati scalati senza calibrazione

Data Glove in Panda3D

• Possibili soluzioni: Creare un wrapper Python utilizzando Boost o Ctypes Creare un applicativo C/C++ che chiami SDK Data Glove ed

esporti dati come pacchetti OSC http://code.google.com/p/oscpack/

• Utilizzo Ctypes: SDK dispositivo utilizza una struct di riferimento non nota Impossibile/molto difficile gestirla direttamente in Ctypes Meglio creare una DLL che faccia da wrap alla SDK Funzioni C della DLL “di servizio” chiamano molto semplicemente

i metodi della SDK, gestendo in C la struttura dati proprietaria. fdOpen - fdClose fdGetSensorScaled fdGetGesture

Data Glove in Panda3D

Gestione joint in Panda3D

• ActorNodePath.exposeJoint(None, “modelRoot”, “Joint Name”) Ritorna il NodePath a cui è attaccato il joint Riparentando a questo NodePath, il nuovo oggetto seguirà il joint Metodi di sola lettura

• ActorNodePath.controlJoint(None, “modelRoot”, “Joint Name”) crea un NodePath “dummy” a cui applicare una

trasformazione Ad ogni frame, la trasformazione è applicata al joint Controllo procedurale dell' animazione. Metodi di sola scrittura

• Connessione USB o Seriale• Trasmissione posizione e orientamento

del ricevitore rispetto al trasmettitore

• Problemi interferenza metalli Posizionamento trasmettitore su

treppiede fotografico

Tracker Polhemus FASTRAK

• Dati trasmessi tramite VRPN Di default, supporterebbe solo connessione seriale In caso di disponibilità solo della connessione USB:

possibile utilizzare cavo USB-Seriale per creare una porta seriale virtuale sul PC

mantentendo però la gestione del dispositivo tramite USB

• In Panda3d, connessione a server VRPN tramite classe VrpnClient Acquisizione dati tramite classe TrackerNode

FASTRAK in Panda3D

• Orientamento sistema di riferimento Tracker diverso da quello di Panda3D Va tenuto conto nell'utilizzare i dati Invertire segno asse Z Scambiare valori su X e Y

FASTRAK in Panda3D

Assi Trasmettitore - Image courtesy of www.polhemus.com

FASTRAK in Panda3D

Assi Ricevitore - Image courtesy of www.polhemus.com

• Classe TrackerNode serve all'acquisizione dei dati dal dispositivo ma non li passa al grafo della scena non trasforma i dati tenendo conto delle eventuali trasformazioni

locali dei nodi.

• L'oggetto deve essere attaccato al datagraph un grafo dedicato alla gestione dei dati dei dispositivi

• Creo poi un nodo figlio di tipo Transform2SG: viene connesso al grafo della scena la cui funzione è convertire i dati assoluti del dispositivo in

trasformazioni relative al nodo a cui vengono applicate perciò considerando anche la catena di trasformazioni

precedenti

FASTRAK in Panda3D

FASTRAK in Panda3D

.... self.vrpnclient = VrpnClient ('localhost') self.tracker0 = TrackerNode(self.vrpnclient,"Tracker0") #creo un nodo nel grafo della scena self.myTrackedNode = render.attachNewNode('myTrackedNode') # collego il nodo del tracker a dataRoot base.dataRoot.node().addChild(self.tracker0) # creo un nodo Transform2SG, che trasformera' e #passera' i dati dal TrackerNode al grafo della scena t2n = Transform2SG('t2n') # lo imparento a tracker0 self.tracker0.addChild(t2n) #lo collego a myTrackerNode t2n.setNode(self.myTrackedNode.node()) .....

• Applicando rotazioni in maniera separata sui 3 assi, è possibile far coincidere due assi di rotazione Perdo un grado di libertà Es: pitch di 90°-> yaw e roll si annullano

• Soluzione: Utilizzo quaternioni

Più complessi da utilizzare e gestire Oppure applico limitazioni sugli assi e/o sugli angoli di rotazione

Devo considerare cosa mi serve effettivamente nell'applicazione

Es: Head tracking Posso evitare il roll Limito angoli di Pitch nel range [-85°,+85°]

Gimbal lock

Gimbal lock

Situazione normale Gimbal lock: assi di rotazione yaw e pitch sono paralleli → ho perso un

grado di libertà

• Esportazione pacchetti OSC• Da provare e testare

• Processing Con libreria processing-fastrak

• Puredata Con libreria comport

Alternative per connessione Tracker