奇怪的行为与android方向传感器

目前,我正在尝试使用方向传感器值使用getRotation()方法来旋转3D立方体。 当Android设备被旋转到一些边界之上时,会观察到一些意外的行为。 例如,如果我让设备“站起来”,“滚动”的价值就变得疯狂了。

此外,我正在经历类似于所谓的万向节锁的现象。 唯一的区别是我甚至在将传感器值应用到3D旋转之前遇到了这个问题。 当我尝试通过仅围绕“俯仰”轴旋转装置来改变“俯仰”值时,“俯仰”值也根据俯仰的旋转而改变。 对我来说这似乎完全不合理。

有人能帮我吗? 我被困在这个问题上一个月了。

这是偏航,俯仰和滚转的常见问题。 只要你使用偏航,俯仰和滚转( 欧拉angular ),你就无法摆脱它。 这个video解释了原因。

我在我的运动感应应用中使用旋转matrix,而不是欧拉angular。 有关旋转matrix的介绍,我build议:

方向余弦matrixIMU:理论

旋转matrix就像一个魅力。

四元数也很受欢迎,据说是最稳定的。

[这个答案是从这里复制的。]

使用四元数来计算YPR对于解决任何问题都没有多大的作用。 万向节锁的问题(+/- 90附近的距离可以驱动偏航和摇摆 – 实际上在北极偏航滚动 – 在底层四元数的微小变化/噪声下发疯)。

但是,如果使用偏航俯仰和滚动值来执行3D物体的旋转,则不应在靠近万向节locking位置时出现任何奇怪的行为。 只是在偏航和滚转时出现偏差,而偏航和滚转的巨大变化并不意味着实际的定向会变得疯狂 – 只是定向对90°左右的偏航滚动的大变化不敏感。

但是,也请注意,针对HTML5的手机和浏览器不能正确实现Android的偏航,俯仰和滚动。 这里有一个很好的博客供参考:

http://www.sensorplatforms.com/understanding-orientation-conventions-mobile-platforms/

这里是一个基本的例子,这将返回重力vector。 请注意,您可以在此更改传感器types和采样速度,更多细节

SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); Sensor sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sensorManager.registerListener(new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { float x = event.values[0]; float y = event.values[1]; float z = event.values[2]; double total = Math.sqrt(x * x + y * y + z * z); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }, sensor, SensorManager.SENSOR_DELAY_FASTEST);