根据传感器数据计算垂直加速度

时间:2016-05-15 21:16:17

标签: android accelerometer linear-algebra android-sensors gyroscope

我使用Sensor.TYPE_LINEAR_ACCELERATIONSensor.TYPE_ROTATION_VECTOR从设备的传感器读取旋转矢量和加速度计值。

我想用这些数据来计算手机的垂直加速度 - 即无论手机如何旋转,我都希望能够读取相对于地面的上/下方向的加速度。

我该如何做到这一点?

更新

现在我有了这段代码:

private double getVerticalAcceleration(){
    // Based on http://stackoverflow.com/questions/31268852/measuring-vertical-movement-of-non-fixed-android-device
    float[] rotationMatrix = new float[9]; // Both 9 and 16 works, depending on what you're doing with it
    SensorManager.getRotationMatrixFromVector(rotationMatrix, rotationVector);

    float[] accelerationInWorldFrame = matrixMult3x9(
            accelerometerValues,
            rotationMatrixTranspose(rotationMatrix)
    );


    return accelerationInWorldFrame[2];
}



private float[] matrixMult3x9(float[] a, float[] b){
    float[] result = new float[3];
    result[0] = a[0]*b[0] + a[1]*b[3] + a[2]*b[6];
    result[1] = a[0]*b[1] + a[1]*b[4] + a[2]*b[7];
    result[2] = a[0]*b[2] + a[1]*b[5] + a[2]*b[8];
    return result;
}


private float[] rotationMatrixTranspose(float[] rotationMatrix){
    float[] result = new float[9];
    result[0] = rotationMatrix[0];
    result[1] = rotationMatrix[3];
    result[2] = rotationMatrix[6];
    result[3] = rotationMatrix[1];
    result[4] = rotationMatrix[4];
    result[5] = rotationMatrix[7];
    result[6] = rotationMatrix[2];
    result[7] = rotationMatrix[5];
    result[8] = rotationMatrix[8];
    return result;
}

但它似乎并不能很好地工作,因为如果我将手机保持直立状态,原始Y加速度计值与getVerticalAcceleration()返回的值之间的差异应为{{ 1}}(或非常接近0),但我看到各种各样的值。

0 个答案:

没有答案