2017-09-21 17 views
0

J'espère vraiment que quelqu'un est capable de me aider: Je travaille sur une application Android qui affiche l'angle du téléphone est tenuObtenez angle de téléphone (pas)

J'utilise ce code:

protected void onCreate(Bundle savedInstanceState) 
{ 
mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
} 

protected void onResume() { 
    super.onResume(); 
    mSensorManager.registerListener(this, mAccelerometer,100000); 
    mSensorManager.registerListener(this, mMagnetometer, 100000); 
} 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
    mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
    mMagnetometer = mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); 
    } 

public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
     mGravity = lowPass(event.values.clone(), mGravity); 
    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
     mGeomagnetic = lowPass(event.values.clone(), mGeomagnetic); 
    if (mGravity != null && mGeomagnetic != null) { 


     boolean success = SensorManager.getRotationMatrix(Ra, Ia, mGravity, mGeomagnetic); 
     if (success) { 
      SensorManager.getOrientation(Ra, orientation); 

      float tempxGy = (orientation[0]);// az 
      float tempyGy = (orientation[1]);// pitch 
      float tempzGy = (orientation[2]); //roll 
} 

Im traitant plus loin les valeurs que j'obtiens ici mais ce n'est pas le problème ici.

Lorsque le téléphone est à plat sur la table les valeurs qui ressemblent à:

rouleau -0018

pas 0024

lacet 2,51

qui ressemble bien à moi (aussi si je convertis les valeurs en angles euler)

maintenant imaginez que je prends le téléphone de la table - le bas du téléphone (où le port micro USB est) reste sur la table et je lève le côté avec la caméra

les valeurs du pitch deviennent de plus en plus négatives - jusqu'à ce que le pitch atteigne -1.53 ​​(-90 en euler) dès que cette valeur est atteinte les valeurs augmentent encore et si le téléphone est sur la table avec l'affichage face à la table, la hauteur est de nouveau à 0. Le problème est, que je dois différencier entre les deux valeurs (par exemple -1 et -1

Comment puis-je faire cela? Le rouleau n'est pas un problème que le rouleau a un maximum de 180 degrés et non ce 90 degrés ! .. problème

J'espère vraiment que vous pouvez me aider

+0

J'ai cherché et recherché des heures pour une solution concernant ce sujet et maintenant une solution apparaît simplement dans l'onglet relatif ... https://stackoverflow.com/questions/17747823/android-sensormanager-getorientation-returns-pitch -between-pi-2-and-pi-2 – user9821

Répondre

0

Alors

if(mGravity[2]<0) orientation[1] = (float) (Math.PI + orientation[1]); 

est suffisant pour obtenir des valeurs qui sont comme je les ai besoin --- mais maintenant j'ai un nouveau problème - je voudrais remapper le système de coordonnées, donc je reçois 0 degrés (e uler) lorsque le téléphone est sur la table et +90 si le téléphone est debout sur le port micro usb

J'ai essayé

SensorManager.remapCoordinateSystem(Ra, SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X, Ri); 

mais maintenant le roulis et le tangage sont permutés --- qu'aurais-je faire pour obtenir simplement des valeurs de hauteur positives tant que l'affichage est vers le haut et des valeurs négatives si l'affichage est orienté vers le bas?

Le remappage est-il une mauvaise idée et je pourrais le faire plus simplement en faisant autre chose?

+0

Vous pouvez simplement inverser les valeurs vous-même avec pitch = -pitch; – Flyview