1

기기의 방향 (방위각, 피치 및 롤)을 확인해야하는 앱을 설계하고 있습니다. 나는 이것을 달성하기 위해 다음 코드를 사용 Android SensorManager.getOrientation()은 -PI/2와 PI/2 사이의 피치를 반환합니다.

@Override 
public void onSensorChanged(SensorEvent event) { 
    if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
     gravityMatrix = event.values.clone();// Fill gravityMatrix with accelerometer values 
    else if(event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
     geomagneticMatrix = event.values.clone();// Fill geomagneticMatrix with magnetic-field sensor values 
    if(gravityMatrix != null && geomagneticMatrix != null){ 
     RMatrix = new float[16]; 
     IMatrix = new float[16]; 

     SensorManager.getRotationMatrix(RMatrix, IMatrix, gravityMatrix, geomagneticMatrix);// Retrieve RMatrix, necessary for the getOrientation method 
     SensorManager.getOrientation(RMatrix, orientation);// Get the current orientation of the device 
    } 
} 

은 지금은 '취향'플로트 []에서 방위각, 피치와 롤의 값을 얻을 수 있어요. 모든 것이 방위각과 롤 값 (정확한 각도를 반환 함)에 대해서는 문제가 없지만, 피치 값 (방향 [1])을 인쇄 할 때 항상 PI/2와 -PI/2 사이의 각도를 검색합니다. 왜 그런지 모르겠다 고요? PI/2보다 큰 각도 또는 -PI/2보다 작은 각도를 검색 할 수 없습니다. 각도가 +/- PI/2이고 기기를 계속 회전하면 (Samsung Galaxy S2) PI/2 값에 도달 한 후 갑자기 각도가 감소합니다.

피치 각이 너무 드문 이유는 누구에게 설명 할 수 있습니까? 사전에

감사합니다!

답변

5

피치 그래서 asin-PI/2PI/2 사이에 값을 취할 수 있으며, arcsin 기능의 범위이다 [-PI/2, PI/2]pitch = (float) Math.asin(-RMatrix[7]); 같이 계산된다.

+0

오케, 정말 고마워. 그 말이 정말 합리적입니다. 나는 그 사실을 몰랐습니다. 그러나 나는 같은 피치를 가진이 두 방향의 차이점을 알아야합니다. 그래서 방위각 값을 사용할 것입니다. 장치가 X 축을 통해 계속 회전 할 때 음수에서 양수로 변경됩니다. 그게 효과가 있다면 알려 드리겠습니다. – user1176420

+0

해결책을 찾았습니다! 사실 매우 간단합니다 : 'if (gravityMatrix [2] <0) \t \t \t \t orientation [1] = (float) (Math.PI - orientation [1]); 장치가 X 축으로 계속 회전 할 때 z 축상의 중력이 양수에서 음수로 변경되기 때문에 작동합니다. 이렇게 올바른 피치 (0과 PI, 0 및 -PI 사이의 값)를 반환합니다. 설명해 주셔서 감사합니다! 내 소니 Xperia Z5P에 – user1176420

+0

, 피치에 대한, - 0 (테이블에 플랫)에서 -90 (일어 서서)와 다시 -0 (테이블에 페이스 다운)의 값 범위를보고 있었으므로 나는 아무 것도 할 수 없었습니다 위아래로 무엇인지 아는 것! 이 픽스를 통해 사용자가 위 또는 아래를보고 있는지 여부를 앱에서 최종 결정할 수 있습니다. 바라건대 이것은 하드웨어에만 국한된 것은 아닙니다! –

관련 문제