10
votes

Comment enregistrer les données des capteurs de mouvement Android à un taux fixe

J'apprends les bases de la programmation Android.

J'ai une simple application de test Android dans laquelle je connecte l'accéléromètre, le magnétomètre et les données d'orientation vers un fichier externe tout en l'affichant. J'entraîne le processus de journalisation en cliquant sur le bouton START (inscriptionLISNER pour les capteurs pertinents) en appelant une méthode initlogger .

qui ressemble quelque chose de similaire à celui-ci ... xxx

Il y a aussi un bouton d'arrêt, qui doit arrêter le processus de journalisation (et enfin désenregistrer en appelant Unregisterlistener pour chaque capteur)

Le processus de récupération de données se produit à l'intérieur du gestionnaire ONSENSENORCHANGED qui récupérera les données des capteurs correspondants, définit la valeur sur les éléments d'interface utilisateur respectifs et enfin enregistrer la données à un fichier .csv externe.

Onsensorchanged EventHandler regarde quelque chose comme ça ... xxx

Bien que je reçois les données de tous les capteurs configurés, je Ne pas avoir le contrôle sur la vitesse à laquelle les données sont reçues. i.e

Je sais que l'événement Sensorchanged est tiré comme et lorsque les données du capteur sont modifiées. Cependant, je veux que cet événement soit tiré à un taux fixe. pour ex: chaque 40ms

question:

  1. Comment s'assurer que l'événement Sensorchanged est tiré à taux constant?
  2. est la classe TIMERTASK en Java de toute aide dans ce cas?

    experts ici en SO.Veuillez m'aider :)


4 commentaires

Puisque vous souhaitez enregistrer les données de vos intervalles spécifiques, pourquoi enflammer l'événement Sensorchanged? Pourquoi ne pas utiliser une sorte de minuterie et demander les valeurs réelles après l'heure spécifiée? Ou suis-je quelque chose de mal ici?


@nurgan: L'événement sensorchanged est tiré comme et lorsqu'il y a une modification des données du capteur. Je n'ai aucun contrôle sur cet événement. En ce qui concerne votre suggestion de lire / demander les valeurs réelles à une heure spécifiée .... est exactement ce que je demande. Comment demander explicitement les données du capteur ??


Eh bien, selon Nininho écrivit, cela ne semble pas être possible à Android. Mais puisque vous savez que s'il n'y avait pas d'événement Sensorchanged tiré, il n'y avait pas de changement, vous pouvez simplement utiliser votre vieille valeur. Étant donné que vous avez demandé des données de journal dans des intervalles spécifiques, je ne ferais aucune sortie dans la méthode Onsensorchanged, il suffit de cloner les nouvelles données à votre variable accéléromètreData. Et que de loger la valeur d'accéléromètre data tous les 40 ms. De cette façon, vous enregistrez la valeur réelle toutes les 40 ms même si les données ne changent pas ....


@nurgan: Enfait c'est ce que j'ai fait hier. On dirait que nous sommes tous les deux dans les mêmes lignes :) Pouvez-vous poster cela comme une réponse afin que je puisse l'accepter.


5 Réponses :


3
votes

Vous pouvez modifier l'intervalle en modifiant le délai lors de votre inscription au capteur.

int SENSOR_DELAY_FASTEST    get sensor data as fast as possible 
int SENSOR_DELAY_GAME       rate suitable for games 
int SENSOR_DELAY_NORMAL     rate (default) suitable for screen orientation changes
int SENSOR_DELAY_UI         rate suitable for the user interface


1 commentaires

Je cherche un moyen explicite de demander des données de capteur et non la configuration de la vitesse à laquelle les données du capteur sont rendues à l'utilisateur.



1
votes

Lors de l'enregistrement de votre auditeur avec le sensormanager en utilisant InscriptionLISNER , au lieu des constantes fixes sensor_delay _... Vous pouvez Passez l'intervalle en microsecondes comme décrit dans les Javadocs:

Évaluez les événements du capteur de taux sont livrés à. Ceci n'est qu'une allusion à le système. Les événements peuvent être reçus plus rapidement ou plus lents que le taux. Généralement des événements sont reçus plus rapidement. La valeur doit être l'une des Sensor_delay_normal, sensor_delay_ui, sensor_delay_game, ou Sensor_delay_fastest ou, le délai souhaité entre les événements dans microseconde.

Alors, passe simplement 40000 pour correspondre à votre demande d'exemple, comme indiqué, ce n'est que dans un indice que je ne voudrais donc pas compter sur les valeurs d'intervalles d'intervalle exactes aux microsecondes.


0 commentaires

2
votes

Puisque vous savez que s'il n'y avait pas SensorChanged événement déclenché, il n'y avait pas de changement, vous pouvez simplement utiliser votre ancienne valeur. Comme vous avez demandé des données à des intervalles spécifiques LOG, je ne voudrais pas faire une sortie dans la méthode onSensorChanged seulement clone les nouvelles données à votre variable accelerometerdata. Et que la valeur de log accelerometerdata tous les 40ms. De cette façon, vous connectez la valeur réelle tous les 40ms même si les données na pas le changement ....

Note: Selon Ridcullys, il semble aussi Réponse être possible d'obtenir des données du capteur « livré » à des intervalles de temps de spécifiques. Mais comme il y a un retard sur ces « livraisons », comme toujours avec capteur de données sur Android, avec ma solution, vous serez plus exactement sur l'intervalle 40ms. D'autre part, il pourrait arriver que si les changements de données du capteur dans le moment que vous vous connectez, il peut arriver que vous retardez les nouvelles données pour un intervalle. Et je suppose (pas sûr de ce point) - depuis son à peu près l'exploitation forestière et pas qqch comme « obtenir aussi vite que possible en temps réel », donc ce n'est pas une exigence -. Les causes Timer Solution moins de charge CPU < / p>


2 commentaires

Oui, l'exigence n'est pas de disposer des données du capteur en temps réel et de disposer des données disponibles (pour interrogation) à un taux égal.


J'ai essayé cette solution mais cela n'a pas fonctionné pour moi: \ Les nouveaux threads ont été créés qui enregistre de mauvaises données à des intervalles incorrects. Quelqu'un voudrait-il poster une extrait de code pour cette solution? Merci dans les deux sens :)



0
votes

J'ai essayé de comprendre comment puis-je avoir de très longs retards avec des capteurs, et jusqu'à présent, j'ai réussi. La documentation sur le développeur.Android parle que le délai peut être spécifié dans les microsecondes, ci-dessous est un grand nombre que j'ai essayé: xxx

Cependant, notez le vidage de LogCat ci-dessous - l'Onsensorchanged () - Gets Appelé autant que 4 fois une seconde ... J'essaie de trouver des retards plus importants sans succès jusqu'à présent !!!

01-14 06: 58: 07.088: Capteurs D / IOE (20933 ): Onsensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70 01-14 06: 58: 07.268: Capteurs D / IOE (20933): Onsensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70 01-14 06: 58: 07.448: Capteurs D / IOE (20933): Onsensensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70 01-14 06: 58: 07.628: Capteurs D / IOE (20933): Onsensensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70 01-14 06: 58: 07.808: Capteurs D / IOE (20933): Onsensensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70 01-14 06: 58: 07.989: Capteurs D / IOE (20933): Onsensensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70 01-14 06: 58: 08.169: Capteurs D / IOE (20933): Onsensorchanged appelé, l'événement est: android.hardware.sensorevent@42849f70


0 commentaires

0
votes

Il semble que le taux à laquelle onsensorchanged est appelé doit être l'une des 4 valeurs suggérées.

Ce que vous pouvez faire pour "lectures lentes" est utiliser sensor_delay_ui et (dans Onsensorchanged) mesurent le temps qui s'est passé depuis La dernière fois que vous avez lu la sensordata: xxx

Le seul inconvénient que je vois ici est que la déclaration IF sera appelée plusieurs fois avec un faux résultat.


0 commentaires