我使用Sensor.TYPE_LINEAR_ACCELERATION
和Sensor.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),但我看到各种各样的值。