在Android中,我使用加速度计和磁场传感器来计算空间定位,如下面的代码所示。 getRotationMatrix方法生成具有方位角,俯仰和滚动的实际单位的值。方位角和滚动给出的值范围为0到180或0到-180。然而,间距给出0到90或0到-90的值。这对我的应用程序来说是一个问题,因为在我的应用程序中,无论设备如何定位,我都需要确定唯一的位置。使用roll,您可以拥有2个具有相同值的位置。
我需要应用矩阵变换,将传感器值重新映射到0到360度范围内的值(实际上,360无效,因为它与0相同,任何接近360的值都会产生类似的数字359.99999 ...)
我不是数学家,不知道如何使用矩阵,更不用说在Android中使用它们但我知道这是获得0到360度转换所需的。如果矩阵也处理方位角和滚动也会很好,这样它们也会产生从0到360的值,但如果不可能,这很好,因为唯一的位置仍然可以从它们的传感器值中得出。有关如何创建此矩阵转换的任何建议吗?
@Override
public void onSensorChanged(SensorEvent event)
{
try
{
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
accelerometerValues = event.values;
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
magneticFieldValues = event.values;
if ((accelerometerValues != null) && (magneticFieldValues != null))
{
float[] R = new float[9];
float I[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R, I, accelerometerValues, magneticFieldValues);
if (success)
{
float[] values = new float[3];
SensorManager.getOrientation(R, values);
// Convert from radians to degrees if preferred.
values[0] = (float) Math.toDegrees(values[0]); // Azimuth
values[1] = (float) Math.toDegrees(values[1]); // Pitch
values[2] = (float) Math.toDegrees(values[2]); // Roll
}
}
}
catch (Exception ex)
{
}
}
修改 当您将设备旋转360度时,音高的原始事件值不会为您提供唯一值,因此我非常怀疑任何矩阵变换将产生我所追求的结果。也许我使用了错误的传感器。