Android z 轴上的加速度计读数为 0,没有变化
Android accelerometer reading 0 on z axys without change
我正在创建一个应用程序,它利用加速度计数据来计算设备的滚动和俯仰。
这就是我现在所拥有的,还没有对 roll/pitch 计算进行编码。
只需检查存在哪些传感器并将它们列在 logcat 中,检查设备是否有加速度计,并实现一个简单的输出 GUI(4 个文本视图,对应于 3 个轴和最大传感器范围)。
X 和 Y 正确读取 phone 静止并一次沿一个轴旋转,从 0 到 9.5 左右(这对应于地球重力对应的正常 9.8m/s2) .正如预期的那样,摇动设备会导致值超过 9.8 阈值。
然而,Z 加速度 (sensorEvent.values[2]) 稳定在 0.032 左右(我们称之为零)。摇晃、旋转,除了将它扔到墙上之外的任何事情都不会产生任何变化……这使得我计算横滚和俯仰的任何尝试都变得毫无用处……
这段代码有什么问题吗,或者我是否应该假设这个特定的 phone 有问题(用我妻子的 phone 进行了测试,它是完全相同的模型:相同的结果)。
- 加速度计是 KXTJ2-1009 3 轴加速度计(它的 phones
只有物理传感器)
Phone 是中国制造的 HTM phone(假设它是 HTC 克隆)
(http://www.everbuying.com/product555984.html)
public class MainActivity 扩展 ActionBarActivity 实现 SensorEventListener {
private TextView raw_x, raw_y, raw_z, acc_max;
private boolean hasAccelerometer;
private SensorManager senSensorManager;
private Sensor senAccelerometer;
private long lastUpdate = 0;
private float last_x, last_y, last_z;
private static final int SHAKE_THRESHOLD = 700;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sMgr = (SensorManager) this.getSystemService(SENSOR_SERVICE);
List<Sensor> list = sMgr.getSensorList(Sensor.TYPE_ALL);
String data = new String();
for (Sensor sensor : list) {
data += (sensor.getName() + "\n");
data += (sensor.getVendor() + "\n");
data += (sensor.getVersion() + "\n");
}
Log.d(TAG, data);
PackageManager manager = getPackageManager();
hasAccelerometer = manager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER);
if(hasAccelerometer) {
senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_NORMAL);
}
Log.d(TAG,Float.toString(senAccelerometer.getMaximumRange()));
initGui();
}
@Override
protected void onResume() {
super.onResume();
senSensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
protected void onPause() {
super.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onSensorChanged(SensorEvent sensorEvent) {
Sensor mySensor = sensorEvent.sensor;
if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) {
long curTime = System.currentTimeMillis();
float x = (float) sensorEvent.values[0];
float y = (float) sensorEvent.values[1];
float z = (float) sensorEvent.values[2];
if ((curTime - lastUpdate) > 100) {
long diffTime = (curTime - lastUpdate);
lastUpdate = curTime;
float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000;
if (speed > SHAKE_THRESHOLD) {
//doSomething()
}
if(raw_x!=null){
raw_x.setText(Float.toString(x));
raw_y.setText(Float.toString(y));
raw_z.setText(Float.toString(z));
}
last_x = x;
last_y = y;
last_z = z;
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
private void initGui() {
setContentView(R.layout.activity_main);
raw_x = (TextView) findViewById(R.id.lbl_raw_x);
raw_y = (TextView) findViewById(R.id.lbl_raw_y);
raw_z = (TextView) findViewById(R.id.lbl_raw_z);
acc_max = (TextView) findViewById(R.id.lbl_max);
acc_max.setText(Float.toString(senAccelerometer.getMaximumRange()));
}
}
显然这是正常的,因为 Z 轴取决于磁方向。如果没有陀螺仪、磁力计或罗盘,z 值很可能始终为 0。或者至少保持不变。
由于我的这个 phone 有 none 个,这样就清楚了。
我正在创建一个应用程序,它利用加速度计数据来计算设备的滚动和俯仰。 这就是我现在所拥有的,还没有对 roll/pitch 计算进行编码。
只需检查存在哪些传感器并将它们列在 logcat 中,检查设备是否有加速度计,并实现一个简单的输出 GUI(4 个文本视图,对应于 3 个轴和最大传感器范围)。
X 和 Y 正确读取 phone 静止并一次沿一个轴旋转,从 0 到 9.5 左右(这对应于地球重力对应的正常 9.8m/s2) .正如预期的那样,摇动设备会导致值超过 9.8 阈值。
然而,Z 加速度 (sensorEvent.values[2]) 稳定在 0.032 左右(我们称之为零)。摇晃、旋转,除了将它扔到墙上之外的任何事情都不会产生任何变化……这使得我计算横滚和俯仰的任何尝试都变得毫无用处……
这段代码有什么问题吗,或者我是否应该假设这个特定的 phone 有问题(用我妻子的 phone 进行了测试,它是完全相同的模型:相同的结果)。
- 加速度计是 KXTJ2-1009 3 轴加速度计(它的 phones 只有物理传感器)
Phone 是中国制造的 HTM phone(假设它是 HTC 克隆) (http://www.everbuying.com/product555984.html)
public class MainActivity 扩展 ActionBarActivity 实现 SensorEventListener {
private TextView raw_x, raw_y, raw_z, acc_max; private boolean hasAccelerometer; private SensorManager senSensorManager; private Sensor senAccelerometer; private long lastUpdate = 0; private float last_x, last_y, last_z; private static final int SHAKE_THRESHOLD = 700; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sMgr = (SensorManager) this.getSystemService(SENSOR_SERVICE); List<Sensor> list = sMgr.getSensorList(Sensor.TYPE_ALL); String data = new String(); for (Sensor sensor : list) { data += (sensor.getName() + "\n"); data += (sensor.getVendor() + "\n"); data += (sensor.getVersion() + "\n"); } Log.d(TAG, data); PackageManager manager = getPackageManager(); hasAccelerometer = manager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER); if(hasAccelerometer) { senSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); senAccelerometer = senSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); senSensorManager.registerListener(this, senAccelerometer , SensorManager.SENSOR_DELAY_NORMAL); } Log.d(TAG,Float.toString(senAccelerometer.getMaximumRange())); initGui(); } @Override protected void onResume() { super.onResume(); senSensorManager.registerListener(this, senAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); } @Override public void onDestroy() { super.onDestroy(); } @Override public void onSensorChanged(SensorEvent sensorEvent) { Sensor mySensor = sensorEvent.sensor; if (mySensor.getType() == Sensor.TYPE_ACCELEROMETER) { long curTime = System.currentTimeMillis(); float x = (float) sensorEvent.values[0]; float y = (float) sensorEvent.values[1]; float z = (float) sensorEvent.values[2]; if ((curTime - lastUpdate) > 100) { long diffTime = (curTime - lastUpdate); lastUpdate = curTime; float speed = Math.abs(x + y + z - last_x - last_y - last_z)/ diffTime * 10000; if (speed > SHAKE_THRESHOLD) { //doSomething() } if(raw_x!=null){ raw_x.setText(Float.toString(x)); raw_y.setText(Float.toString(y)); raw_z.setText(Float.toString(z)); } last_x = x; last_y = y; last_z = z; } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } private void initGui() { setContentView(R.layout.activity_main); raw_x = (TextView) findViewById(R.id.lbl_raw_x); raw_y = (TextView) findViewById(R.id.lbl_raw_y); raw_z = (TextView) findViewById(R.id.lbl_raw_z); acc_max = (TextView) findViewById(R.id.lbl_max); acc_max.setText(Float.toString(senAccelerometer.getMaximumRange())); }
}
显然这是正常的,因为 Z 轴取决于磁方向。如果没有陀螺仪、磁力计或罗盘,z 值很可能始终为 0。或者至少保持不变。 由于我的这个 phone 有 none 个,这样就清楚了。