2

回転行列の値を取得するには、public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic) ここに含まれていfloat[] gravityます。orientationとの両方Accelerometerを使用して計算するコードのサンプルを見つけましたMagnetic field

boolean success = SensorManager.getRotationMatrix(
   matrixR,
   matrixI,
   valuesAccelerometer,
   valuesMagneticField);

if(success){
SensorManager.getOrientation(matrixR, matrixValues);

double azimuth = Math.toDegrees(matrixValues[0]);
double pitch = Math.toDegrees(matrixValues[1]);
double roll = Math.toDegrees(matrixValues[2]);

readingAzimuth.setText("Azimuth: " + String.valueOf(azimuth));
readingPitch.setText("Pitch: " + String.valueOf(pitch));
 readingRoll.setText("Roll: "+String.valueOf(roll));
}

私の質問は:

  • 方向の値は回転行列の値ですか?
  • いいえの場合、磁気を使用して回転行列の値を取得するためにこのコードを実装するにはどうすればよいですか?分野?

回転行列を取得するには、このコードを使用します

 public void onSensorChanged(SensorEvent sensorEvent) {
    if (timestamp != 0) {
        final double dT = (sensorEvent.timestamp - timestamp) * NS2S;
            double magneticX = sensorEvent.values[0];
            double magneticY = sensorEvent.values[1];
            double magneticZ = sensorEvent.values[2];
                        double omegaMagnitude =Math.sqrt(magneticX*magneticX + magneticY*magneticY + magneticZ*magneticZ);

                        if (omegaMagnitude > EPSILON) {
                            magneticX /= omegaMagnitude;
                            magneticY /= omegaMagnitude;
                            magneticZ /= omegaMagnitude;
        }
                        double thetaOverTwo = omegaMagnitude * dT / 2.0f;
                        double sinThetaOverTwo =Math.sin(thetaOverTwo);
                        double cosThetaOverTwo = Math.cos(thetaOverTwo);
                        deltaRotationVector[0] = (double) (sinThetaOverTwo * magneticX);
                        deltaRotationVector[1] = (double) (sinThetaOverTwo * magneticY);
                        deltaRotationVector[2] = (double) (sinThetaOverTwo * magneticZ);
                        deltaRotationVector[3] = cosThetaOverTwo;


    }
     double[] deltaRotationMatrix = new double[9];
     SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
}

しかし、問題は、これgetRotationMatrixFromVectorがセンサーの未定義と言っていることです。何かアイデアはありますか?

4

2 に答える 2

4

向きは、磁北に関連する角度のみを提供するため、回転行列ではありません。この方法で、デバイスフレームから地球のフレームに座標を変換するのに役立つ回転行列(方向余弦行列)を取得できます。

ウィキペディアのDCM

方位角 =方位角(ラジアン)

ピッチ =ピッチ(ラジアン)

ロール =ロール(ラジアン)

于 2012-05-22T09:06:34.250 に答える
1

これは古いスレッドであることは知っていますが、役立つ場合は、Androidの場合、3x3回転行列は実際には承認された回答のバリエーションによって与えられると思います。具体的には、Androidでは回転行列は

     (cosφcosψ--sinφsinψsinθ)sinφcosθ(cosφsinψ+sinφcosψsinθ)
    -(sinφcosψ+cosφsinψsinθ)cosφcosθ(-sinφsinψ+cosφcosψsinθ)
              -sinψcosθ-sinθcosφcosθ

どこ

    φ=方位角
    θ=ピッチ
    ψ=ロール

これは、3x3Android回転行列R[0]からR[8](質問のmatrixR)に対応します。

    R [0] R [1] R [2]
    R [3] R [4] R [5]
    R [6] R [7] R [8]
于 2013-04-03T18:05:11.547 に答える