Capteur d'accélération linéaire de type Android - que montre-t-il?

je développe une application pour le suivi de l'accélération des voitures. J'ai utilisé l'accéléromètre standard, Je l'ai calibré dans une position précise avant.

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

il fonctionne assez bien, sur une route droite, horizontale: erreur de quelques pour cent.

mais j'ai découvert, que dans API-Niveau 10 Il y a un capteur virtuel appelé <!-Pour autant que je sache, il doit faire ce dont j'ai besoin: filtrer la gravité, changer l'orientation - pour que je puisse l'utiliser et obtenir 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");
}

j'associe un écouteur avec les paramètres suivants:

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

cela fonctionne bien, mais quand j'ai analysé le dump de données, calculant la vitesse comme V = V0 + AT, où V0 = 0 d'abord, puis, - la vitesse de l'intervalle de avant cette, A = acceleration (SQRT (x*x+y*y+z*z)) (t = temps d'intervalle), j'ai finalement d'obtenir une très faible vitesse - trois fois moins que la vitesse réelle.

changement du type de capteur en TYPE_ACCELEROMETER, calibrage et utilisation de la même formule pour calculer la vitesse - j'obtiens de bons résultats, beaucoup plus proche de la réalité.

alors, la question Est:

Que Sensor.TYPE_LINEAR_ACCELERATION vraiment?

Où je me trompe, ou est quelque chose de mal avec Sensor.TYPE_LINEAR_ACCELERATION la mise en œuvre?

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

34
demandé sur MasterAM 2011-10-22 14:07:09

4 réponses

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 plaît pas.

1) TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, ecc are implemented only for Android 2.3 (and up) Donc J'ai 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 y a un simple problème lors de la soustraire à la gravité. En fait, est un "capteur de fusion " qui utilise l'accéléromètre et l'orientation pour savoir où est dirigée la pesanteur, puis se soumet. 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 seulement de l'accéléromètre. Il renvoie les événements d'accéléromètre bruts, avec un traitement minimal ou Aucun à tout.

TYPE_GYROSCOPE (si présent) utilise le gyroscope et seulement le gyroscope. Comme ci-dessus, il renvoie les événements bruts (vitesse angulaire un rad / s) avec no traitement du tout (pas de compensation offset / scale).

TYPE_ORIENTATION est obsolète. Il renvoie l'orientation en lacet/ pitch/roll en degrés. Ce n'est pas très bien défini et ne peut être invoqué lorsque l'appareil n'a pas de "rouleau". Ce capteur utilise un la combinaison de l'accéléromètre et le magnétomètre. Marginalement de meilleurs résultats peuvent être obtenus en utilisant les helpers de SensorManager. Ce le capteur est fortement "traité".

TYPE_LINEAR_ACCELERATION, TYPE_GRAVITY, TYPE_PROTATION_VECTOR sont "fusionné" capteurs qui renvoient respectivement l'accélération linéaire, vecteur de gravité et de rotation (un quaternion). Il n'est pas défini comment ils sont mis en oeuvre. 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 qu'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 gyro disponible, comme sur Nexus One ou Droid. Nous sommes rabotage pour améliorer cette situation dans une version future.

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

j'espère que cette aide,

Mathias

quoi qu'il en soit, à divers endroits sur le web, Je n'ai pas trouvé de meilleur mot sur les capteurs téléphoniques et leur potentiel, en raison du fait qui ne sont pas précis...

on peut atteindre un peu plus de précision en utilisant le filtre de Kalman, mais je ne sais pas comment...

20
répondu Lork 2015-11-13 17:10:26

je me rends compte que ma réponse est assez fin. Je suis tombé sur ce fil en cherchant des infos sur TYPE_LINEAR_ACCELERATION.

il n'est pas juste de faire a = sqrt(ax^2+ay^2+az^2) et ensuite do v=u+a T. Cela ne fonctionnera que si v et a sont exactement dans la même direction. Et toute déviation ferait que les erreurs s'additionnent. L'accélération et la vitesse sont des quantités vectorielles et doivent être traitées comme telles. Vous devriez faire vx=ux+ax t, vy = uy+ay t et vz = uz+azt. et puis v= sqrt (vx^2+vy^2+vz^2).

5
répondu sudP 2015-11-14 11:27:40

TYPE_LINEAR_ACCELERATION ne montre pas les données "brutes" du capteur, il montre des données qui ont été traitées par un filtre haute fréquence, de sorte que l'accélération constante comme la gravité ou toute autre accélération changeant lentement ne peut pas passer à travers le filtre.

votre voiture a une accélération assez constante qui ne peut pas passer le filtre. Si vous changez votre accélération en appuyant très vite sur les freins, puis en appuyant sur la pédale de l'accéléromètre, puis de nouveau sur les freins, puis TAPE_LINEAR_ACCELERATION montrerait le résultat assez correct, sinon il montre toujours moins que la valeur d'accélération réelle.

utilisez TYPE_ACCELEROMETER puis supprimez manuellement G (9.81). En fait, vous devez mesurer G vous-même quand l'accélération réelle est 0 et ensuite utiliser la valeur de 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 d'une seconde comme vous déplacer la main émulant une boîte ou le combat à l'épée.

3
répondu Dmitry 2015-06-28 18:07:33

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

2
répondu Evgeny Karpov 2015-02-21 22:21:55