2017-02-15 6 views
0

Je suis actuellement en train de mettre en œuvre un compteur de vitesse en recevant des données d'orientation de mon téléphone. J'utilisedispositif rotatif constant - comment recevoir des données d'orientation valides?

SensorManager.getRotationMatrix(R, I, gravity, geomagnetic); 
float orientation[] = new float[3]; 
SensorManager.getOrientation(R, orientation); 
float azimuth = orientation[0]; 
double azimuthD = Math.toDegrees(azimuth); 
if(azimuthD < 0) azimuthD = 360 + azimuthD; 

Avec cela, je suis en mesure de recevoir les données de rotation de mon téléphone, comme azimut etc .. Quoi qu'il en soit, cela fonctionne très bien lorsque l'appareil est placé sur une table ou quelque chose. Mais en tournant autour d'un certain point (dans mon cas, l'appareil est fixé sur une roue et tourne à une certaine vitesse), les valeurs sont loin d'être précises. Je crois, puisque j'utilise la gravité et le capteur géomagnétique, il pourrait y avoir un conflit avec les forces qui influencent ces capteurs, tout en tournant. As the wheel turns, the rotation changes relative to a point, but the local device rotation stays the same.

Comment puis-je accéder à l'orientation de l'appareil pendant qu'il tourne sans générer trop de données bruyantes? J'en ai lu au sujet de la propriété "Sensor.TYPE_ROTATION_VECTOR", mais je n'arrivais pas à comprendre comment cela fonctionnait. J'ai aussi lu sur la possibilité de remapper le système de coordination, mais comment cela est-il censé aider, puisque mon téléphone n'est jamais vertical à l'étage plus comme avec un angle de 5 ° -10 °. J'apprécierais toute aide.

Cheers, viehlieb

Répondre

0

Je suppose que je trouve ma réponse. La solution était de jeter tout le code que j'ai posté ci-dessus et d'utiliser le gyroscope, évidemment. Les valeurs du gyroscope mesurent la vitesse angulaire de la rotation du dispositif. Le système de coordonnées utilisé est le système de coordonnées propre aux appareils. Dans mon cas, la valeur pertinente était la rotation autour de l'axe z. Les valeurs sont en radiant par seconde, ce qui peut être mappé à m/s si vous multipliez la circonférence de la roue. Donc, l'astuce est dans la méthode OnSensorChanged:

if(sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE){ 
gyroscope = sensorEvent.values; 
double rotZ = gyroscope[2]; 
double degrees = Math.toDegrees(gyroscope[2]); 
//calculate the speed with circumference = 2.23m 
float speed = (float) degrees/ 360.0f * 2.23f * 3.6f; 
} 

Si maintenant vous souhaitez avoir des valeurs précises, vous pouvez les stocker dans un tableau et calculer la moyenne. N'oubliez pas d'effacer le tableau toutes les 20 fois (ou plus) la méthode onSensorChanged est appelée. Avec SENSOR_DELAY_GAME enregistré, vous disposez de suffisamment de données pour générer la moyenne.