2012-07-13 38 views
1

我有一個有趣的問題。我試圖追蹤用戶手機的角度,無論他們是否將其放在橫向或縱向或任何其中的任何位置。以地平線爲軸確定設備的角度-android

我目前正在使用SENSOR_ORIENTATION並獲取YAW,ROLL和Pitch。我也試圖讓用戶的角度看,使用偏航z軸端口,爲用戶卷糾正(風景,人像,或在兩者之間),我做了一些簡單的數學..:

double roll = phoneOri.getRoll(); 
double yaw = phoneOri.getYaw()+roll; 

    if (yaw>=360){ 
       yaw = (yaw - 360); 
      } 
      if (yaw<0){ 
       yaw = (yaw+360);  
      } 

這個代碼糾正偏航,並給我適當的角度,無論輥位置是什麼..
但這種數學似乎不正確的瀝青。如果我將手機垂直放在地板上,無論是翻滾還是偏航,我總是希望得到0的音高,如果我直接面對電話的背面直到天空,並且平行於地面,我希望得到90,然後回到地面-90;

這裏是我如何得到俯仰滾轉和偏航:

double yaw; 
    double pitch; 
    double roll; 

public void onSensorChanged(SensorEvent evt) { 
      int type=evt.sensor.getType(); 
      if(type == Sensor.TYPE_ORIENTATION){ 
       yaw = evt.values[0]; 
       pitch = evt.values[1]; 
       roll = evt.values[2]; 
      } 
      if (type == Sensor.TYPE_MAGNETIC_FIELD) { 
       orientation[0]=(orientation[0]*1+evt.values[0])*0.5f; 
       orientation[1]=(orientation[1]*1+evt.values[1])*0.5f; 
       orientation[2]=(orientation[2]*1+evt.values[2])*0.5f; 
      } else if (type == Sensor.TYPE_ACCELEROMETER) { 
       acceleration[0]=(acceleration[0]*2+evt.values[0])*0.33334f; 
       acceleration[1]=(acceleration[1]*2+evt.values[1])*0.33334f; 
       acceleration[2]=(acceleration[2]*2+evt.values[2])*0.33334f; 
      } 
      if ((type==Sensor.TYPE_MAGNETIC_FIELD) || (type==Sensor.TYPE_ACCELEROMETER)) { 
       float newMat[]=new float[16]; 

       //Toast toast = Toast.makeText(ctx.getApplicationContext(), "accel", Toast.LENGTH_SHORT); 
       //toast.show(); 
       SensorManager.getRotationMatrix(newMat, null, acceleration, orientation); 
       if(displayOri==0||displayOri==2){ 
        SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_X*-1, SensorManager.AXIS_MINUS_Y*-1,newMat); 
       }else{ 
        SensorManager.remapCoordinateSystem(newMat,SensorManager.AXIS_Y, SensorManager.AXIS_MINUS_X,newMat); 
       } 

       matrix=newMat; 
       SensorManager.getOrientation (newMat, orientationValues); 
      } 
     } 

目前我得到如下結果:

間距= -90卷= ;

enter image description here

間距= 輥= ;

enter image description here

間距= 輥= -20;

enter image description here

間距= 輥= -90;

我想在這些位置的任何位置得到0的間距,然後當用戶在HORIZON軸上傾斜手機時分別得到-90和90之間的音高?

什麼想法?噢,我要補充一點,我的應用程序被鎖定爲橫向模式..

回答

-1

有趣的問題,

你試圖獲得絕對X,Y和Z值(不考慮電話的方位)提到here ,使用,則應該得到你正在尋找

公共抽象無效onSensorChanged絕對y值(INT傳感器,浮動[]值)

>重要提示:該軸被交換時d evice的屏幕 方向更改。要訪問未剪切的值,請在值[]中使用索引3,4 和5。

+0

我很困惑如何實際得到這些?那是什麼傳感器類型? Sensor_ORIENTATION並沒有達到[5]它停在[2]更多的東西給了我一個錯誤.. 我正在更新我的代碼,告訴你我的整個傳感器更改方法.. – erik 2012-07-13 19:36:46

+0

有沒有辦法得到那些據我所知 – erik 2012-07-14 22:12:27

1

那些常數可能有相干誤差。嘗試使用數學函數,而不是...

+0

你說什麼常數? – erik 2012-07-18 12:34:03

相關問題