Android加速度计在z axys上读取0而不做任何更改

时间:2015-04-28 22:06:37

标签: android accelerometer android-sensors

我正在创建一个使用加速计数据来计算设备滚动和俯仰的应用。 这就是我现在所拥有的,仍然无法对滚动/俯仰计算进行编码。

只需检查哪些传感器存在并将其列在logcat中,检查设备是否有加速度计,并实现简单的输出GUI(4个文本视图,对应3轴和最大传感器范围)。

X和Y正确读取电话静止并一次沿一个轴旋转,从0到9.5左右(这对应于对应于地球重力的法线9.8m / s2)。如预期的那样,振动设备会导致值超过9.8阈值。

然而,

Z加速度(sensorEvent.values [2])静止在0.032左右(我们称之为零)。摇晃,旋转,将它扔在墙上的一切都没有任何变化......这使得我尝试计算滚动和俯仰的任何尝试都无用......

这段代码有什么问题吗,或者我应该假设这款手机有问题(用我妻子的手机测试它的型号完全相同:结果相同)。

  • Accelerometer是一款KXTJ2-1009三轴加速度计(它的手机 只有物理传感器)
  • 手机是中国制造的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 个答案:

答案 0 :(得分:0)

显然这是正常的,因为Z轴取决于磁取向。如果没有陀螺仪,磁力计或罗盘,z值很可能始终为0.或者至少保持不变。 由于我的这款手机没有这些,所以清理它。