Obtenez de quaternions sur Android gyroscope?

L'officiel du développement de la documentation suggère la manière suivante, d'obtenir le quaternion de la 3D, la vitesse de rotation du vecteur (wx, wy, wz).

//Create a constant to convert nanoseconds to seconds.
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
    //(that is, EPSILON should represent your maximum allowable margin of error)
    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;
   }
}

Ma question est:

Il est tout à fait différente de l'accélération cas, où le calcul de l'accélération résultante, en utilisant les accélérations le LONG de les 3 axes du sens.

Je suis vraiment confus pourquoi la résultante de la vitesse de rotation peut aussi être calculée avec la sous-rotation taux de AUTOUR de les 3 axes. Il ne fait pas de sens pour moi.

Pourquoi cette méthode - trouver le composite la vitesse de rotation de son ampleur, le même travail?

OriginalL'auteur Sibbs Gambling | 2013-09-03