感器 | 傳感器事件數據 | 說明 | 測量單位 |
SensorEvent.values[0]
|
沿 x 軸的加速度(包括重力)。
|
m/s2
|
|
SensorEvent.values[1]
|
沿 y 軸的加速度(包括重力)。
|
||
SensorEvent.values[2]
|
沿 z 軸的加速度(包括重力)。
|
||
SensorEvent.values[0]
|
沿 x 軸的重力加速度。
|
m/s2
|
|
SensorEvent.values[1]
|
沿 y 軸的重力加速度。
|
||
SensorEvent.values[2]
|
沿 z 軸的重力加速度。
|
||
SensorEvent.values[0]
|
圍繞 x 軸的旋轉角速度。
|
rad/s
|
|
SensorEvent.values[1]
|
圍繞 y 軸的旋轉角速度。
|
||
SensorEvent.values[2]
|
圍繞 z 軸的旋轉角速度。
|
||
SensorEvent.values[0]]
|
沿 x 軸的加速度(不包括重力)。
|
m/s2
|
|
SensorEvent.values[1]
|
沿 y 軸的加速度(不包括重力)。
|
||
SensorEvent.values[2]
|
沿 z 軸的加速度(不包括重力)。
|
||
SensorEvent.values[0]]
|
旋轉向量沿 x 軸的部分(x * sin(θ/2))。
|
無無
|
|
SensorEvent.values[1]
|
旋轉向量沿 y 軸的部分(y * sin(θ/2))。
|
||
SensorEvent.values[2]]
|
旋轉向量沿 z 軸的部分(z * sin(θ/2))。
|
||
SensorEvent.values[3]]
|
旋轉向量的數值部分((cos(θ/2))1。
|
private SensorManager mSensorManager; private Sensor mSensor; ... mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
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 與地平面垂直,指向天空。