Android 中 开发 G-sensor
什么是G-sensor
G-sensor(Gravity sensor),重力传感器,又名加速度传感器(accelerometer),是能感知加速度大小的MEMS传感器。
SensorManager mSensorManager;public void getSensorData(Context context) {mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);Sensor gsensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);mSensorManager.registerListener(sensorListener, gsensor, SensorManager.SENSOR_DELAY_NORMAL);}SensorEventListener sensorListener = new SensorEventListener() {long start = 0;long end = 0;long startStop = 0;long endStop = 0;@Overridepublic void onSensorChanged(SensorEvent event) {if (event.sensor == null || Sensor.TYPE_ACCELEROMETER != event.sensor.getType()) {return;}float[] values = event.values;float ax = values[0];float ay = values[1];float az = values[2];
// float x_bias = values[3];
// float y_bias = values[4];
// float z_bias = values[5];if (start == 0) {start = System.currentTimeMillis();Logger.i(TAG, "ax:" + ax + " ay:" + ay + " az:" + az);}else{end = System.currentTimeMillis();if(end - start > 2 * 1000){start = end;Logger.i(TAG, "ax:" + ax + " ay:" + ay + " az:" + az);// ToastUtils.showShort("ax:" + ax + " ay:" + ay + " az:" + az);view.showSensorData(ax,ay,az);if (ax > 8 || ay > 8 || az > 10) {Logger.i(TAG,"摇一摇成功");App.getInstance().isUpload = false;isRequest = true;startStop = 0;Logger.i(TAG,"默认状态,存储定位数据到数据库中...");}else{if (startStop == 0) {startStop = System.currentTimeMillis();}else{endStop = System.currentTimeMillis();if(endStop - startStop > 1 * 60 * 1000 && !App.getInstance().isDriver){startStop = endStop;App.getInstance().isUpload = true;Logger.i(TAG,"已判定为停车状态,可上传定位数据...");isRequest = true;}}}}}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}};
8.23
重力加速计低通滤波算法——安卓开发文档
重力为测量结果中的不变成分。因此在获取到三轴的加速度分量后,可以采用低通滤波的方式分离出重力分量,然后在原始值中减去重力。最后得到不含重力的手机加速度。
以下为安卓开发者文档中提供的低通滤波算法:
public void onSensorChanged(SensorEvent event){// alpha 由 t / (t + dT)得到// t为滤波器时间常量,为传感器单次采样时间// dT为采样频率final float alpha = 0.8;float[] gravity = new float[3];float[] linear_acceleration = new float[3];gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];linear_acceleration[0] = event.values[0] - gravity[0];linear_acceleration[1] = event.values[1] - gravity[1];linear_acceleration[2] = event.values[2] - gravity[2];}
8.24
使用线性加速度计
线性加速度传感器为您提供三维向量,表示沿着每个设备轴的加速度,不包括重力。您可以使用此值执行手势检测。该值还可以作为惯性导航系统的输入,该系统使用航位推算。以下代码显示如何获取默认线性加速度传感器的实例:
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
从概念上讲,该传感器根据以下关系为您提供加速度数据:
线性加速度=加速度 - 重力加速度
当您想要在不受重力影响的情况下获得加速度数据时,通常会使用此传感器。例如,您可以使用此传感器来查看您的汽车行驶速度。线性加速度传感器始终具有偏移,您需要将其移除。最简单的方法是在应用程序中构建校准步骤。在校准期间,您可以要求用户在桌面上设置设备,然后读取所有三个轴的偏移。然后,您可以从加速度传感器的直接读数中减去该偏移量,以获得实际的线性加速度。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
