Autore Topic: Cambiare sistema di riferimento Android  (Letto 2785 volte)

Offline berna4sg

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Cambiare sistema di riferimento Android
« il: 23 Gennaio 2014, 01:11:13 CET »
0
Ciao ragazzi  :-) Sono nuovo del forum e sono da più o meno 6 mesi che ho incominciato a programmare con Android (forse troppo pochi !!).
Spero che l'argomento/problema che sto per esporvi non sia già stato trattato esaustivamente.
Ho creato un'Activity che mi prende i dati provenienti dall'accelerometro del telefono (non è importante se in modalità FASTEST, NORMAL, GAME, ecc) e adesso devo utilizzare un rotation vector per realizzare una rotation matrix: in poche parole devo passare dal sistema di riferimento dell'automobile al sistema di riferimento della Terra (in realtà vorrei utilizzarlo all'interno di un veicolo per ottenere dei dati necessari alla diagnostica).
Qualcuno sarebbe così gentile da darmi qualche dritta su come realizzare questo rotation vector? Non sembra complicato però la mia soluzione non funziona e mi prende sempre gli stessi dati.
Grazi in anticipo ragazzi.
Saluti  ;-)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Cambiare sistema di riferimento Android
« Risposta #1 il: 23 Gennaio 2014, 09:45:01 CET »
0
Io non ho capito cosa devi fare, però se caso mai posti dove sei arrivato col codice, magari qualcuno più familiare con l'argomento ti sa dare qualche indicazione.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Cambiare sistema di riferimento Android
« Risposta #2 il: 23 Gennaio 2014, 10:04:21 CET »
0
La velocità con cui ricevi i dati è ininfluente per il calcolo, al massimo aumenta il carico di cpu.

Si tratta di un problema di algebra lineare, qui è descritto molto bene:

Rotation matrix - Wikipedia, the free encyclopedia

nei casi molto semplici si usano gli angoli di Eulero ma non sono una soluzione generica.
adb logcat | tee /tmp/logcat | grep TAG

Offline berna4sg

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Re:Cambiare sistema di riferimento Android
« Risposta #3 il: 24 Gennaio 2014, 00:55:25 CET »
0
Ok ho risolto il problema della matrice di rotazione.
Non sono sicuro tuttavia di una cosa: io ho bisogno di ascoltare sia il sensore dell'accelerometro che quello del rotation vector.
Per far ciò utilizzo il metodo dell'interfaccia SensorEventListener onSensorChanged (per rilevare ogni volta lo stato aggiornato del sensore) in questo modo:
Codice (Java): [Seleziona]
public void onSensorChanged (SensorEvent event)
        {
                if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) // L'accelerometro ha cambiato stato
                {
                        acc = event.values;
                        show (acc, rot);
                }
                if (event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) // Il rotation vector ha cambiato stato
                        rot = event.values;
        }      
Il metodo show serve semplicemente per mostrare i dati ruotati all'interno di 3 TextBox.
E' corretto l'utilizzo che faccio?? Non vengono introdotti ritardi?

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Cambiare sistema di riferimento Android
« Risposta #4 il: 24 Gennaio 2014, 07:05:55 CET »
0
Se sei riuscito a risolvere il problema originario, se puoi riportare la soluzione magari sarai di aiuto ad un futuro lettore.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline berna4sg

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Re:Cambiare sistema di riferimento Android
« Risposta #5 il: 24 Gennaio 2014, 11:56:36 CET »
0
Certo.
Il mio ragionamento è stato semplicemente il seguente:
- ho preso i dati dal sensore del rotation vector e ho salvato i dati in un vettore tridimensionale <x,y,z>;
- fatto ciò mi sono calcolato la rotation matrix utilizzando la funzione getRotationMatrixFromVector;
- il tipo restituito dalla funzione è un vettore e quindi ho dovuto trasformarlo in una matrice 3x3;
- infine, ho moltiplicato la matrice ottenuta per il vettore <x,y,z> contenente i valori dell'accelerometro, ottenendo in questo modo il vettore <x,y,z> con i valori dell'accelerometro ruotato rispetto i riferimenti terrestre.
Spero di essere stato abbastanza chiaro.
Sarei grato se qualcuno potesse darmi qualche parere sul mio post precedente.
Grazie  ;-)
Saluti

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Cambiare sistema di riferimento Android
« Risposta #6 il: 24 Gennaio 2014, 12:39:07 CET »
0
Il ritardo sarà sicuramente marginale ma se stai usando sensori hardware (il rotation vector non è detto che sia un sensore hardware, può essere anche software) temo che il risultato sia abbastanza instabile.

Hai valori stabili o tendono a saltare qua e là?

Offline berna4sg

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Re:Cambiare sistema di riferimento Android
« Risposta #7 il: 24 Gennaio 2014, 15:59:39 CET »
0
Eh sono abbastanza instabili purtroppo. Come posso risolvere questa instabilità??

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Cambiare sistema di riferimento Android
« Risposta #8 il: 24 Gennaio 2014, 16:46:00 CET »
0
Per risolvere l'instabilità applichi un filtro in tempo reale. Che detto così sembra un parolone ma in realtà è semplice.

Ho postato una snippet proprio adesso, nel caso in cui servisse anche ad altri. Visto che il topic riguarda il cambio di sistema di riferimento sarebbe stato difficile da trovare.

Ecco il link:

Filtrare dati provienienti dai sensori - Android Developers Italia

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Cambiare sistema di riferimento Android
« Risposta #9 il: 24 Gennaio 2014, 19:23:02 CET »
0
Se i ritardi sono dei problemi (solo tu lo puoi valutare) gli oggetti di classe SensorEvent hanno tutti uno timestamp, puoi usarlo per effettuare correzioni e interpolazioni.
adb logcat | tee /tmp/logcat | grep TAG

Offline berna4sg

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Re:Cambiare sistema di riferimento Android
« Risposta #10 il: 27 Gennaio 2014, 18:52:25 CET »
0
Ti faccio i complimenti per il topic: davvero molto chiaro ed esaustivo !!
Adesso io vorrei utilizzare il metodo sensorManager.unregisterListener(SensorEventListener listener) per fare il modo che l'ascoltatore non rimanga in esecuzione anche quando l'activity è stata chiusa. Ho pensato di inserirlo all'interno del metodo onStop in questo modo:
Codice (Java): [Seleziona]
@Override
        protected void onStop() {
                super.onStop();
                sensorManager.unregisterListener(this);
        }
Quando però lancio l'applicazione non vengono più acquisiti dati oltre ai primi e sembra che l'applicazione non stia facendo nulla. Come mai??

Post unito: 27 Gennaio 2014, 19:26:41 CET
Il metodo onStop funziona (infatti non capivo perchè non funzionasse) ma solamente quando lancio l'applicazione e il cellulare ha lo schermo sbloccato. Se lancio l'app con lo schermo l'applicazione non funziona. Riguarderà sicuramente il ciclo di vita dell'Activity.
« Ultima modifica: 27 Gennaio 2014, 19:26:41 CET da berna4sg, Reason: Merged DoublePost »

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Cambiare sistema di riferimento Android
« Risposta #11 il: 27 Gennaio 2014, 19:41:54 CET »
0
Nella onPause fai l'unregister, il register lo fai nella onResume.

Nel ciclo di vita della activity prima della onstop viene sempre chiamato onpause e dopo la oncreate viene chiamata la onresume.

In dettaglio (visto che anche io ammetto di scordarmi qualche passaggio)...  :-P



 :-)
« Ultima modifica: 27 Gennaio 2014, 19:44:06 CET da undead »

Offline berna4sg

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Re:Cambiare sistema di riferimento Android
« Risposta #12 il: 28 Gennaio 2014, 15:54:53 CET »
0
Adesso funziona tutto correttamente grazie  ;-)
L'ultimo problema è questo: visto che i sensori mi prendono una quantità enorme di dati, e devo effettuare dei test raccogliendo i dati in file di testo, mi interessa prendere 10 campioni al secondo. Per effettuare ciò semplicemente utilizzo la funzione registerListener in questo modo:
Codice (Java): [Seleziona]
sensorManager.registerListener (this, sensorManager.getDefaultSensor (Sensor.TYPE_ACCELEROMETER), 100000);Infatti l'ultimo parametro indica il rate espresso in microsecondi: quindi se devo prendere 10 campioni al secondo, questo equivale a prendere 1 campione ogni 100000 microsecondi. Il problema è che non vedo assolutamente nessun rallentamento nella raccolta dati. Come mai? Sto sbagliando qualche calcolo??

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Cambiare sistema di riferimento Android
« Risposta #13 il: 28 Gennaio 2014, 16:06:18 CET »
0
Il tempo che hai settato purtroppo è solo un suggerimento:

"This is only a hint to the system. Events may be received faster or slower than the specified rate. Usually events are received faster. "

Conta con un timer il tempo trascorso e ogni 100 millisecondi lo resetti e salvi il dato
« Ultima modifica: 28 Gennaio 2014, 16:07:57 CET da undead »

Offline berna4sg

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
Re:Cambiare sistema di riferimento Android
« Risposta #14 il: 29 Gennaio 2014, 15:09:30 CET »
0
Ho deciso di utilizzare la classe Handler piuttosto che la Timer. E' una buona scelta?