我目前正在编写一个 Android 相机应用程序(在我的三星 S9 上运行 Android 9),我注意到当设备倾斜(不平坦)时输出的方位角值存在问题。例如,从设备开始平坦并上升到接近 90 度角时的度数差异可以从高达 10 度或 20 度不等。
我一直在搜索各种 StackOverflow 线程,但似乎没有一个解决方案涉及设备可能使用所有可能的旋转以及 ROTATION_VECTOR 传感器。我选择 ROTATION_VECTOR 的原因主要是因为从我读过的一个线程中,用户提到它考虑到方位角计算的俯仰/倾斜的潜在变化,但这显然不是我的问题。
我也明白这个传感器需要设备才能使用陀螺仪传感器,但就我的目的而言,情况总是如此。
当设备平行于地面(平放在地板上)时,输出的方位角值似乎是正确的,但一旦它变得倾斜但保持在相同的朝向,方位角开始逐渐增加/减少。无论手机处于纵向还是横向模式,这对于任何旋转情况都是相同的。
下面的方法在 onSensorChanged 事件中被调用:
private float[] calculateOrientation(float[] values) {
float[] rotationMatrix = new float[9];
float[] remappedMatrix = new float[9];
float[] orientation = new float[3];
// Determine the rotation matrix
SensorManager.getRotationMatrixFromVector(rotationMatrix, values);
// Remap the coordinates based on the natural device orientation.
int x_axis = SensorManager.AXIS_X;
int y_axis = SensorManager.AXIS_Y;
switch (screenRotation) {
case (Surface.ROTATION_90):
x_axis = SensorManager.AXIS_Y;
y_axis = SensorManager.AXIS_MINUS_X;
break;
case (Surface.ROTATION_180):
y_axis = SensorManager.AXIS_MINUS_Y;
break;
case (Surface.ROTATION_270):
x_axis = SensorManager.AXIS_MINUS_Y;
y_axis = SensorManager.AXIS_X;
break;
default: break;
}
SensorManager.remapCoordinateSystem(rotationMatrix, x_axis, y_axis, remappedMatrix);
// Obtain the current, corrected orientation.
SensorManager.getOrientation(remappedMatrix, orientation);
angleLowPassFilter.add(orientation[0]);
// Convert from Radians to Degrees.
values[0] = (float) Math.toDegrees(orientation[0]);
values[1] = (float) Math.toDegrees(orientation[1]);
values[2] = (float) Math.toDegrees(orientation[2]);
int correctedAzimuth = (int) ((values[0] + 360) % 360);
TextView textView = findViewById(R.id.textView);
textView.setText(String.format(Locale.US, "Azimuth: [%s]", correctedAzimuth));
return values;
}