- Sensor.TYPE_GYROSCOPE
陀螺仪是指内部有一个陀螺仪。由于陀螺效应总是平行于初始方向,因此实际方向可以通过与初始方向的偏差来计算。手机上的陀螺仪实际上是一个结构非常精确的芯片,里面有超小的陀螺仪。
陀螺仪测量是参考标准是内部中间在与地面垂直的方向上进行转动的陀螺。通过设备与陀螺的夹角得到结果。
陀螺仪的强项在于测量设备自身的旋转运动。对设备自身运动更擅长。但不能确定设备的方位。
陀螺仪对设备旋转角度的检测是瞬时而准确的,可以满足一些需要高分辨率和快速反应的应用,如FPS瞄准游戏。陀螺仪与加速没有卫星和网络的情况下导航,这是陀螺仪的经典应用。在处理直线运动和旋转运动时,需要将加速度与陀螺仪计相结合。如果你还想让设备在运动时不迷路,加上磁力计。
由于手机运动的加速度不高,精度要求不高,可以用加速器代替陀螺仪。但是如果你玩一些高精度的游戏,最好有陀螺仪。
陀螺仪的XYZ分别代表设备周围XYZ三轴旋转角速:radians/second。至于XYZ使用的坐标系和gsensor同样的。逆时针旋转时,XYZ值是正的。
因此,需要角度速度和时间积分计算角度。如果角度变化与初始角度相加,则得到目标角度,包括积分时间Dt输出角度越小越准确 但陀螺仪的理决定了它的测量基准是自身,并没有系统外的绝对参照物,加上Dt是不可能无限小 所以积分的累积误差会随着时间流逝迅速增加,最终导致输出角度与实际不符,所以陀螺仪只能工作在相对较短的时间尺度内
下面是使用陀螺仪进行开发时的演示代码:
/**
* 功能:采集加速度传感器,磁场传感器和陀螺仪传感器的数据,得到传感器从外界采集数据的时间间隔
* @authorjarlen
*
*/
publicclass MainActivityextends Activityimplements SensorEventListener {
private SensorManagersensorManager;
private SensormagneticSensor;
private TextViewshowTextView;
private SensoraccelerometerSensor;
private SensorgyroscopeSensor;
// 将纳秒转化为秒
privatestatic finalfloat NS2S = 1.0f / 1000000000.0f;
privatefloattimestamp;
privatefloatangle[] =newfloat[3];
@Override
protectedvoid onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
showTextView = (TextView) findViewById(R.id.showTextView);
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
magneticSensor =sensorManager
.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
accelerometerSensor =sensorManager
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
gyroscopeSensor =sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
//注册陀螺仪传感器,并设定传感器向应用中输出的时间间隔类型是SensorManager.SENSOR_DELAY_GAME(20000微秒)
//SensorManager.SENSOR_DELAY_FASTEST(0微秒):最快。最低延迟,一般不是特别敏感的处理不推荐使用,该模式可能在成手机电力大量消耗,由于传递的为原始数据,诉法不处理好会影响游戏逻辑和UI的性能
//SensorManager.SENSOR_DELAY_GAME(20000微秒):游戏。游戏延迟,一般绝大多数的实时性较高的游戏都是用该级别
//SensorManager.SENSOR_DELAY_NORMAL(200000微秒):普通。标准延时,对于一般的益智类或EASY级别的游戏可以使用,但过低的采样率可能对一些赛车类游戏有跳帧现象
//SensorManager.SENSOR_DELAY_UI(60000微秒):用户界面。一般对于屏幕方向自动旋转使用,相对节省电能和逻辑处理,一般游戏开发中不使用
sensorManager.registerListener(this,gyroscopeSensor,
SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this,magneticSensor,
SensorManager.SENSOR_DELAY_GAME);
sensorManager.registerListener(this,accelerometerSensor,
SensorManager.SENSOR_DELAY_GAME);
}
//坐标轴都是手机从左侧到右侧的水平方向为x轴正向,从手机下部到上部为y轴正向,垂直于手机屏幕向上为z轴正向
@Override
publicvoid onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
// x,y,z分别存储坐标轴x,y,z上的加速度
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
// 根据三个方向上的加速度值得到总的加速度值a
float a = (float) Math.sqrt(x * x + y * y + z * z);
System.out.println("a---------->" + a);
// 传感器从外界采集数据的时间间隔为10000微秒
System.out.println("magneticSensor.getMinDelay()-------->"
+magneticSensor.getMinDelay());
// 加速度传感器的最大量程
System.out.println("event.sensor.getMaximumRange()-------->"
+ event.sensor.getMaximumRange());
System.out.println("x------------->" + x);
System.out.println("y------------->" + y);
System.out.println("z------------->" + z);
Log.d("jarlen","x------------->" + x);
Log.d("jarlen","y------------>" + y);
Log.d("jarlen","z----------->" + z);
//showTextView.setText("x---------->" + x + "\ny-------------->" +
//y + "\nz----------->" + z);
}else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
// 三个坐标轴方向上的电磁强度,单位是微特拉斯(micro-Tesla),用uT表示,也可以是高斯(Gauss),1Tesla=10000Gauss
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
// 手机的磁场感应器从外部采集数据的时间间隔是10000微秒
System.out.println("magneticSensor.getMinDelay()-------->"
+magneticSensor.getMinDelay());
// 磁场感应器的最大量程
System.out.println("event.sensor.getMaximumRange()----------->"
+ event.sensor.getMaximumRange());
System.
标签: 微g加速度传感器