web-dev-qa-db-fra.com

Android TYPE_LINEAR_ACCELERATION - que montre-t-il?

Je développe une application pour le suivi de l'accélération des voitures. J'ai utilisé un accéléromètre standard, en l'étalonnant dans une position spécifique au préalable.

Ensuite, en supposant que l'orientation du téléphone ne change pas, j'ai enregistré les données de l'accéléromètre pendant un temps spécifié et calculé les paramètres de déplacement, dont l'un est la vitesse de la voiture à la fin du test.

Cela fonctionne plutôt bien, sur une route droite et horizontale: erreur de quelques pour cent.

Mais j'ai découvert que dans le niveau 10 de l'API, il existe un capteur virtuel appelé TYPE_LINEAR_ACCELERATION Et, pour autant que je sache, il doit faire ce dont j'ai besoin: gravité du filtre, changements d'orientation - donc je peux l'utiliser et obtenez une accélération linéaire pure de l'appareil mobile.

MAIS dans la vraie vie ..

J'ai fait une application simple, qui fait un petit test:

//public class Accelerometer implements SensorEventListener { ...
public void onSensorChanged(SensorEvent se) 
{
    if(!active)
        return;

    lastX = se.values[SensorManager.DATA_X];
    lastY = se.values[SensorManager.DATA_Y];
    lastZ = se.values[SensorManager.DATA_Z];
    long now = System.currentTimeMillis();
    interval = now - lastEvetn;
    lastEvetn = now;
    out.write(Float.toString(lastX) + ";" + 
                    Float.toString(lastY) + ";" + 
                    Float.toString(lastZ) + ";" + 
                    Long.toString(interval) + "\n");
}

Je lie un écouteur avec les paramètres suivants:

  mSensorManager.registerListener(linAcc,
                mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
                SensorManager.SENSOR_DELAY_GAME);

Cela fonctionne bien, mais lorsque j'ai analysé le vidage des données, le calcul de la vitesse comme V = V0 + AT, Où V0 = 0 Au début, puis - la vitesse de l'intervalle avant cela, A = acceleration (SQRT (x*x+y*y+z*z)) (t = temps d'intervalle), finalement j'obtiens une vitesse très basse - trois fois moins que la vitesse réelle.

Changer le type de capteur en TYPE_ACCELEROMETER, Calibrer et utiliser la même formule pour calculer la vitesse - j'obtiens de bons résultats, beaucoup plus proches de la réalité.

Donc, la question est:

Qu'est-ce que Sensor.TYPE_LINEAR_ACCELERATION Montre vraiment?

Où ai-je tort ou est-ce que quelque chose ne va pas avec la mise en œuvre de Sensor.TYPE_LINEAR_ACCELERATION?

J'ai utilisé le téléphone Samsung Nexus S.

35
Maep

Question très intéressante !!!!

Je développe quelque chose de similaire à votre application. Ce que j'ai trouvé sur TYPE_LINEAR_ACCELERATION ne me satisfait pas.

1) TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, ecc sont implémentés uniquement pour Android 2.3 (et versions ultérieures). J'ai donc Android 2.2 et je ne peux pas les tester.

2) TYPE_LINEAR_ACCELERATION n'est pas aussi précis qu'il le serait, car il existe un problème simple lors de la soustraction de la gravité. En fait, c'est une "fusion de capteurs" qui utilise l'accéléromètre et l'orientation pour savoir où est dirigée la gravité puis les sous-marins. il.

Ici, j'ai trouvé une réponse très utile qui l'explique:

https://groups.google.com/forum/#!topic/Android-developers/GOm9yhTFZaM

TYPE_ACCELEROMETER utilise l'accéléromètre et uniquement l'accéléromètre. Il renvoie les événements accélérométriques bruts, avec un traitement minimal ou nul.

TYPE_GYROSCOPE (si présent) utilise le gyroscope et uniquement le gyroscope. Comme ci-dessus, il renvoie des événements bruts (vitesse angulaire un rad/s) sans aucun traitement (pas de compensation de décalage/échelle).

TYPE_ORIENTATION est déconseillé. Il renvoie l'orientation en lacet/tangage/roulis en degrés. Ce n'est pas très bien défini et ne peut être invoqué que lorsque l'appareil n'a pas de "roll". Ce capteur utilise une combinaison de l'accéléromètre et du magnétomètre. Des résultats légèrement meilleurs peuvent être obtenus en utilisant les assistants de SensorManager. Ce capteur est fortement "traité".

TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_ROTATION_VECTOR sont des capteurs "fusionnés" qui renvoient respectivement le vecteur d'accélération linéaire, de gravité et de rotation (un quaternion). Il n'est pas défini comment ceux-ci sont mis en œuvre. Sur certains appareils, ils sont implémentés en h/w, sur certains appareils, ils utilisent l'accéléromètre + le magnétomètre, sur certains autres appareils, ils utilisent le gyroscope.

Sur Nexus S et Xoom, le gyroscope n'est actuellement PAS utilisé. Ils se comportent comme s'il n'y avait pas de gyroscope disponible, comme sur Nexus One ou Droid. Nous prévoyons d'améliorer cette situation dans une prochaine version.

Actuellement, la seule façon de profiter du gyroscope est d'utiliser TYPE_GYROSCOPE et d'intégrer la sortie à la main.

J'espère que ça aide,

Mathias

Quoi qu'il en soit, à divers endroits sur le Web, je n'ai trouvé aucun meilleur mot sur les capteurs de téléphone et leur potentiel, car ils ne sont pas précis ...

Un peu plus de précision peut être atteinte en utilisant le filtre de Kalman, mais je ne sais pas comment ...

20
Lork

Je me rends compte que ma réponse est assez tardive. J'ai croisé ce fil en cherchant des informations sur TYPE_LINEAR_ACCELERATION.

Il n'est pas juste de faire a = sqrt (ax ^ 2 + ay ^ 2 + az ^ 2) puis de faire v = u + a t. Cela ne fonctionnera que lorsque v et a seront exactement dans la même direction. . Et tout écart entraînerait l'addition des erreurs. L'accélération et la vitesse sont des quantités vectorielles et doivent être traitées comme telles. Vous devez faire vx = ux + ax t, vy = uy + ay t et vz = uz + az t. puis v = sqrt (vx ^ 2 + vy ^ 2 + vz ^ 2).

5
sudP

TYPE_LINEAR_ACCELERATION n'affiche pas les données "brutes" du capteur, il montre les données qui ont été traitées par un filtre haute fréquence, donc l'accélération constante comme la gravité ou toute autre accélération changeant lentement ne peut pas traverser le filtre.

Votre voiture a une accélération assez constante qui ne peut pas passer le filtre. Si vous modifiez votre accélération très rapidement en appuyant sur les freins, puis en appuyant sur la pédale d'accéléromètre puis en revenant sur les freins, alors TYPE_LINEAR_ACCELERATION afficherait le résultat assez correct, sinon il affiche toujours moins que la valeur réelle d'accélération.

Utilisez TYPE_ACCELEROMETER, puis supprimez G (9.81) manuellement. En fait, vous devez mesurer G vous-même lorsque l'accélération réelle est 0, puis utiliser la valeur TYPE_ACCELEROMETER comme G. Dans mon cas, c'est 9,6.

TYPE_ACCELEROMETER est bon pour l'accélération à changement rapide qui dure moins de 1 seconde, comme déplacer votre main en émulant une boîte ou un combat à l'épée.

4
Dmitry

TYPE_LINEAR_ACCELERATION est un vecteur tridimensionnel indiquant l'accélération le long de chaque axe de l'appareil, sans compter la gravité. TYPE_ACCELEROMETER = TYPE_GRAVITY + TYPE_LINEAR_ACCELERATION

2
Evgeny Karpov

Vous devez multiplier votre vecteur absolu obtenu à partir de TYPE_LINEAR_ACCELERATION par la matrice inversée de TYPE_ROTATION_VECTOR.

0
thxmxx