感測器轉換為世界座標系

Android 返回的感測器值與手機的座標系相對應(例如+ Y 指向手機頂部)。我們可以使用感測器管理器旋轉矩陣將這些感測器值轉換為世界座標系(例如,+ Y 指向磁北,與地面相切)

首先,你需要宣告並初始化將儲存資料的矩陣/陣列(例如,你可以在 onCreate 方法中執行此操作):

float[] accelerometerData = new float[3];
float[] accelerometerWorldData = new float[3];
float[] gravityData = new float[3];
float[] magneticData = new float[3];
float[] rotationMatrix = new float[9];

接下來,我們需要檢測感測器值的變化,將它們儲存到相應的陣列中(如果我們想在以後/其他地方使用它們),然後計算旋轉矩陣並將結果轉換為世界座標:

public void onSensorChanged(SensorEvent event) {
    sensor = event.sensor;
    int i = sensor.getType();

    if (i == Sensor.TYPE_ACCELEROMETER) {
        accelerometerData = event.values;
    } else if (i == Sensor.TYPE_GRAVITY) {
        gravityData = event.values;
    } else if (i == Sensor.TYPE_MAGNETIC) {
        magneticData = event.values;
    }

    //Calculate rotation matrix from gravity and magnetic sensor data
    SensorManager.getRotationMatrix(rotationMatrix, null, gravityData, magneticData);

    //World coordinate system transformation for acceleration
    accelerometerWorldData[0] = rotationMatrix[0] * accelerometerData[0] + rotationMatrix[1] * accelerometerData[1] + rotationMatrix[2] * accelerometerData[2];
    accelerometerWorldData[1] = rotationMatrix[3] * accelerometerData[0] + rotationMatrix[4] * accelerometerData[1] + rotationMatrix[5] * accelerometerData[2];
    accelerometerWorldData[2] = rotationMatrix[6] * accelerometerData[0] + rotationMatrix[7] * accelerometerData[1] + rotationMatrix[8] * accelerometerData[2];

}