2017-04-14 2 views
0

J'espère que ce n'est pas un doublon que j'ai vu quelques articles connexes sur l'accéléromètre dans Android, mais aucun d'entre eux m'a été utile.Android: calcul de la vitesse incorrecte en utilisant l'accéléromètre

Je dois obtenir la vitesse de l'axe X (seulement) de mon appareil mobile. Le problème est que lorsque je déplace mon appareil en ligne droite (vitesse initiale = 0), je l'accélère d'abord puis décélère (jusqu'à l'arrêt complet) la vitesse calculée que je reçois ne correspond pas à la vitesse réelle.

Le principal symptôme du problème est que, après le dispositif est arrêté, ma vitesse calculée est différente de 0.

Je peux voir l'accélération et la décélération dans les résultats (valeurs de Accel positif au début, puis accélération négative valeurs) mais je pense qu'ils ne sont pas assez précis.

Cela se produit peu importe dans quelle direction je déplace mon appareil (gauche/droite).

Je suppose que ce que je demande est un moyen de faire peut-être le calcul d'une manière plus intelligente qui peut améliorer la précision des résultats ..

Voici mon code onSensorChanged:

public void onSensorChanged(SensorEvent sensorEvent) { 
    if((!isCancelled()) && (this.isConnected)) { 
     if(mode.equals("ac")) { 

      // Getting X acceleration 
      currentAccelX = sensorEvent.values[0]; 

      // Getting current sample timestamp 
      currentTimeStamp = sensorEvent.timestamp; 

      // if first sample then interval = 0 
      if(prevTimeStamp == 0) prevTimeStamp = currentTimeStamp; 

      // calculating interval (in seconds) 
      interval = (currentTimeStamp - prevTimeStamp) * NS2S; 

      // updating prevTimeStamp for next sample.. 
      prevTimeStamp = currentTimeStamp; 

      // My device shows acceleration of about 0.22 when isn't moving at all 
      // so for ignoring this offset: 
      if(Math.abs(currentAccelX) < 0.3) currentAccelX = 0; 


      // Updating the X-axis velocity 
      currentVelocityX += currentAccelX * interval; 

      Log.d(TAG, "ACCEL X IS: " + currentAccelX + " INTERVAL IS: " + interval + " VELOCITY X IS: " + currentVelocityX); }}} 

Voici les résultats (de journal):

ACCEL X IS: 0.0 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.17563461 
ACCEL X IS: 0.5072479 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.17137761 
ACCEL X IS: 1.8605042 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.15576364 
ACCEL X IS: 2.970047 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.130838 
ACCEL X IS: 3.1661987 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.10426621 
ACCEL X IS: 2.5031128 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.083259255 
ACCEL X IS: 1.4252472 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.07129811 
ACCEL X IS: 0.66192627 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.065743 
ACCEL X IS: 0.8834839 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.05832851 
ACCEL X IS: 1.476593 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.045936447 
ACCEL X IS: 2.1182098 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.028159723 
ACCEL X IS: 2.5206451 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.0070056263 
ACCEL X IS: 2.5039368 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.014008248 
ACCEL X IS: 2.0747833 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.03142052 
ACCEL X IS: 1.6359253 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.04514975 
ACCEL X IS: 1.9437103 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.061462015 
ACCEL X IS: 2.5153046 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.08257129 
ACCEL X IS: 2.7262726 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.10545108 
ACCEL X IS: 2.6504364 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.12769443 
ACCEL X IS: 2.7267609 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.15057832 
ACCEL X IS: 3.2504425 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.17785712 
ACCEL X IS: 2.66333 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.20020866 
ACCEL X IS: 1.2032013 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.21030633 
ACCEL X IS: 0.0 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.21030633 
ACCEL X IS: -0.82492065 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.20338333 
ACCEL X IS: -1.1881866 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.19341166 
ACCEL X IS: -1.234375 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.18305238 
ACCEL X IS: -1.1171875 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.17367657 
ACCEL X IS: -0.66615295 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.16808599 
ACCEL X IS: 0.6031494 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.17314783 
ACCEL X IS: 1.6951294 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.18737392 
ACCEL X IS: 2.1244202 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.20520276 
ACCEL X IS: 2.0012054 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.22199754 
ACCEL X IS: 1.7078094 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.23633005 
ACCEL X IS: 1.6888428 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.2505034 
ACCEL X IS: 1.7953186 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.2655703 
ACCEL X IS: 2.3388367 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.2851986 
ACCEL X IS: 3.2739716 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.31267485 
ACCEL X IS: 4.067398 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.3468098 
ACCEL X IS: 4.221344 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.38223672 
ACCEL X IS: 4.281769 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.41817075 
ACCEL X IS: 3.0664673 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.44390556 
ACCEL X IS: 1.0762634 INTERVAL IS: 0.008392333 VELOCITY X IS: 0.45293793 
ACCEL X IS: -0.5091095 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.44866532 
ACCEL X IS: -0.82073975 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.4417774 
ACCEL X IS: 0.5644531 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.4465145 
ACCEL X IS: 3.284546 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.4740795 
ACCEL X IS: 4.3601074 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.51067096 
ACCEL X IS: 4.3199615 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.54692554 
ACCEL X IS: 3.0349426 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.5723958 
ACCEL X IS: 1.763977 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.5871997 
ACCEL X IS: 1.4712982 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.5995473 
ACCEL X IS: 2.1172028 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.6173156 
ACCEL X IS: 2.1423798 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.63529515 
ACCEL X IS: 1.6801605 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.64939564 
ACCEL X IS: 1.8257599 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.66471803 
ACCEL X IS: 1.8712311 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.680422 
ACCEL X IS: 2.1062775 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.6980986 
ACCEL X IS: 2.054016 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.71533656 
ACCEL X IS: 0.0 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.71533656 
ACCEL X IS: -2.2228088 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.696682 
ACCEL X IS: -2.936676 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.6720364 
ACCEL X IS: -3.1568298 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.6455432 
ACCEL X IS: -2.484604 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.6246916 
ACCEL X IS: -2.213089 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.6061186 
ACCEL X IS: -1.923996 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.5899718 
ACCEL X IS: -2.902832 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.56561023 
ACCEL X IS: -5.460327 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.51978534 
ACCEL X IS: -7.1407623 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.45985767 
ACCEL X IS: -8.03479 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.39242703 
ACCEL X IS: -8.921448 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.31755525 
ACCEL X IS: -10.293076 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.23117232 
ACCEL X IS: -11.660858 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.1333105 
ACCEL X IS: -12.821564 INTERVAL IS: 0.008392334 VELOCITY X IS: 0.025707655 
ACCEL X IS: -12.108749 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.07591301 
ACCEL X IS: -9.302032 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.15397877 
ACCEL X IS: -5.889694 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.20340705 
ACCEL X IS: -3.0645447 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.22912574 
ACCEL X IS: -1.2965088 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.24000648 
ACCEL X IS: -0.36557007 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.24307446 
ACCEL X IS: 0.0 INTERVAL IS: 0.008392334 VELOCITY X IS: -0.24307446 

* S'il vous plaît noter que la vitesse initiale dans le journal est différent de 0 (mais -0,17563461) en raison de certaines erreurs de capteurs qui causent « faux » les valeurs d'accélération lorsque le téléphone ne bouge pas.

Merci beaucoup.

+0

@creativecreatoraybayot Le problème: vitesse calculée! = Vitesse réelle. – Noam

Répondre

1

Je pense que vous devriez utiliser l'accélération linéaire du capteur fourni par API Android:

https://developer.android.com/reference/android/hardware/Sensor.html#TYPE_LINEAR_ACCELERATION

Il semble correspondre parfaitement à vos besoins

EDIT: Pour faire face à problème de précision, vous pouvez essayez d'effectuer un calibrage manuel (le téléphone doit être à plat sur une table et la mesure doit être stable) pour supprimer le décalage. Regardez ici pour plus de détails (surtout la fin): https://electronics.stackexchange.com/a/33387

Mais vous devez également garder à l'esprit que les capteurs ne sont pas parfaits surtout dans les téléphones et c'est pourquoi il est peut-être impossible d'obtenir la précision que vous voulez avec certains capteurs de téléphone. La solution consiste à adapter vos traitements algorithmiques à la précision délivrée par le capteur, soit pour effectuer la fusion du capteur (avec gyroscope par exemple).

+0

vous avez raison, je suis passé à 'TYPE_LINEAR_ACCELERATION' mais les résultats sont encore assez imprécis. Je pense que si je pouvais corriger le décalage qui existe quand le téléphone ne bouge pas du tout (environ 0,2 - 0,3) alors cela pourrait résoudre mon problème ... de quelque façon que ce soit? Merci – Noam

+0

Je viens d'éditer pour votre problème de précision, j'espère que cela aidera. – Kerat

+0

Merci, je vais essayer cette méthode d'étalonnage. Peu importe, pouvez-vous élaborer sur cette chose de fusion de capteur? – Noam