2012-04-05 2 views
1

현재 'Sensor.TYPE_ORIENTATION'이 (가) 사용되지 않으므로 대신 교체하려고합니다. 그래서 Android Documentation에는 정보의 대부분이 부족합니다. 디버깅과 여기에 SO에 diggin 동안 나는 한 번 OrientationSensor에 의해 제공된 azimuth을 계산하는 방법을 알아 냈습니다. 나는이 방법으로 수행SensorManager.getOrientation()을 사용하여 "Pitch"및 "Roll"을 계산하는 방법

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. 나는 오리엔테이션 센서 내에서 이전과 같은 출력을 얻기 위해이 값을 "정상화"(값이 +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 

오리엔테이션 센서와 학위 오리엔테이션 [] 변수의 일부 출력을 게시 할 수 있습니까?

+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

관련 문제