尝试不同的方法来计算手机的方位角已经有 2 周了,但我基本上发现了两个问题:
我的问题
- 360º 转弯并不总是 360º。如果我快速转弯,我会在转弯结束前完成我的 360 度,如果我走得很慢,我会在转弯结束后完成我的 360 度。
- 当我把它放在桌子上时,方位角会随机移动。或者甚至保持在相同的位置,对于任何滴答声,我都会得到 +- 3 度,所以如果我保持在 200º 并等待,我可能是 197º。然后如果我继续等待,它可能会达到 194º,但我会留下来。
我在找什么?
对于问题1.-,我正在寻找 X 轴(方位角)上的精确运动。在HelloPanoramaGL 项目示例中可以找到一个很好的示例。它移动平稳,您可以获得移动真实全景的感觉。
对于问题2.-,这个基于 iOS 全景图的项目同时执行 1.- 和 2.-。当你转弯时,它会得到相同的位置。
我试过的
好吧,两周后我敢说我已经完成了我在互联网上找到的所有内容,例如:
- 试图设置
Sensor.TYPE_ORIENTATION
不推荐使用的,但它是为我提供最佳结果的那个。 - 尝试
Sensor.TYPE_ACCELEROMETER
和的组合Sensor.TYPE_MAGNETIC_FIELD
。还将低通滤波器添加到传感器。 - 使用其余的传感器就像
Sensor.TYPE_ROTATION_VECTOR
等待任何让它工作的希望。
但是我的问题没有解决。
这是我现在的代码:
声明所有传感器:
private SensorManager sensorManager;
private Sensor magnetic_field;
private Sensor accelerometer;
private Sensor orientation;
初始化 onCreate():
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
orientation = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
magnetic_field = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
注册监听器 onResume():
sensorManager.registerListener(this, magnetic_field, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
sensorManager.registerListener(this, orientation, SensorManager.SENSOR_DELAY_FASTEST);
// tried with SENSOR_DELAY_FASTEST, SENSOR_DELAY_UI and SENSOR_DELAY_GAME
并得到结果:
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {
float azimuth1 = event.values[0];
return;
}
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER)
mGravity = event.values;
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD)
mGeomagnetic = event.values;
if (mGravity != null && mGeomagnetic != null) {
float R_[] = new float[9];
float I_[] = new float[9];
boolean success = SensorManager.getRotationMatrix(R_, I_, mGravity, mGeomagnetic);
if (success) {
float orientation[] = new float[3];
SensorManager.getOrientation(R_, orientation);
azimut = orientation[0]; // orientation contains: azimut, pitch and roll
}
}
}
如果你能帮助我,那就太好了。
非常感谢。
问候。
拉斐尔。