Android方向传感器的奇怪行为

时间:2011-04-07 07:15:55

标签: android rotation orientation accelerometer sensor

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

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

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

4 个答案:

答案 0 :(得分:15)

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

我在运动感应应用中使用旋转矩阵而不是欧拉角。有关旋转矩阵的介绍,我建议:

Direction Cosine Matrix IMU: Theory

旋转矩阵就像魅力一样。

Quaternions 也很受欢迎,据称是最稳定的。

[此答案是从here复制的。]

答案 1 :(得分:1)

使用四元数计算YPR对解决任何问题都没有太大作用。万向节锁定的问题(接近+/- 90的音高可以驱动偏航和滚动 - 实际上是在北极的偏航 - 在下面的四元数中的微小变化/噪声下变得疯狂)。

但是,如果使用“偏航俯仰”和“滚动”值来执行3D对象的旋转,则不应在万向节锁定位置附近出现任何奇怪的行为。只是在偏航和滚转时出现偏差并且偏航和滚动的大幅变化并不意味着实际的方向变得疯狂 - 只是方向对90°附近的偏航滚动的大变化不敏感。

但是,请注意HTML5的手机和浏览器没有按照Android的惯例正确实现偏航,俯仰和滚动。这是一个很好的博客供参考:

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

答案 2 :(得分:0)

这是一个基本的例子,它将返回重力矢量。请注意,您可以更改传感器类型和采样速度,更多详细信息here

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);

答案 3 :(得分:0)

好吧,如果您在手机上运行。

四元数是最好的,应该使用它

对于旋转矩阵和欧拉角,您很容易遇到称为万向节锁定的术语。用户暴力行为经常发生这种情况。

万向节锁定是在三维,三万向节机构中失去一个自由度,这种情况是在三个万向节中的两个万向节的轴被驱动成平行配置时将系统“锁定”成旋转的。退化二维空间。 enter image description here

旋转矩阵和欧拉角对于缓慢移动的机器人动作非常有用。

有关四元数合并以及将点转换为新系统的详细信息, 您可以参考Wiki链接

https://en.wikipedia.org/wiki/Quaternion