2015-04-28 45 views
0

我創建一個應用程序,利用加速度計數據的計算設備橫滾和俯仰。 這是我現在,還沒有編碼的側傾/俯仰計算。的Android加速度計在z AXYS讀取0無變化

只是檢查以查看哪個傳感器存在並列出這些在logcat中,檢查如果裝置具有加速計和實現一個簡單的輸出GUI(4個textviews,對應於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())); 
    } 
    

    }

回答

0

顯然,這是正常的,因爲Z軸取決於磁取向。沒有陀螺儀,磁力計或指南針,z值很可能總是爲0或至少保持不變。 由於這款手機我的現在沒有的,即清除它。