2012-04-05 17 views
1

現在、私は 'Sensor.TYPE_ORIENTATION'を置き換えようとしています。 したがって、Android Documentationには情報のほとんどが欠けています。ここでSOのデバッグとdiggin中に私はazimuthを計算する方法を考え出しました。これはかつてOrientationSensorによって提供されました。 私はこの方法でそれを実行します。SensorManager.getOrientation()を使用して「ピッチ」と「ロール」を計算する方法

float accelerometerVals[] = new float[3]; 
float magneticVals[] = new float[3]; 

float orientationSensorVals[] = new float[3]; 

float rotationMatrix[] = new float[16]; 
float orientation[] = new float[3]; 

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     switch (event.sensor.getType()) { 
     case Sensor.TYPE_ACCELEROMETER: 
      System.arraycopy(event.values, 0, accelerometerVals, 0, 3); 
      break; 
     case Sensor.TYPE_MAGNETIC_FIELD: 
       System.arraycopy(event.values, 0, magneticVals, 0, 3); 
       break; 
     case Sensor.TYPE_ORIENTATION: 
       System.arraycopy(event.values, 0, orientationSensorVals, 0, 3); 
       break; 
     default: 
       break; 
     } 

     if (null != magneticVals && null != accelerometerVals){ 
      SensorManager.getRotationMatrix(rotationMatrix, null, accelerometerVals, magneticVals) 
      SensorManager.getOrientation(rotationMatrix, orientation); 
      float azimuth = Math.toDegrees(orientation[0]) 
      //this calculation gives me the Azimuth in the same format that OrientationSensor 
      azimuth += (azimuth >= 0) ? 0 : 360 
      float FALSE_PITCH = Math.toDegrees(orientation[1]) 
      float FALSE_ROLL = Math.toDegrees(orientation[2]) 
     }  

注変数は& & FALSE_ROLLをFALSE_PITCH。私はOrientationSensorの中で以前のものと同じ出力を得るために、この値を "正規化"する方法(値は+10から-10まで異なります)を持っていません。

答えて

6

私は同じ問題を抱えていますがあなたのロールが正しくないと私は驚いています。ここに私が使用したものがあります:

//Let values[] be your orientation[] variable once in degrees. 

// Azimuth scaling 
if (values[0]<0) values[0] += 360; 

// Pitch scaling 
if (values[1]<-90) values[1] += (-2*(90+values[1])); 
else if (values[1]>90) values[1] += (2*(90-values[1])); 

// Roll scaling 
// NOT NEEDED 

オリエンテーションセンサーとdegrees orientation []変数の出力をいくつか投稿できますか?

+1

ロールを正規化する必要がない理由を説明してください。 – Matthias

1

多分あなたを助けるでしょう!

SensorManager mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); 
boolean orientok = mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_UI); 

//test if orientation sensor exist on the device 
if (!orientok){ 
     mSensorManager.unregisterListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION)); 
     ((TextView)findViewById(R.id.orient)).setText("no orientation sensor"); 
    } 

public void onSensorChanged(SensorEvent event) { 
    switch(event.sensor.getType()){ 
    case Sensor.TYPE_ORIENTATION: 
     onOrientChanged(event); 
     break; 
        ...// add other sensor type if you want and create for each one his function like the example below 
} 

public void onOrientChanged(SensorEvent event) { 
    float azimuth,pitch,roll; 
    azimuth = event.values[0]; 
    pitch = event.values[1]; 
    roll = event.values[2]; 
    ((TextView)findViewById(R.id.azimuth)).setText("Axe x "+azimuth); 
    ((TextView)findViewById(R.id.pitch)).setText("Axe y "+pitch); 
    ((TextView)findViewById(R.id.roll)).setText("Axe z "+roll); 
} 
+0

TYPE_ORIENTATIONは非推奨です – Puzirki

関連する問題