[Android] Wykorzystanie żyroskopu

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
WhiteHand
Piegowaty Guziec
Piegowaty Guziec
Posty: 17
Rejestracja: 29 mar 2014, 14:43
Płeć: Mężczyzna
Wersja Ubuntu: 14.04
Środowisko graficzne: Unity
Architektura: x86_64
Lokalizacja: Gdańsk

[Android] Wykorzystanie żyroskopu

Post autor: WhiteHand »

Witam.

Mam za zadanie napisać na projekt grę wykorzystującą żyroskop do sterowania. Na stronie developer.android.com znalazłem ciekawy kod do wykorzystania żyroskopu, ale za bardzo nie wiem jak się dobrać do jego wartości i w jaki sposób będą przedstawione. Sens mojej gry polega na sterowaniu celownikiem na ekranie za pomocą wychyleń telefonu. I tutaj chciałbym prosić Was o pomoc, w wytłumaczeniu mi w jaki sposób wykorzystać wartości przez ten sensor i w jaki sposób są reprezentowane.

Pozdrawiam.

http://developer.android.com/reference/ ... tml#values

Kod: Zaznacz cały

 private static final float NS2S = 1.0f / 1000000000.0f;
     private final float[] deltaRotationVector = new float[4]();
     private float timestamp;

     public void onSensorChanged(SensorEvent event) {
          // This timestep's delta rotation to be multiplied by the current rotation
          // after computing it from the gyro sample data.
          if (timestamp != 0) {
              final float dT = (event.timestamp - timestamp) * NS2S;
              // Axis of the rotation sample, not normalized yet.
              float axisX = event.values[0];
              float axisY = event.values[1];
              float axisZ = event.values[2];

              // Calculate the angular speed of the sample
              float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);

              // Normalize the rotation vector if it's big enough to get the axis
              if (omegaMagnitude > EPSILON) {
                  axisX /= omegaMagnitude;
                  axisY /= omegaMagnitude;
                  axisZ /= omegaMagnitude;
              }

              // Integrate around this axis with the angular speed by the timestep
              // in order to get a delta rotation from this sample over the timestep
              // We will convert this axis-angle representation of the delta rotation
              // into a quaternion before turning it into the rotation matrix.
              float thetaOverTwo = omegaMagnitude * dT / 2.0f;
              float sinThetaOverTwo = sin(thetaOverTwo);
              float cosThetaOverTwo = cos(thetaOverTwo);
              deltaRotationVector[0] = sinThetaOverTwo * axisX;
              deltaRotationVector[1] = sinThetaOverTwo * axisY;
              deltaRotationVector[2] = sinThetaOverTwo * axisZ;
              deltaRotationVector[3] = cosThetaOverTwo;
          }
          timestamp = event.timestamp;
          float[] deltaRotationMatrix = new float[9];
          SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
          // User code should concatenate the delta rotation we computed with the current rotation
          // in order to get the updated rotation.
          // rotationCurrent = rotationCurrent * deltaRotationMatrix;
     }
TrolleY
Serdeczny Borsuk
Serdeczny Borsuk
Posty: 160
Rejestracja: 06 cze 2013, 12:40
Wersja Ubuntu: inny OS
Środowisko graficzne: Inne
Architektura: x86_64

Re: [Android] Wykorzystanie żyroskopu

Post autor: TrolleY »

Pisałem kiedyś gierkę wykorzystującą akcelerometr androidowy.
https://github.com/trolleyyy/PacSON/blo ... ensor.java

Z tego co pamiętam to po prostu w tym wektorze (event.values) otrzymywałeś siłę w Newtonach jaka działa na akcelerometr z danej strony. W ramach pierwszych testów polecam po prostu wypisać sobie te wartości, co pozwoli ci zobaczyć jak się one zmieniają w zależności od nachylenia. Za pomocą pierwiastka kwadratowego obliczysz siłę jaka działa w kierunku w którym jest telefon najbardziej wychylony. Kąt w płaszczyźnie 2D w którym jest wychylony chyba liczyłem tak (to było dawno więc nie zweryfikuję tego):
https://github.com/trolleyyy/PacSON/blo ... lator.java

Dodatkowo pamiętam, że dochodziły tam kwestie z tym, żeby ignorować bardzo małe wychylenia oraz nie przetwarzać każdego impulsu z sensora żeby nie był zbyt czuły.

Powodzenia
Linux Mint 17 + Cinnamon (x64) / Windows 7 (x64)
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Amazon [Bot] i 6 gości