4

これまでのところ、インターネットを薄く検索しました。電話の開始点からの回転角度が必要な問題を開発しようとしています。ユーザーが電話を上下に動かしているかどうかを知るために、加速度計を使用しています。最初は少し不安定でしたが、なんとか安定させました。私は今、それ自身の周りの回転度が必要です。非推奨の方向センサーと同様です。その後、マグノメーターを使用してみましたが、不安定になりました。次に、サンプル コードを使用するときに、ジャイロスコープを使用してみることを決定しました。

 // 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 = (float) Math.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 = (float) Math.sin(thetaOverTwo);
     float cosThetaOverTwo = (float) Math.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;

このコードはドキュメントから取得したものですが、これを 360 度に変換できるものはありますか? または、電話が開始点からどの程度離れているかなどの値を取得できますか?

前もって感謝します。

4

1 に答える 1

1

対象の 2 つの時点でgetRotationMatrix()を使用して、3x3 回転行列R1およびR2を取得します。に揃える回転のを知りたいです。angleRR1R2

最初に計算しますR:

R = R1 * transpose(R2)

次に、この回転の角度を計算します。

angle = acos((trace(R)-1)/2)

それだけです。

于 2012-11-12T21:22:56.087 に答える