2013-08-20 60 views
1

我正在研究使用android手机中的传感器准确检测用户的脚步。我主要使用加速计传感器来检测脚踏。我使用了一种方法来获取加速度计数据并搜索一种方法来去除加速度计数据中不需要的噪声。我发现数据的线性化是一个好方法。但我没有太清楚的想法如何去做。我认为它是一种获得中位值的方式。所以我没有找到实时获取中值的方法。任何人都可以建议我更好的lenearization方法来消除加速度计数据的噪音。android传感器数据的线性化(加速度计)

这里是我的代码。(我使用了一个NChart库画一个图表中我的加速度计数据。)

package com.android.gait; 

import org.achartengine.GraphicalView; 

import android.hardware.Sensor; 
import android.hardware.SensorEvent; 
import android.hardware.SensorEventListener; 
import android.hardware.SensorListener; 

import android.hardware.SensorManager; 
import android.os.Bundle; 
import android.app.Activity; 
import android.content.Context; 
import android.view.Menu; 
import android.view.View; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

public class MainActivity extends Activity implements SensorEventListener{ 

    private int count=0; 
    private static GraphicalView view; 
    private LineGraph line = new LineGraph(); 
    private static Thread thread; 
    private SensorManager mSensorManager; 
    private Sensor mAccelerometer; 
    TextView title,tv,tv1,tv2; 
    RelativeLayout layout; 
    private static Point p; 
static float m = 0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     //get the sensor service 
      mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
      //get the accelerometer sensor 
      mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); 
      //get layout 
      layout = (RelativeLayout)findViewById(R.id.relative); 
      LinearLayout layout = (LinearLayout) findViewById(R.id.layoutC); 
      view= line.getView(this); 
      layout.addView(view); 
      //get textviews 
      title=(TextView)findViewById(R.id.name); 
      tv=(TextView)findViewById(R.id.xval); 
      tv1=(TextView)findViewById(R.id.yval); 
      tv2=(TextView)findViewById(R.id.zval); 

      thread = new Thread(){ 
      int iniX=0; 
       public void run() 
       { 
       while(true) 
       { 

        try { 
         Thread.sleep(1); 
        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
        iniX=+1; 

        line.addNewPoint(iniX,m); 
        view.repaint(); 
        } 
       } 


      }; 

      thread.start(); 


    } 

     public final void onAccuracyChanged(Sensor sensor, int accuracy) 
     { 
     // Do something here if sensor accuracy changes. 
     } 
    @Override 
    public final void onSensorChanged(SensorEvent event) 
     { 
     count=+1; 
     // Many sensors return 3 values, one for each axis. 
     float x = event.values[0]; 
     float y = event.values[1]; 
     float z = event.values[2]; 

     //get merged value 
     m = (float) Math.sqrt(x*x+y*y+z*z); 


     // p =MockData.getDataFromReceiver(count, m); 


     //display values using TextView 
     title.setText(R.string.app_name); 
     tv.setText("X axis" +"\t\t"+x); 
     tv1.setText("Y axis" + "\t\t" +y); 
     tv2.setText("Z axis" +"\t\t" +z); 
     } 

    @Override 
    protected void onResume() 
    { 
    super.onResume(); 
    mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 
    @Override 
    protected void onPause() 
    { 
    super.onPause(); 
    mSensorManager.unregisterListener(this); 
    } 

    public void LineGraphHandler(View view){ 



    } 


} 

回答

0

存在不同的算法,从数据去除噪声和实验的一个比特需要找出哪一个最好。当我最后不得不揉乱遥测数据时,我把Android放到了一个CSV文件中,然后使用R进行分析。但是,如果你使用Java,我会看看commons-math,特别是他们的Kalman filter。一个例子:

// discrete time interval 
    double dt = 0.1d; 
    // position measurement noise (meter) 
    double measurementNoise = 10d; 
    // acceleration noise (meter/sec^2) 
    double accelNoise = 0.2d; 

    // A = [ 1 dt ] 
    //  [ 0 1 ] 
    RealMatrix A = new Array2DRowRealMatrix(new double[][] { { 1, dt }, { 0, 1 } }); 

    // B = [ dt^2/2 ] 
    //  [ dt  ] 
    RealMatrix B = new Array2DRowRealMatrix(
      new double[][] { { Math.pow(dt, 2d)/2d }, { dt } }); 

    // H = [ 1 0 ] 
    RealMatrix H = new Array2DRowRealMatrix(new double[][] { { 1d, 0d } }); 

    // x = [ 0 0 ] 
    RealVector x = new ArrayRealVector(new double[] { 0, 0 }); 

    RealMatrix tmp = new Array2DRowRealMatrix(
      new double[][] { { Math.pow(dt, 4d)/4d, Math.pow(dt, 3d)/2d }, 
          { Math.pow(dt, 3d)/2d, Math.pow(dt, 2d) } }); 

    // Q = [ dt^4/4 dt^3/2 ] 
    //  [ dt^3/2 dt^2 ] 
    RealMatrix Q = tmp.scalarMultiply(Math.pow(accelNoise, 2)); 

    // P0 = [ 1 1 ] 
    //  [ 1 1 ] 
    RealMatrix P0 = new Array2DRowRealMatrix(new double[][] { { 1, 1 }, { 1, 1 } }); 

    // R = [ measurementNoise^2 ] 
    RealMatrix R = new Array2DRowRealMatrix(
      new double[] { Math.pow(measurementNoise, 2) }); 

    // constant control input, increase velocity by 0.1 m/s per cycle 
    RealVector u = new ArrayRealVector(new double[] { 0.1d }); 

    ProcessModel pm = new DefaultProcessModel(A, B, Q, x, P0); 
    MeasurementModel mm = new DefaultMeasurementModel(H, R); 
    KalmanFilter filter = new KalmanFilter(pm, mm); 

希望这会有所帮助。如果您需要更多帮助,请随时发表评论。

+0

这是使用任何库吗?我如何在编码中使用它?抱歉。我新来android。这是我大学的一项研究。 – dit1679