2011-04-07 32 views
8

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

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

有人能帮助我吗?我在这个问题上陷入了一个月。

回答

15

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

我使用旋转矩阵代替欧拉角在我的运动感测应用。的介绍,旋转矩阵,我建议:

Direction Cosine Matrix IMU: Theory

旋转矩阵的工作就像一个魅力。

四元数也很流行,据说是最稳定的。

[这个答案是从here复制。]

+0

谢谢你的答案:)你的解决方案听起来值得尝试。那我可以直接使用从android API获得的旋转矩阵吗?遗憾的是,我不知道3D是如何工作的,因此我无法弄清楚是否需要在“纯”旋转矩阵上进行某些操作。 – 2011-04-09 04:26:33

+1

这取决于你如何做你的旋转。我从未使用Android。如果你使用OpenGL进行轮播(我猜你是这样做的),你可能需要添加几个零和一个,从41:58在youtube视频中看到。但除此之外,“纯粹”旋转矩阵就足够了。祝你好运! – Ali 2011-04-09 11:14:20

+0

你能否举一个例子说明如何使用旋转矩阵而不用欧拉角?我似乎无法弄清楚^^ – 2012-05-18 14:42:14

1

使用四元数来计算YPR不会做很多工作来解决任何问题。万向节锁的问题(+/- 90度的近距离可以驱动偏航和滚转 - 实际上北极的偏航滚动 - 在底层四元数的微小变化/噪声下变得疯狂)。但是,如果您使用偏航俯仰和滚动值来执行3D物体的旋转,则不应在靠近万向节锁定位置时出现任何奇怪的行为。这只是在偏航和滚转时出现横向偏移,而偏航和滚转的大幅变化并不意味着实际的方向会变得疯狂 - 只是方向对偏航滚动接近90°的大变化不敏感。

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

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

+0

为避免万向节锁定,请勿使用轴角数学。只要避免轴角度实现,欧拉旋转就可以。 – Tcll 2017-01-23 16:15:52

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