磁場を使用して回転行列を計算します
-
12-12-2019 - |
質問
GET ROTICAL MATRIX値に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
であるSensor.AnyのアイデアのためにUndefineを言うのですか?
解決
向きは、磁気北に関連する角度のみを提供するため、回転行列ではありません。あなたはあなたのデバイスフレームから地球のフレームへの座標をこのように変換するのに役立つ回転行列(方向余弦行列)を得ることができます:
=方位角(ラジアン)
=ピッチ(ラジアン)
=ロール(ラジアン)
他のヒント
これが古いスレッドであることを知っていますが、それが助けている場合は、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θ.
ここで
φ = azimuth θ = pitch ψ = roll.
3×3アンドロイド回転行列R [0] ~R [8](質問の行列R)を介して
R[0] R[1] R[2] R[3] R[4] R[5] R[6] R[7] R[8].
所属していません StackOverflow