安卓陀螺仪传感器出现奇怪的行为

9

目前,我正在尝试使用方向传感器的值(使用 getRotation() 方法)旋转3D立方体。但是,在Android设备超过某些限制时,会出现一些意外的行为。例如,如果我让设备“竖起来”,则“翻滚”的值就会变得疯狂。

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

能否有人帮帮我? 我已经被这个问题困扰了一个月。

4个回答

18

偏航、俯仰和翻滚是一个普遍的问题,只要你使用欧拉角就无法消除它。这个视频解释了其中的原因。

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

方向余弦矩阵IMU:理论

旋转矩阵非常好用。

四元数也很受欢迎,被认为是最稳定的。

[此答案摘自这里。]


谢谢您的回答 :) 您的解决方案听起来值得一试。那么我可以直接使用从Android API获得的旋转矩阵吗?遗憾的是,我不了解3D的工作原理,因此无法确定是否需要对“纯”旋转矩阵进行某些操作。 - Kyoung-Rok Jang
1
这取决于您如何进行旋转。我从未使用过Android。如果您在旋转时使用OpenGL(我猜是这样的),您可能需要添加几个零和一个,可以参考Youtube视频中的41:58。但除此之外,“纯”旋转矩阵就足够了。祝好运! - Ali
你能举个例子说明如何在没有欧拉角的情况下使用旋转矩阵吗?我似乎想不出来 ^^ - Adam Honoré
@AdamHonoré 我不太确定我理解了。请给我一个具体的问题,然后我可以告诉你如何使用旋转矩阵来实现。 - Ali
@Ali - 你能帮我吗?如何使用四元数计算偏航、俯仰和翻滚,以实现更稳定的读数!先谢谢了!拜托! - sam
@阿里亲爱的先生,链接 这个链接将引导您到我的新问题!请回答它。谢谢! - sam

0

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

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

0

如果你在手机上运行的话。

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

对于旋转矩阵和欧拉角,你可能会经常遇到一个叫做万向锁的术语。它经常发生在用户激烈动作时。

万向锁是三维三万向机构中的一种自由度丢失现象,当其中两个万向节的轴被驱动成平行配置时,"锁定"系统进入退化的二维空间旋转。 enter image description here

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

关于四元数连接和将点转换为新系统的详细信息,您可以参考维基链接。

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


0

使用四元数计算Yaw、Pitch和Roll并不能解决任何问题。万向锁问题(在接近俯仰角度为+/-90时,细微的变化/噪声会使得偏航和横滚 -- 实际上是在北极的偏航-横滚 -- 反应异常)依旧存在。

然而,如果您使用Yaw、Pitch和Roll值来旋转一个三维对象,则不会在万向锁位置附近表现出任何奇怪的行为。只是Yaw和Roll中的模糊性会出现,并且Yaw和Roll的大变化并不意味着实际方向会出现问题 -- 只是在俯仰角接近90度时,方向对Yaw-Roll的大变化不敏感。

但是,也请注意手机和HTML5浏览器未按照Android规范正确实现Yaw、Pitch和Roll。以下是一个很好的博客供参考:

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


为了避免万向节锁定,请不要使用轴角度数学。 只要避免使用轴角度实现,欧拉旋转就可以正常使用。 - Tcll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接