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轴上的坐标?

android从加速度计读数中删除重力

Android 加速度计精度(惯性导航)

Android 加速度计精度(惯性导航)

如何从 Android 3 轴加速度计中的加速度计读数中删除重力因子

使用 Python Matplotlib 在 3D 轴上为振动传感器读数创建动画散点图