2

在获取它包含的旋转矩阵值中,public static boolean getRotationMatrix (float[] R, float[] I, float[] gravity, float[] geomagnetic) 我该如何计算float[] gravity?我找到了一个代码示例,它计算orientation使用两者AccelerometerMagnetic 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θ

在哪里

    φ = 方位角
    θ = 间距
    ψ = 滚动

对应于 3x3 Android 旋转矩阵 R[0] 到 R[8](问题中的矩阵R)通过

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