我一直在尝试使用getOrientation()方法获取标题值。
boolean success = SensorManager.getRotationMatrix(rot, incl, accel, magnet);
if (success) {
// Compute orientation
float orientation[] = new float[3];
SensorManager.getOrientation(rot, orientation);
}
这些值变化很大,即使我保持手机稳定并且在稳定的位置行走也是如此。
然后我尝试将加速度值的参考从手机更改为世界轴:
// Compute world acceleration
float wAccel[] = new float[4];
float newAccel[] = new float[]{accel[0],accel[1],accel[2], 0};
android.opengl.Matrix.multiplyMV(wAccel, 0, rot, 0, newAccel, 0);
magnetLine += "W" + LOGSEPARATOR +
tsString + LOGSEPARATOR +
wAccel[0] + LOGSEPARATOR +
wAccel[1] + LOGSEPARATOR +
wAccel[2] + "\n";
}
然后我在atan2函数上使用X轴和Y轴的值来确定矢量的角度。即使以不同的方式变化,这些值仍然会显示奇怪的行为(有时值是常量,有时它会显示周期性行为,就像跟随脚步一样)。
我见过一些人们调用remapCoordinate系统的情况,这种情况与此类似。这是我错过的吗?
答案 0 :(得分:1)
以下是您可以执行的一些操作:
Sensor.TYPE_GRAVITY
代替{{1} }。 Sensor.TYPE_ACCELEROMETER
旨在尝试过滤掉移动,并为您提供重力矢量。Sensor.TYPE_GRAVITY
onAccuracyChanged(Sensor sensor, int accuracy)
方法监控传感器的准确性接口。我遇到了同样的问题,在我的情况下,当SensorEventListener
成为Sensor.TYPE_MAGNETIC_FIELD
时发生了这种情况。SensorManager.SENSOR_STATUS_UNRELIABLE
与90度有关你的坐标系中的旋转,例如用z轴等交换x。如果你是制作一个显示真北方向的指南针,然后您需要考虑您的设备是处于纵向还是横向模式等。但是,传感器的测量值不依赖于纵向/横向,所以如果他们的变化很大,然后你的问题就在别的地方。
另请注意android compass seems unreliable,有些人发现Android设备中的指南针不是很好。然而,这个帖子大约是2年前,所以希望事情现在好一些: - )。