2013-05-26 15 views
6

Chciałbym wiedzieć, jak prawidłowo wykorzystać wyjście z "czujnika ruchu obrotowego". Obecnie wymyśliłem poniższe i chciałem obliczyć odchylenie i skok od result[], aby wiedzieć, gdzie znajduje się urządzenie (leżące w trybie poziomym). Ale mam problem z wynikami. Obliczenia odchylenia są dość precyzyjne, ale nachylenie zachowuje się dziwnie. Może każdy może wskazać mi właściwy kierunek, w jaki sposób korzystać z danych. Chciałbym również wiedzieć, czy orientacja urządzenia (krajobraz lub portret) ma wpływ na wyjście tego czujnika. Z góry dziękuję.Używanie czujnika wektora obrotu

private double max = Math.PI/2 - 0.01; 
private double min = -max; 

private float[] rotationVectorAction(float[] values) { 
    float[] result = new float[3]; 
    float vec[] = values; 
    float quat[] = new float[4]; 
    float[] orientation = new float[3]; 
    SensorManager.getQuaternionFromVector(quat, vec); 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, quat); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; 
    result[1] = (float) orientation[1]; 
    result[2] = (float) orientation[2];  
    return result; 
} 

private void main() { 
    float[] result = rotationVectorAction(sensorInput); 
    yaw = result[0]; 
    pitch = result[1]; 
    pitch = (float) Math.max(min, pitch); 
    pitch = (float) Math.min(max, pitch); 
    float dx = (float) (Math.sin(yaw) * (-Math.cos(pitch))); 
    float dy = (float) Math.sin(pitch); 
    float dz = (float) (Math.cos(yaw) * Math.cos(pitch)); 
} 

A w OpenGL ES 2.0 ustawić, aby przesunąć aparat wokół:

Matrix.setLookAtM(mVMatrix, 0, 0, 0, 0, dx, dy, dz, 0, 1, 0); 

Odpowiedz

4

Wreszcie sam to rozwiązałem. Przyczyną nieprawidłowego działania pitch była różnica pomiędzy WEJŚCIEM a WYJŚCIEM z SensorManager.getQuaternionFromVector(quat, vec);. Metoda oczekuje, że wektor vec będzie (x|y|z|w), a wyjście quat będzie wyglądało tak, jak to (w|x|y|z). W moim przypadku musiałem po prostu przesunąć pierwszą wartość tablicy quat na koniec i zadziałało to jak czar.

+2

Czy możesz dodać kod? Proszę. –

0

mogę odpowiedzieć na część tego pytania.

Orientacja urządzenia nie ma wpływu na wyjście czujnika, ponieważ czujniki są zawsze względem domyślnej orientacji urządzenia. Jednak w przypadku rysowania elementów na ekranie, takich jak strzałka kompasu, która wskazuje północ, należy wziąć pod uwagę orientację urządzenia, ponieważ układ współrzędnych płótna, który rysujesz został obrócony, jeśli urządzenie nie znajduje się w domyślna orientacja.

+0

Dzięki za pomoc, teraz jestem pewien, że zająłem się tą częścią. – dima

2

Dusza powyżej nie pomogła mi. Rozpoczęto usuwanie SensorManager.getQuaternionFromVector(quat, vec); jako docs, stwierdzając, że SensorManager.getRotationMatrixFromVector() prosi o wektor obrotu, który jest zwracany przez czujnik ROTATION_VECTOR.

private float[] rotationVectorAction(float[] values) 
{ 
    float[] result = new float[3]; 
    float vec[] = values; 
    float[] orientation = new float[3]; 
    float[] rotMat = new float[9]; 
    SensorManager.getRotationMatrixFromVector(rotMat, vec); 
    SensorManager.getOrientation(rotMat, orientation); 
    result[0] = (float) orientation[0]; //Yaw 
    result[1] = (float) orientation[1]; //Pitch 
    result[2] = (float) orientation[2]; //Roll 
    return result; 
} 
+0

Dzięki! Świetna robota! –