簡體   English   中英

android傳感器數據的線性化(加速度計)

[英]Linearization of android sensor data (Accelerometer)

我正在研究如何使用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){



    }


}

有多種算法可以消除數據中的噪聲,需要做一些實驗才能找出最好的算法。 當我上次不得不弄弄遙測數據時,我讓Android將其放入CSV,然后使用R對其進行了分析。但是,如果您堅持使用Java,則可以看看它們的共同點。 卡爾曼濾波器 一個例子:

    // 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);

希望這可以幫助。 如果您需要進一步的幫助,請隨時發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM