2012-06-16 8 views
11

Se ho una semplice pagina web e script che assomiglia a questo:evento javascript 'deviceorientation' - quali sensori misura?

<body> 
    <div id="alpha">a</div> 
    <div id="beta">b</div> 
    <div id="gamma">g</div> 
</body> 

<script> 
window.addEventListener('deviceorientation', function(event) { 
    var alpha = event.alpha; 
    var beta = event.beta; 
    var gamma = event.gamma; 

    document.getElementById("alpha").innerHTML = alpha; 
    document.getElementById("beta").innerHTML = beta; 
    document.getElementById("gamma").innerHTML = gamma; 

}, false); 
</script> 

posso aprirlo in Mobile Firefox per Android e il risultato sarà 3 numeri che simile al seguente:

89.256125 
3.109375 
0.28125 

Dove quando ruoto il dispositivo, i numeri cambiano in base all'asse di rotazione. Ho notato che i valori di "alpha" sono davvero rumorosi: rimbalzano ininterrottamente anche se il telefono è a riposo sulla mia scrivania, mentre gli altri due rimangono fermi. Capisco che l'alfa è la mia voce. Sono curioso allora, sta ottenendo il valore "alfa" dalla bussola (che ha problemi di rumore) e gli altri due dal giroscopio?

Un altro problema è quando cambio il tono, per qualche motivo cambia anche la direzione, anche se in realtà non cambio la direzione. Sono solo curioso perché questo è e come può essere corretto?

Inoltre, poiché il giroscopio misura la velocità angolare, presumo che questo listener di eventi lo integri automaticamente - l'algoritmo di integrazione è buono come qualsiasi? Usa l'accelerometro per correggere la deriva?

In questo discorso google video tecnologia, dalle 15.00 alle 19.00, i colloqui di altoparlanti circa correggere la deriva inerente al giroscopio utilizzando l'accelermoter, così come calibrare l'orientamento rispetto alla gravità: http://www.youtube.com/watch?v=C7JQ7Rpwn2k Come dovrei fare questo?

Grazie per tutti gli approfondimenti che chiunque può avere.

+3

Hai letto http://dev.w3.org/geo/api/spec-source-orientation.html – mplungjan

+0

Come si ottengono i numeri: [Ecco come ] (http://dev.w3.org/geo/api/spec-source-orientation.html#worked-example) (Attenzione, matematica spaventosa avanti) –

+0

Questa specifica W3 è decisamente utile. Credo che avrei dovuto sapere che esisteva. Capisco la matematica in esso, avendo già preso l'algebra lineare. – Joey

risposta

2

L'orientamento del dispositivo è ottenuto mediante fusione sensore. A rigor di termini, nessuno dei sensori lo misura. L'orientamento è il risultato dell'unione dei dati dell'accelerometro, del giroscopio e del magnetometro in modo intelligente.

ho notato i valori per "alpha" sono veramente rumoroso - rimbalzano intorno non-stop anche se il telefono è a riposo sulla mia scrivania, mentre gli altri due rimangono costanti.

Questo a common problem with the Euler angles, cerca di evitarli se puoi.

A proposito, il sensore Fusion su dispositivi Android: un video di Revolution in Motion Processing a cui si collega per spiegarlo a 38:25.

Inoltre, poiché le misure giroscopio velocità angolare, Presumo che questo ascoltatore evento sta integrando automaticamente - è l'algoritmo di integrazione buono come qualsiasi? Usa l'accelerometro per correggere la deriva ?

Sì, la deriva del giroscopio viene corretta con l'aiuto delle letture dell'accelerometro (e del magnetometro, se presenti). Questo è chiamato fusione dei sensori.

In questo discorso google video tecnologia, dalle 15.00 alle 19.00, i colloqui di altoparlanti circa correggere la deriva inerente al giroscopio utilizzando la accelermoter, così come calibrare l'orientamento rispetto alla gravità: http://www.youtube.com/watch?v=C7JQ7Rpwn2k Come dovrei andare a per fare questo?

Se hai orientamento, qualcuno ha già fatto tutto questo per te. Non devi fare nulla.

+0

Grazie per la spiegazione. Sono davvero sollevato dal fatto che non devo reinventare la fusione dei sensori. L'unica cosa che ancora non riesco a capire è come riesca a indicare il nord vero invece del nord magnetico? Non conosce la mia latitudine o longitutde. – Joey

+0

Buona domanda, posso solo indovinare. Hai ragione, può misurare solo il nord magnetico. Tuttavia, l'angolo tra la gravità e il nord magnetico può essere utilizzato per stimare la latitudine. Inoltre, il GPS o il fornitore di servizi possono comunicare al dispositivo la posizione geografica (abbastanza precisa). Quindi, non lo so. Cosa ti fa pensare che conosca il vero nord? Quanto differisce il vero e il nord magnetico al tuo posto? – Ali

+0

Bene, mi dà una lettura del nord (alfa = 0 o 360) a pochi gradi in senso orario da dove la mia bussola app mi dice che è nord. E vivo a Seattle, dove la differenza tra il nord magnetico e il nord vero è significativa dal momento che il nord magnetico è sopra l'Alaska. – Joey

3

Tutti i valori di orientamento sono anche molto rumorosi per me. Mano tremante, angoli di Eulero, interferenza magnetica, bug di fabbricazione, ... chi lo sa?

Ho fatto un small exponential smoothing. Cioè, ho sostituito fluttuante event.alpha da un valore livellato, che è stato opportunamente chiamato alfa:

alpha = event.alpha + s*(alpha - event.alpha), with 0 <= s <= 1;

In altre parole, ogni volta che una nuova osservazione è ricevuto, il valore livellato sia aggiornato con una correzione proporzionale all'errore.

  • Se s = 0, il è esattamente il valore osservato levigata e non v'è alcun livellamento.
  • Se s = 1, l'alfa rimane costante, che è effettivamente una levigatura troppo efficiente.
  • Altrimenti, l'alfa è un punto intermedio tra il valore osservato e il valore arrotondato. In realtà, è una media (ponderata) tra l'ultima osservazione e la storia. Segue quindi i cambiamenti nei valori con un certo effetto di smorzamento.
  • Se s s è piccolo, quindi il processo è vicino all'ultima osservazione e si adatta rapidamente alle modifiche recenti (e anche a fluttuazioni casuali). Lo smorzamento è piccolo.
  • Se s è vicino a 1, il processo è più viscoso. Reagisce pigramente a fluttuazione casuale (e anche a cambiare nella tendenza centrale). Lo smorzamento è grande.
  • Non provare s al di fuori dell'intervallo 0..1, poiché ciò porta a un ciclo di feedback negativo e l'alfa inizia presto a divergere con fluttuazioni sempre più grandi.

  • Ho usato s = 0.25, dopo la prova che non vi era alcuna differenza significativa per s tra 0,1 e 0,3.

Importante: Quando si utilizza questo metodo, non dimenticate di inizializzare alfa, al di fuori della funzione addEventListener:

var alpha = guestimate (= here 0);

Si noti che questo semplice lisciatura adattiva funziona in molti altri casi, e è una programmazione davvero semplice.

+0

Il livellamento su più di due campioni può essere d'aiuto? – ErikE

0

Utilizzare una matrice di coseno direzionale o un filtro kalman. Puoi usare l'accelerometro per tracciarlo o il giroscopio o una combinazione di entrambi. La deriva può essere calcolata con un po 'di apprendimento automatico. Penso che la fusione del movimento faccia parte del pacchetto di calibrazione degli strumenti del Texas. Potrei sbagliarmi. Ma non è difficile da controllare. moltiplicare 3 matrici rotazionali, essere grandioso .. http://www.itu.dk/stud/speciale/segmentering/Matlab6p5/help/toolbox/aeroblks/euleranglestodirectioncosinematrix.html