Android TYPE_LINEAR_ACCELERATION capteur - que fait-il?

Je développe une application pour la voiture de l'accélération de suivi. J'ai utilisé la norme de l'accéléromètre, de procéder à l'étalonnage en position spécifique à l'avance.

Ensuite, en supposant orientation du téléphone est de ne pas changer, j'ai enregistré les données de l'accéléromètre pour une durée déterminée et calculée déplacer les paramètres, dont l'un est la vitesse de la voiture à la fin de l'essai.

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

Mais ensuite, j'ai trouvé que dans l'API de niveau 10 il y a un capteur virtuel appelé TYPE_LINEAR_ACCELERATION et, comme je le comprends, il doit faire ce dont j'ai besoin: filtre à gravité, les changements d'orientation - afin que je puisse l'utiliser et obtenir pur accélération linéaire 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 lorsque j'ai analysé les données de vidage, le calcul de 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 de type de Capteur de TYPE_ACCELEROMETER, l'étalonnage et à l'aide de la même formule pour calculer la vitesse - je obtenir de bons résultats, beaucoup plus proche de la réalité.

Donc, la question est:

Ce n' Sensor.TYPE_LINEAR_ACCELERATION vraiment montrer?

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

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

  • Très intéressant!!! Le Capteur.TYPE_LINEAR_ACCELERATION fait exactement ce que vous écrivez. Pourquoi avez-vous calculer la longueur de l'accélération (SQRT (xx+yy+z*z)? Comment avez-vous testé votre méthode précédente? Juste quelques mesures? Ce que je trouve vraiment intéressant, c'est que votre méthode précédente produit d'assez précise des résultats. Ces capteurs peuvent piste de vitesse pour moins d'une seconde, c'est pourquoi je suis surpris. Même si c'est pour la position, la vitesse n'est pas mieux, voir link.
  • Salut. Si le capteur indique une accélération en x,y,z les directions, alors la valeur de A est SQRT(xx+yy+z*z). Si le capteur montre quelque chose d'autre - c'est la question. ce qu'il montre?
  • Si le capteur montre quelque chose d'autre - c'est la question. ce qu'il montre? Ma méthode précédente a été testé de nombreuses fois, avec des vitesses différentes. Dans la voiture, où la position du téléphone est bien fixe, il fonctionne plutôt précis, il ne donnez JAMAIS d'erreur de plus de 10%. C'est un résultat, je pense. C'est pourquoi je ne comprends pas, pourquoi accéléromètre linéaire se comporte de manière étrange... Si vous êtes intéressé, je peux vous envoyer le code source de la méthode de travail.
  • Vous l'avez compris accélération linéaire correctement, c'est exactement ce que vous avez écrit. Je ne comprends toujours pas pourquoi vous avez besoin de SQRT(xx+yy+z*z). Veuillez consulter mon code, à partir de lignes 134 et 148, v0 est la vitesse initiale, v est la vitesse. taille de l'accélération n'est jamais nécessaire pour calculer la vitesse, donc merci de poster votre code indiquant pourquoi vous l'utilisez.
  • merci pour votre code. "longueur" de l'accélération est la valeur de l'accélération elle-même. ainsi, le calcul de la vitesse sans être intéressé par les directions c'est à la nécessite de la valeur de l'accélération. Si j'ai le vecteur d'accélération (1,5,4), v0 = 0, t = 1 seconde, v = 0+6.48 = 6.48 m/s. Vx = 1m/s, Vy=5 m/s, Vz = 4 m/s, |v| = 6,48 m/s
  • voici une partie du code, il cannon être très utiles <code>private void calcul(){ //averagePoint la moyenne de l'accélération de l'expérience de l'accélération = ce.xaveragePoint.getX() + ce.yaveragePoint.getY() + ce.zaveragePoint.getZ(); accélération = accélération / ((float)Math.sqrt(averagePoint.getForce())); float t = ((float)intervalle / 1000f); speedAfter = speedBefore + accélération * t; distance = speedBeforet + accelerationtt/2; }</code>
  • DÉSOLÉ, je ne comprends pas encore, comment marquer le code en commentaire:
  • Voici mon code, qui fonctionne avec TYPE_ACCELEROMETER capteur maephv.blogspot.com/2011/10/...
  • Vous avez besoin de l'accélération vector dans le calcul et non pas sa longueur. Imaginez la suite: la voiture accélère avec 1m/s^2 pour 1, puis avec -1m/s^2 pour 1 (décélération). Le changement de vitesse est nulle, cependant si vous utilisez la longueur de l'accélération, alors vous calculer quelque chose d'autre. En d'autres termes: si vous utilisez seulement la longueur, alors vous ne pouvez pas distinguer l'accélération de la décélération, par exemple. J'ai eu un rapide coup d'oeil à ton code, mais je n'ai pas réussi à comprendre ce qu'il se passe.
  • Ali, dans mon programme, j'calculer la projection du vecteur vecteur moyen, et il est signé. Alors, dans ce cas, il fonctionne correctement. De toute façon, j'ai testé linear_accelerometer linéaire, constante accélération déplacement - pas de résultat. Mon code avec type_accelerometer fonctionne très bien
  • OK, mon erreur, je n'ai pas compris cette partie, désolé.
  • Merci en tout cas..nous allons attendre la nouvelle Android, peut-être qu'ils y remédier:)
  • Voici ce que j'ai remarqué en essayant d'utiliser TYPE_LINEAR_ACCELERATION. Quand j'ai tourner l'appareil autour d'un axe, l'accélération de la composante qui est la plus affectée par la rotation ne semble pas bien la différence entre l'accélération et la décélération. Par exemple, je vais voir la composante X de l'accélération de commencer autour de zéro, 2 ou 3, puis diminuer à zéro quand j'ai arrêter la rotation. J'attendrais la composante X de l'augmentation, le pic, la diminution de retour à zéro et aller négative, en pointe dans la direction négative, et enfin de retour à zéro quand j'ai arrêter la rotation.
  • Désolé @Maep je n'ai pas votre explication de la différenciation de l'accélération de la décélération. "dans mon programme, j'calculer la projection du vecteur vecteur moyen, et il est signé". Pouvez-vous élaborer sur elle plus s'il vous plaît
  • u peut pls partager mathemathical code pour calculer la distance à l'aide de l'accéléromètre ???

InformationsquelleAutor Maep | 2011-10-22