从陀螺仪android传感器获取旋转度

Posted

技术标签:

【中文标题】从陀螺仪android传感器获取旋转度【英文标题】:Getting rotation degree from gyroscope android sensor 【发布时间】:2012-11-12 19:58:08 【问题描述】:

到目前为止,我已经在互联网上搜索过。 我正在尝试开发一个问题,我需要从手机起点旋转角度。要知道用户是否将手机向上或向下移动,我正在使用加速度计,它在开始时有点不稳定,但我设法使其稳定。 我现在需要围绕它自己的旋转度数。就像不推荐使用的方向传感器一样。然后我尝试使用 Magnometer,但我很不稳定。 然后我确定我想尝试使用陀螺仪,当我使用示例代码时:

 // This timestep's delta rotation to be multiplied by the current rotation
 // after computing it from the gyro sample data.
 if (timestamp != 0) 
     final float dT = (event.timestamp - timestamp) * NS2S;
     // Axis of the rotation sample, not normalized yet.
     float axisX = event.values[0];
     float axisY = event.values[1];
     float axisZ = event.values[2];

     // Calculate the angular speed of the sample
     float omegaMagnitude = (float) Math.sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);

     // Normalize the rotation vector if it's big enough to get the axis
     if (omegaMagnitude > EPSILON) 
         axisX /= omegaMagnitude;
         axisY /= omegaMagnitude;
         axisZ /= omegaMagnitude;
     

     // Integrate around this axis with the angular speed by the timestep
     // in order to get a delta rotation from this sample over the timestep
     // We will convert this axis-angle representation of the delta rotation
     // into a quaternion before turning it into the rotation matrix.
     float thetaOverTwo = omegaMagnitude * dT / 2.0f;
     float sinThetaOverTwo = (float) Math.sin(thetaOverTwo);
     float cosThetaOverTwo = (float) Math.cos(thetaOverTwo);
     deltaRotationVector[0] = sinThetaOverTwo * axisX;
     deltaRotationVector[1] = sinThetaOverTwo * axisY;
     deltaRotationVector[2] = sinThetaOverTwo * axisZ;
     deltaRotationVector[3] = cosThetaOverTwo;
 
 timestamp = event.timestamp;
 float[] deltaRotationMatrix = new float[9];
 SensorManager.getRotationMatrixFromVector(deltaRotationMatrix, deltaRotationVector);
 // User code should concatenate the delta rotation we computed with the current rotation
 // in order to get the updated rotation.
 // rotationCurrent = rotationCurrent * deltaRotationMatrix;

这段代码取自他们的文档,无论如何我可以将其转换为 360 度吗?或者我可以获得诸如手机从起点转过多少度的值?

提前致谢。

【问题讨论】:

请检查此线程***.com/questions/18587262/… 【参考方案1】:

获取 3x3 旋转矩阵,R1R2,getRotationMatrix() 在两个感兴趣的时间点。您想知道 angle 的旋转 R 使 R1R2 对齐。

先计算R

R = R1 * transpose(R2)

然后计算这个旋转的角度:

angle = acos((trace(R)-1)/2)

就是这样。

【讨论】:

非常感谢您花时间尝试回答这个问题。我不是数学方面的鲨鱼。返回的 RotationMatrix 不是 2D,如何转置呢?我制作了自己的转置方法: public float[] transposeMatrix(float[] m) float[] res = new float[9];水库[0] = m[0];水库[1] = m[3];资源[2] = m[6];资源[3] = m[1];资源[4] = m[4];水库[5] = m[7];资源[6] = m[2];水库[7] = m[5];水库[8] = m[8];返回米; 但是,我不能 * R1 和 R2 在 java 中,它说操作符是未定义的。任何方式你都可以给我更多的帮助。提前致谢! ***是你的朋友:transpose 和 matrix multiplication。

以上是关于从陀螺仪android传感器获取旋转度的主要内容,如果未能解决你的问题,请参考以下文章

Android传感器简单总结

使用陀螺仪和加速度计获取方向

使用 adb 从损坏的 android 设备中回收传感器

android开发笔记之高级主题—传感器的简单介绍

Android 传感器开发详解

通过android api或内核在陀螺仪上自定义灵敏度设置?