- Sensor.TYPE_GYROSCOPE
陀螺仪就是内部有一个陀螺,它的轴由于陀螺效应始终与初始方向平行,这样就可以通过与初始方向的偏差计算出实际方向。手机里陀螺仪实际上是一个结构非常精密的芯片,内部包含超微小的陀螺。
陀螺仪测量是参考标准是内部中间在与地面垂直的方向上进行转动的陀螺。通过设备与陀螺的夹角得到结果。
陀螺仪的强项在于测量设备自身的旋转运动。对设备自身运动更擅长。但不能确定设备的方位。
陀螺仪对设备旋转角度的检测是瞬时的而且是非常精确的,能满足一些需要高分辨率和快速反应的应用比如FPS游戏的瞄准。而且陀螺仪配合加速计可以在没有卫星和网络的情况下进行导航,这是陀螺仪的经典应用。同时处理直线运动和旋转运动时,就需要把加速度和陀螺仪计结合起来使用。如果还想设备在运动时不至于迷失方向,就再加上磁力计。
因为手机运动的加速度不高,精确度也没有太大的要求,用加速计替代陀螺仪也可以。但如果做一些精度比较高的游戏的话,最好还是有陀螺仪。
陀螺仪的XYZ分别代表设备围绕XYZ三个轴旋转的角速度:radians/second。至于XYZ使用的坐标系与gsensor相同。逆时针方向旋转时,XYZ的值是正的。
所以需要角速度与时间积分计算角度,得到的角度变化量与初始角度相加,就得到目标角度,其中积分时间Dt越小,输出角度越准
但陀螺仪的原理决定了它的测量基准是自身,并没有系统外的绝对参照物,加上Dt是不可能无限小
所以积分的累积误差会随着时间流逝迅速增加,最终导致输出角度与实际不符,所以陀螺仪只能工作在相对较短的时间尺度内
下面是使用陀螺仪进行开发时的演示代码:
private static final float NS2S = 1.0f / 1000000000.0f;
private float timestamp;
public void onSensorChanged(SensorEvent event)
{
if (timestamp != 0) {
final float dT = (event.timestamp - timestamp) * NS2S;
angle[0] += event.data[0] * dT;
angle[1] += event.data[1] * dT;
angle[2] += event.data[2] * dT;
}
timestamp = event.timestamp;
}
/**
* 功能:采集加速度传感器,磁场传感器和陀螺仪传感器的数据,得到传感器从外界采集数据的时间间隔
* @authorjarlen
*
*/
publicclass MainActivityextends Activityimplements SensorEventListener {
private SensorManagersensorManager;
private SensormagneticSensor;
private TextViewshowTextView;
private SensoraccelerometerSensor;
private SensorgyroscopeSensor;
// 将纳秒转化为秒
privatestatic finalfloat NS2S = 1.0f / 1000000000.0f;