2013-08-20 3 views
1

Я работаю над своими исследованиями, чтобы точно определить шаг пользователя, используя датчики в телефоне android. В основном я использовал датчик акселерометра для определения ступни ноги. Я использовал метод для получения данных акселерометра и поиска метода удаления нежелательных шумов данных акселерометра. Я обнаружил, что линеаризация данных является хорошим методом. Но я не знаю, как это сделать. Я думаю, что он получает медианную ценность. Поэтому я не нашел способ получить медианное значение в режиме реального времени. Может ли кто-нибудь предложить мне лучший метод lenearization для удаления шума данных акселерометра.Линеаризация данных датчика андроида (акселерометр)

вот мой код. (Я использовал библиотеку 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

Можно ли использовать любую библиотеку? Как я могу использовать это с моей кодировкой? Сожалею. Im новое для android. Это исследование в моем колледже. – dit1679