Quelqu'un peut-il aider à éliminer le facteur g des lectures de l'accéléromètre?
J'utilise SensorEventListener avec la méthode onSensorChanged()
pour obtenir les données Sensor.TYPE_ACCELEROMETER. Je n'ai besoin que de valeurs d'accélération pures dans toutes les directions. Donc, quel que soit l'état du périphérique, si celui-ci est stable (ou à vitesse constante), il devrait donner (0.0.0.0.0.0) à peu près.
Actuellement, en fonction de son pas et de son roulis, il me donne une puissance variable en fonction des forces g agissant sur chaque axe.
J'espère qu'il existe une formule pour supprimer cela, car j'obtiens également des valeurs d'orientation (tangage et roulis) de l'écouteur Sensor.TYPE_ORIENTATION. J'en ai utilisé mais ça n'a pas marché.
Vous pouvez utiliser un filtre passe-bas.
Faites ceci pour chacune de vos valeurs de capteur:
g = 0.9 * g + 0.1 * v
Où v
est votre valeur de capteur actuelle et g
est une variable globale initialement définie à zéro. Notez que vous aurez besoin d'autant de variables g que d'axes.
Avec v = v - g
, vous pouvez éliminer le facteur de gravité de la valeur de votre capteur.
Utilisez Sensor.TYPE_LINEAR_ACCELERATION au lieu de Sensor.TYPE_ACCELEROMETER
Jetez un coup d'oeil sur le lien suivant.
http://developer.Android.com/reference/Android/hardware/SensorEvent.html
La différenciation par rapport au temps d'une fonction du temps vous débarrasse des constantes.
Donc, en prenant la dérivée du signal de l'accéléromètre, vous obtenez le "Jerk", que vous pouvez ensuite réintégrer afin d'obtenir la partie non constante de l'accélération que vous recherchez.
En termes simples, prélevez un échantillon de l'accéléromètre toutes les secondes et soustrayez-le de l'échantillon précédent. Si la réponse est (très proche de) zéro, vous n'accélérez pas relativement à la Terre. Si le résultat est non nul, intégrez-le (dans ce cas, multipliez par une seconde), vous avez votre accélération.
Deux choses cependant: - Recherchez le bruit dans le signal, arrondissez votre entrée. -Ne vous attendez pas à des résultats hyper précis des accéléromètres sur puce. Vous pouvez les utiliser pour détecter les tremblements, les changements d'orientation, mais pas vraiment pour savoir le nombre de G que vous rencontrez en effectuant des virages serrés dans votre voiture.
Il suffit de soustraire g (~ 9,8 m/s ^ 2) fois le sens z de la matrice de rotation. Ou pour être plus explicite à ce sujet, laissez
a = your accelerometer reading,
R = your rotation matrix (as a 9-long vector).
Alors ce que tu veux c'est
(a[0]-g*R[6], a[1]-g*R[7], a[2]-g*R[8]).
L'une des méthodes (pour les appareils uniquement avec accéléromètre) consiste à supprimer le vecteur de gravité des données de l'accéléromètre en soustrayant les valeurs qui entreraient dans un cas statique pour une même orientation. Mais comme l'orientation est à nouveau calculée en prenant des lectures d'accélération et non de manière indépendante, ce n'est pas très précis.
Le gyroscope peut aider dans ce cas. Mais peu d'androïdes ont encore un vrai gyroscope. Et utiliser ses lectures brutes n’est pas si simple.
vous devez assumer deux systèmes de coordonnées: 1- système global fixe. 2- Système de coordonnées en mouvement dans lequel l'Origine se déplace et tourne comme le capteur. Dans le système global, g est toujours parallèle à l’axe z, mais pas dans le système en mouvement. il suffit donc de calculer 3 * 3 matrice de rotation à partir d'angles d'orientation ou de lacet, tangage et roulis. (vous pouvez trouver des formules partout). multipliez ensuite cette matrice de rotation par 3 * 1 vecteur d'accélération mesuré par le capteur. cela transformera les coordonnées et déclarera les valeurs dans le système global fixe. la seule chose à faire est de soustraire simplement g de la valeur z.