我目前正在通过手机接收方向数据来实施速度表。我正在使用
SensorManager.getRotationMatrix(R, I, gravity, geomagnetic);
float orientation[] = new float[3];
SensorManager.getOrientation(R, orientation);
float azimuth = orientation[0];
double azimuthD = Math.toDegrees(azimuth);
if(azimuthD < 0) azimuthD = 360 + azimuthD;
有了这个我能够从手机接收旋转数据,如方位角等。 无论如何,当设备放在桌子或其他东西上时,这种方法很好。但是当绕某一点旋转时(在我的情况下,设备固定在一个轮子上并以一定的速度旋转),这些值远远不准确。我相信,由于我使用的是重力和地磁传感器,在旋转时可能会与影响这些传感器的力发生冲突。 As the wheel turns, the rotation changes relative to a point, but the local device rotation stays the same.
如何在设备转动时访问设备的方向而不会遇到大量噪音数据? 我读了一些关于'Sensor.TYPE_ROTATION_VECTOR'属性的内容,但无法弄清楚它是如何工作的。我还读到了重新映射协调系统的可能性,但是这应该如何帮助,因为我的手机永远不会垂直于地板,更像是5°-10°的角度。 我将不胜感激任何帮助。
干杯, viehlieb
答案 0 :(得分:0)
我想我找到了答案。 解决方案是抛弃我上面发布的所有代码并使用陀螺仪。 陀螺仪值测量设备旋转的角速度。使用的坐标系是设备自己的坐标系。在我的例子中,相关值是围绕z轴的旋转。 值是每秒辐射,如果你想要乘以车轮的圆周,可以映射到m / s。所以诀窍在于OnSensorChanged方法:
if(sensorEvent.sensor.getType() == Sensor.TYPE_GYROSCOPE){
gyroscope = sensorEvent.values;
double rotZ = gyroscope[2];
double degrees = Math.toDegrees(gyroscope[2]);
//calculate the speed with circumference = 2.23m
float speed = (float) degrees/ 360.0f * 2.23f * 3.6f;
}
如果您现在想要准确的值,可以将它们存储在数组中并计算平均值。记得每隔20次(或左右)清除数组,就会调用onSensorChanged方法。通过SENSOR_DELAY_GAME注册,您可以获得足够的数据来构建平均值。