2011-05-20 78 views
2

下面的accel,x,yz的值與預期不符。加速度計的值與傾斜儀一樣嗎?

它似乎是作爲傾斜傳感器而不是加速計。

當我把手機放在空中接住它時,accel的值不會改變超過10%。與隨機旋轉手機時相比,我獲得了50-100%的更大變化!

有什麼可以解釋這一點?我只是想檢測手機何時處於自由落體狀態,(和/或影響什麼)。

SensorManager sm = (SensorManager)getSystemService(SENSOR_SERVICE); 
Sensor sensor = sm.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER); 
    sm.registerListener(
     sel = new SensorEventListener(){ 
      @Override public void onAccuracyChanged(Sensor arg0, int arg1) {} 
      @Override public void onSensorChanged(SensorEvent arg0) { 
         double x = se.values[0]; 
         double y = se.values[1]; 
         double z = se.values[2]; 
         double accel = Math.sqrt(
              Math.pow(x, 2) +  
              Math.pow(y, 2) + 
              Math.pow(z, 2)); 
      } 
     }, 
     sensor, 
     SensorManager.SENSOR_DELAY_NORMAL 
    ); 

(作爲一個方面的問題,x的值,y和z似乎遠高於他們應該是,與accel平均在50-80左右,站立時還是?難道不應該是大約9.8? )

x,y和z值似乎對手機方向的變化非常敏感,但並不代表加速度。我錯過了什麼?

示例值與手機還在,仰臥: 加速= 85.36,X = 6.8,Y = 45.25 Z = 30.125

+1

當你把手機放在臉上時,你得到的實際值是多少?當你平躺在背上時,他們會改變什麼?我不知道你期望讀什麼單位,但看起來他們不是m/s^2。它們很可能直接從加速度輸出中縮放,並且很可能存在偏移量。 – AAT 2011-05-20 12:48:37

回答

2

我曾與

Sensor sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
0

可能是因爲,當你把手機幾乎是在同一平面或角度和在低速時,當您打開手機時,它會迅速改變其航向和方向,併爲結果提供更高的值。加速度計可能是多功能設備的誤用,可能會有一個選擇參數用於您真正想要獲得結果的功能。

+0

你知道可能是什麼選擇參數嗎? – Jodes 2011-05-20 13:03:36

0

更換

Sensor sensor = sm.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER); 

隨着手機趴在它的後面,你應該得到接近零的X和Y傳感器在Z傳感器約9.8。 9.8當然是由於重力。

我的第一個雖然會有,手機有問題,並會建議在另一部手機上嘗試相同的代碼。

但是我注意到數學中有些問題,但沒有想到呢。

其中x,y,z具有您提到的值(平方和的平方根)的值,可以達到54.78而不是85.36,正如您在文章中提到的那樣。

我對Java非常陌生,所以我不能輕易發現可能會出現什麼問題,並且還沒有機會嘗試使用手機上的那段代碼,但我認爲數學很簡單,足以讓我確定結果是錯誤的。 (或者至少我希望如此)。

另一件事要檢查(假設你算出數學問題)是,當你把手機放在空中時的小改變可能僅僅是由於響應時間慢。加速度計輸出可能僅僅是變化太慢,所以到手機降落時輸出不會有太大變化。可以通過使用SENSOR_DELAY_GAME或SENSOR_DELAY_FASTEST而不是普通來改善響應。

順便說一下,不應該是arg0.values []而不是se.values []? se從哪裏來?傳感器值進入onSensorChanged的參數(在這種情況下是arg0),所以我無法弄清楚它們應該如何在se中結束。 (但是在Java中我仍然有很多東西我還是不明白)