Calibrazione leve analogiche joypad

Se avete problemi con l'installazione e la configurazione di Slackware postate qui. Non usate questo forum per argomenti generali... per quelli usate Gnu/Linux in genere.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Slackware, se l'argomento è generale usate il forum Gnu/Linux in genere.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Calibrazione leve analogiche joypad

Messaggio da Blizzard »

Salve,
stavo codando il sistema di input per il gioco e ho notato che le leve analogiche del joypad che stavo usando (tramite il KControlCenter) erano mal calibrate a differenza del paddle.
Vorrei sapere se c'è un modo per calibrarle, altrimenti nella versione linux mi sa che devo togliere di default il supporto all'analogico oppure implementare una calibrazione che comunque mi farebbe perdere un po di sensibilità negli angoli dove è orientato il cursone (e un aumento della sensibilità negli altri angoli).
Comunque una calibrazione di massima è fattibile ma sarei interessato se è possibile eseguirla con gli strumenti di sistema per andare più sicuro... e risparmiare codice :badgrin:

ciao
Gio

Avatar utente
lyapunov
Linux 2.x
Linux 2.x
Messaggi: 204
Iscritto il: dom 4 mag 2008, 16:12

Re: Calibrazione leve analogiche joypad

Messaggio da lyapunov »

Interessante.....Non so come fare con gli strumenti di sistema ma via software potresti semplicemente in fase di avvio del gioco registrare gli offset di spostamento dei vari assi (a leva centrata) e sottrarli di volta in volta ai valori in input.
Spero di essere stato chiaro...

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: Calibrazione leve analogiche joypad

Messaggio da Blizzard »

lyapunov ha scritto:Interessante.....Non so come fare con gli strumenti di sistema ma via software potresti semplicemente in fase di avvio del gioco registrare gli offset di spostamento dei vari assi (a leva centrata) e sottrarli di volta in volta ai valori in input.
Spero di essere stato chiaro...
mmm ... solo sottrazione :-k , preferisco lavorare di interpolazione.
Ti faccio fare la calibrazione toccando gli angoli e poi registro le distanze dal centro sfasato. In pratica poi eseguo si la sottrazione ma poi faccio il clamp dei valori tra 0 e 1.
In questo modo se è sfasata in alto ad esempio avrò in alto un rilevamento di valori tra ~-8000 e ~-32000 e in basso tra ~-8000 e ~32000.
Poi ovviamente porto tutto tra 0 e 1 ma come puoi capire la sensibilità aumenta verso il basso e diminuisce verso l'alto e questo mi snerva un po. Ma se non si trova altra soluzione è sempre meglio di niente.

Ciao
Gio

Avatar utente
lyapunov
Linux 2.x
Linux 2.x
Messaggi: 204
Iscritto il: dom 4 mag 2008, 16:12

Re: Calibrazione leve analogiche joypad

Messaggio da lyapunov »

Non ho capito bene cosa vuoi fare anche perchè non conosco quali valori ti da in uscita il joystick (ho ipotizzato che ti desse dei valori di spostamento su assi x e y perpendicolari tra loro).
Se proprio vuoi fare le cose per bene puoi fare così:

Ipotizziamo una sensibilità lineare del joystick s (s_x per l'asse x e s_y per l'asse y). In questo caso i valori che il controller invia al pc sono nella forma:

x = a_x*s_x + o_x
y = a_y*s_y + o_y

dove o_x o_y sono l'offset a joy centrato e fermo e a_x e a_y sono le posizioni del joy nello spazio (per esempio a_x = 1 a_y = 1 se è messo nell'angolo in alto a dx e a_x = -1 e a_y = -1 se è messo nell'angolo in basso a sx).
A questo punto puoi a controller fermo registrare i valori o_x e o_y. Dopo di chè ti metti di volta in volta nei quattro angoli ottenendo 4 valori per a_x, 4 per a_y (che conosci perchè sai in quale angolo sei) e 4 per x e 4 per y che vai a prendere leggendo cosa il tuo joy spedisce al pc.
A questo punto hai che

s_x = (x - o_x)/a_x
s_y = (y - o_y)/a_y

in realtà hai 4 valori per ciascuna equazione sopra scritta. A questo punto puoi interpolare e ottieni così s_x e s_y.

Questa procedura di calibrazione è quella standard che si segue in fase di calibrazione di sensori con una costante di calibrazione lineare.

Ciau..

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: Calibrazione leve analogiche joypad

Messaggio da Blizzard »

ciao,
praticamente stiamo dicendo la stessa cosa, solo che prima me l'avevi presentata come semplice sottrazione del nuovo centro al valore di movimento.

In pratica il joypad analogico restituisce 2 valori (ciascuno per ogni asse) che vanno da -32k a +32k (non so se questo dato cambia per ogni pad ma in generale è così).
Pertanto supponiamo che il centro sia sfalzato a (-1000,-1000) ovvero leggermente in alto a sinistra. In questo caso la massima posizione che il pad può assumere in alto a sinistra è sempre (-32k,-32k) però come puoi immaginare lo spostamento non è stato v(-32k,-32k) ma v1(-32k-(-1000) , -32k-(-1000)).
Spostando la leva nell'angolo in basso a destra ovviamente procedendo come prima avremo uno spostamento di v(32k,32k) ma il punto toccato in basso a destra è (32k-1000 , 32k-1000) perchè il centro è sfalsato.

A questo punto rilevo che sull'asse x ad esempio ho uno spostamento positivo di 32k (verso destra) ed uno negativo di 32k-1000 (verso sinistra). Quindi risolvo tutto praticamente simile a come hai spiegato ora effettuando il clamp del valore di spostamento attuale tra -1e 1 (scusa avevo scritto tra 0 e 1 prima) ovvero ex:

centro c=(-1000,-1000)
spostamento_massimo_sx=~-31000;
spostamento_massimo_dx=~32000;

valore_attuale_x < c.x
valore spostamento x =(valore_attuale + c.x) / spostamento_massimo_sx;

valore_attuale_x > c.x
valore spostamento x =(valore_attuale - c.x) / spostamento_massimo_dx;

in pratica se ho capito bene diciamo quasi la stessa cosa

ciao
Gio

Rispondi