private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
注意: 你可以使用很多技术来过滤传感器数据。 以上例程只是使用了过滤器常量(alpha)来创建一个低通滤波器。 这个过滤器常量是由时间常量(t)和传感器事件报送频率(dt)推导出来的,t 大致等于过滤器触发传感器事件的间隔时间。 为了演示,此例程使用 0.8 作为 alpha 的值。如果你要用这个过滤方法,你可能需选用其它的 alpha 值。public void onSensorChanged(SensorEvent event){
// 在本例中,alpha 由 t / (t + dT)计算得来,
// 其中 t 是低通滤波器的时间常数,dT 是事件报送频率
final float alpha = 0.8;
// 用低通滤波器分离出重力加速度
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];
}
- 如果你从左侧平推设备(它向右移),则 x 方向加速度为正值。
- 如果你从下侧平推设备(它向前移),则 y 方向加速度为正值。
- 如果以 A m/s2的加速度向空中移动设备,则 z 方向加速度等于 A + 9.81,即设备加速度(+A m/s2)减去重力加速度(-9.81 m/s2)。
-
静止设备的加速度值为 +9.81,即设备加速度(0 m/s2)减去重力加速度(-9.81 m/s2)。
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
使用陀螺仪
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
// 创建常量,把纳秒转换为秒。
private static final float NS2S = 1.0f / 1000000000.0f;
private final float[] deltaRotationVector = new float[4]();
private float timestamp;
public void onSensorChanged(SensorEvent event) {
// 根据陀螺仪采样数据计算出此次时间间隔的偏移量后,它将与当前旋转向量相乘。
if (timestamp != 0) {
final float dT = (event.timestamp - timestamp) * NS2S;
// 未规格化的旋转向量坐标值,。
float axisX = event.values[0];
float axisY = event.values[1];
float axisZ = event.values[2];
// 计算角速度
float omegaMagnitude = sqrt(axisX*axisX + axisY*axisY + axisZ*axisZ);
// 如果旋转向量偏移值足够大,可以获得坐标值,则规格化旋转向量
// (也就是说,EPSILON 为计算偏移量的起步值。小于该值的偏移视为误差,不予计算。)
if (omegaMagnitude > EPSILON) {
axisX /= omegaMagnitude;
axisY /= omegaMagnitude;
axisZ /= omegaMagnitude;
}
// 为了得到此次取样间隔的旋转偏移量,需要把围绕坐标轴旋转的角速度与时间间隔合并表示。
// 在转换为旋转矩阵之前,我们要把围绕坐标轴旋转的角度表示为四元组。
float thetaOverTwo = omegaMagnitude * dT / 2.0f;
float sinThetaOverTwo = sin(thetaOverTwo);
float cosThetaOverTwo = 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);
// 为了得到旋转后的向量,用户代码应该把我们计算出来的偏移量与当前向量叠加。
// rotationCurrent = rotationCurrent * deltaRotationMatrix;
}
}
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION);
private SensorManager mSensorManager;
private Sensor mSensor;
...
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
- X 定义为向量积 Y x Z。它是以设备当前位置为切点的地球切线,方向朝东。
- Y 是以设备当前位置为切点的地球切线,指向地磁北极。
-
Z 与地平面垂直,指向天空。