什么是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;
@Override
public 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;
}
}
}
}
}
}
@Override
public 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);
从概念上讲,该传感器根据以下关系为您提供加速度数据:
线性加速度=加速度 - 重力加速度
当您想要在不受重力影响的情况下获得加速度数据时,通常会使用此传感器。例如,您可以使用此传感器来查看您的汽车行驶速度。线性加速度传感器始终具有偏移,您需要将其移除。最简单的方法是在应用程序中构建校准步骤。在校准期间,您可以要求用户在桌面上设置设备,然后读取所有三个轴的偏移。然后,您可以从加速度传感器的直接读数中减去该偏移量,以获得实际的线性加速度。