Android 加速度计在 z 轴上读数为 0 而没有变化
Posted
技术标签:
【中文标题】Android 加速度计在 z 轴上读数为 0 而没有变化【英文标题】:Android accelerometer reading 0 on z axys without change 【发布时间】:2015-04-28 22:06:37 【问题描述】:我正在创建一个使用加速度计数据来计算设备滚动和俯仰的应用。 这就是我现在所拥有的,还没有编码滚动/俯仰计算。
只需检查存在哪些传感器并在 logcat 中列出它们,检查设备是否有加速度计,并实现一个简单的输出 GUI(4 个文本视图,对应于 3 个轴和最大传感器范围)。
X 和 Y 在手机静止并一次沿一个轴旋转的情况下正确读取,并且从 0 变为大约 9.5(这对应于对应于地球重力的正常 9.8m/s2)。正如预期的那样,摇动设备会导致值超过 9.8 阈值。
然而,Z 加速度 (sensorEvent.values[2]) 在 0.032 左右是静止的(我们称之为零)。摇晃,旋转,除了把它扔到墙上以外的一切都不会产生任何变化......这使得我计算滚动和俯仰的任何尝试都毫无用处......
这段代码有什么问题吗,或者我应该假设这个特定的手机有问题(用我妻子的手机进行测试,型号完全相同:结果相同)。
加速度计是 KXTJ2-1009 3 轴加速度计(它的手机 仅物理传感器)手机是中国制造的 HTM 手机(假设它是 HTC 克隆) (http://www.everbuying.com/product555984.html)
公共类 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()));
【问题讨论】:
【参考方案1】:显然这是正常的,因为 Z 轴取决于磁方向。如果没有陀螺仪、磁力计或指南针,z 值很可能总是为 0。或者至少保持不变。 由于我的这个手机没有这些,那就清除它。
【讨论】:
以上是关于Android 加速度计在 z 轴上读数为 0 而没有变化的主要内容,如果未能解决你的问题,请参考以下文章
如何在android studio 上用加速度传感器来得到x y z轴上的坐标?