Android 传感器转换为世界坐标系

示例

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;
    }

    //根据重力和磁传感器数据计算旋转矩阵
    SensorManager.getRotationMatrix(rotationMatrix, null, gravityData, magneticData);

    //世界坐标系转换以加速
    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];

}