2015-04-23 3 views
1

Я пытаюсь получить значение для заголовка пользователя на телефоне Android, используя только датчики акселерометра и магнитометра. Я просматривал множество других решений, но при попытке реализовать свой собственный код возникают некоторые проблемы.Получение заголовка пользователя с использованием акселерометра и магнитометра

Вот код:

if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){ 
    Log.d("MAG_FIELD", "ITS A MAG FIELD"); 

     //aX, aY, aZ are raw accelerometer values 
     float aTheta = (float) Math.atan2(-aX, aZ); 
     float aPhi = (float) Math.atan2(-aY, aZ); 

     //Obtaining the current magnetometer readings 
     float mDegX = event.values[0]; 
     float mDegY = event.values[1]; 
     float mDegZ = event.values[2]; 

     float rotationVectorX = (float) ((mDegX * Math.cos(aPhi)) + (mDegY *Math.sin(aTheta) * Math.sin(aPhi)) - (mDegZ * Math.cos(aTheta) * Math.sin(aPhi))); 
     float rotationVectorY = (float) ((mDegY * Math.cos(aTheta)) + (mDegZ * Math.sin(aTheta))); 

     //HEADING calculation 

     float heading = (float) Math.abs(Math.toDegrees(Math.atan(rotationVectorY /rotationVectorX))); 

     if(rotationVectorX >= 0.0f && rotationVectorY >=0.0f) {} 
     else if(rotationVectorX < 0.0f && rotationVectorY >= 0.0f) {heading = 180 - heading ;} 
     else if(rotationVectorX < 0.0f && rotationVectorY < 0.0f) {heading = 180 + heading;} 
     else if(rotationVectorX >= 0.0f && rotationVectorY < 0.0f){heading = 360 - heading;} 

Мои проблемы являются:

  1. Заголовок постоянно от около 90 градусов, когда устройство плоская
  2. изменения заголовков, когда экран изменяется от плоской поверхности - мне нужно, чтобы это было то же самое

ответ

0

Использование магнитометра и акселерометра Вы можете найти заголовок устройства в реальном времени. Это работает, даже если ваше устройство не находится на ровной поверхности.

if (event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD) { 
      geomag[0]=event.values[0]; 
      geomag[1]=event.values[1]; 
      geomag[2]=event.values[2]; 
     } 

if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER) { 
      float alpha = 0.8f; 

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];    
     } 

      rotationMatrix = new float[16]; 
      SensorManager.getRotationMatrix(rotationMatrix, null, gravity, geomag); 
      SensorManager.getOrientation(rotationMatrix,vals); 

      double Heading=vals[0] * (180/Math.PI); 
Смежные вопросы