2011-10-28 14 views
0

私は、テスト用電話機(Nexus S)で加速度センサ用のセンサAPIを使用しようとしています。ベンチに座っている電話が何もしていない状態で、私はいくつかの非常に奇妙な読みを得る(添付の画像)。誰もこの種の行動を見たことがありますか? Glitches in accel reading?どのようにそれに対処する任意のアイデア?Android加速度センサ、異常値/不具合

package com.example.m6; 

import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.util.Calendar; 

import android.app.Activity; 
import android.content.Context; 
import android.content.pm.ActivityInfo; 
import android.graphics.Color; 
import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.TextView; 
//import android.widget.Toast; 

public class HelloAndroidActivity extends Activity implements SensorEventListener { 
    private SensorManager sensorManager; 
    private TextView tv; 
    private float accel[] = {0,0,0}; 
    private float gyro[] = {0,0,0}; 


    InetAddress addr; 
    int port   = 1337; 
    DatagramSocket s = null; 
    String out  = ""; 
    PowerManager.WakeLock wl; 

    /** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     try{ 
      //Lock the screen 
      super.onCreate(savedInstanceState); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

      //Set up the output screen 
      setContentView(R.layout.main); 
      tv = (TextView) findViewById(R.id.textview); 
      tv.setBackgroundColor(Color.BLACK); 
      tv.setTextColor(Color.GREEN); 

      //Set up the telemetry feed 
      addr = InetAddress.getByName("192.168.0.12"); 
      s = new DatagramSocket(); 

      //Turning off the power management!! 
      PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
      wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "My Tag"); 
      wl.acquire(); 

      //Set up the sensors 
      sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 

      out += "Done\n"; 
      tv.setText(out); 

     } catch (Exception e) { 
      out += "\nInit Error:" + e.getMessage() + "\n"; 
      tv.setText(out); 
     } 

    } 

    private static final float NS2S = 1.0f/1000000000.0f; 
    private float timestamp; 

    int down = 0; 
    float tstart = 0; 
    @Override 
    public void onSensorChanged(SensorEvent event) {    

     String type = ""; 
     float dT = 0;  
     if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
      if (timestamp != 0) { 
       accel = event.values; 
       dT = (event.timestamp - timestamp); 
       tstart += dT; 
      } 
      timestamp = event.timestamp; 
      type = "G"; 
     } 

     if(event.sensor.getType() == Sensor.TYPE_GYROSCOPE) { 
      if (timestamp != 0) { 
       gyro = event.values; 
       dT = (event.timestamp - timestamp); 
       tstart += dT; 
      } 
      timestamp = event.timestamp; 
      type = "A"; 
     } 

     String out_packet = tstart/1000/1000 + " "+ type + " " + dT + " " + accel[0] + " " + accel[1] + " " + accel[2] + " " + gyro[0] + " " + gyro[1] + " " + gyro[2] + "\n\0"; 

     try{ 
      DatagramPacket p = new DatagramPacket(out_packet.getBytes(),out_packet.length(), addr,port); 
      s.send(p); 
     } 
    catch (Exception e) { 
      out += "Packet send error: " + e.getMessage() + "\n"; 
     } 

     tv.setText(timestamp + "\n" + out); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     out += "on resume\n"; 
     sensorManager.registerListener(this,sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),SensorManager.SENSOR_DELAY_NORMAL); 
     sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE), SensorManager.SENSOR_DELAY_NORMAL); 
     tv.setText(out); 
    } 

    @Override 
    protected void onPause() { 
     out += "on pause"; 
     sensorManager.unregisterListener(this); 
     tv.setText(out); 
     super.onStop(); 

    } 

    @Override 
    protected void onDestroy() { 
     out += "on destroy"; 
     wl.release(); 
     tv.setText(out); 
     super.onDestroy(); 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 

    } 
} 
+0

ドロイド1を使用して、私はそのような異常を気付かなかった。私はいつも検出したい(動きの順序)ためのしきい値を使用しなければならず、 "任意"の動きイベントを検出しようとはしませんでした。 –

+0

コードを追加しました。うまくいけば、これは私が聞いているイベントについて助けになるだろう。 – MattieG

答えて

0

このデモコードを試してみてください。私はそれが動作し、グラフを作成知っています。

http://www.5laida.com/docs/android/samples/Sensors.html

私はいくつかのデバイス上でこのコードをテストしてみた...だから、同じグリッチを示している場合、それはおそらく、あなたのデバイスです。

+0

はい、もちろんです!それは私の愚かだった。ソースを含めるように編集しました。私は主にC/C++の開発者であると警告しなければならないが、私のJavaはかなり錆びている。だから、コード内で何か間違ったことをしている可能性があります。私はちょうどこの言語の直感がありません。 – MattieG

0

何が起こっているのか分かりました。私はこの行を含める必要がありました:

 if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE){ 
     return; 
    } 

しかし、これでジャイロスコープからの値は得られません。うーん...

+0

そしてその質問に対する答えは次のとおりです:http://stackoverflow.com/questions/5985514/android-xoom-accelererometer-accuracy-is-always-unreliable/6141875#6141875 – MattieG

+0

私はイベントのソースを見ていません。精度やSensor_Status_unrelaible ..しかし、event.accuarcyは数値を出力します..それは多分あなたはしきい値を設定することができます。あなたのグラフを見ると、問題は完全に低下しています。変更が迅速かつ劇的に行われる場合は、if文を使用して変更を除外することができます。すべてのデバイスをサポートすることは困難です。特に、OSの違いだけでなく、物理的な電話機の品質も重要です。 – DJPlayer

+0

溶液におめでとう。あなたができるときは、あなたの答えを「受け入れられた」とマークして、他の人があなたの成功から学ぶかもしれないようにしてください。乾杯〜 –