2012-02-15 287 views
2

我试图获得Android设备的方向,我需要它在四元数结构(基本上是float[4])。如何从Android中的旋转矩阵中获得四元数?

我现在有是这样的:

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ 
    last_acc = (float[])event.values.clone(); 
} 
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD){ 
    last_mag = (float[])event.values.clone(); 
} 
if (last_acc != null && last_mag != null){ 
    SensorManager.getRotationMatrix(rotation, inclination, last_acc, last_mag); 
    SensorManager.getOrientation(rotation, orientation); 

在“旋转”,我有4×4的旋转矩阵,并且在取向我有一个浮子[3]向量,其中我有方位角,俯仰和滚转。

我怎样才能得到四元数?

回答

4

我不会使用欧拉角(滚动,俯仰,偏航),它几乎是你的应用程序的screws up the stability

至于旋转矩阵转换为四元数,谷歌表示:

+0

Thanx的答案。我认为这是我需要的。另外,解释它的谷歌视频非常清晰。 Thanx再次:) – Alex 2012-02-16 01:36:24

+0

@亚历克斯很高兴听到它。祝你好运! – Ali 2012-02-16 08:33:06

3

如果你不介意只被提供给API 9级及以上,你可以使用Sensor.TYPE_ROTATION_VECTOR,无论如何都会返回一个单位四元数并为您节省工作。如果馈送长度为3的数组,则这些值将是四元数的向量部分,满足sin(theta/2) * u,其中u是3D单位向量。如果数组长度为4,则第四个值将为单位四元数的标量值cos(theta/2)

http://developer.android.com/reference/android/hardware/SensorEvent.html#values