Dynamically update object position using accelerometer and gyroscope

I am starting to program in Android. Below is a program that updates the current position of an object using the accelerometer and gyroscope readings. My goal is to update the position of the object on the screen. Currently the program output is just a display of the object and it doesn't update it. Can you suggest me where I am going wrong.

Mainactivity.java

public class MainActivity extends Activity implements SensorEventListener {

    CustomDrawableView mCustomDrawableView = null;
    ShapeDrawable mDrawable = new ShapeDrawable();

    int UPDATE_THRESHOLD=20;
    Sensor accelerometer,gyroscope;
    SensorManager sm,sm1;
    TextView acceleration,rotation,c_x,c_y;
    long mLastUpdate;

    public static int x;
    public static int y;


    double GRAVITY_THRESH = 12;

    double one_step_freeze = 0;
    double SENSOR_INTERVAL = 0.02;
    double STEP_INTERVAL_THRESH = 0.4;
    double init_x = 1;
    double init_y = 0;
    double init_theta = 0;
    static int ACCE_FILTER_DATA_MIN_TIME = 20; // 1000ms
    long lastSaved = System.currentTimeMillis();
    double step_counter = 0;
    double current_x,current_y;


    double one_step_happend = 0;
    double accumulated_rad = 0;
    double trace_x = init_x;
    double trace_x_particle = init_x;
    double trace_y = init_y;
    double trace_y_particle = init_y;
    double last_x = init_x;
    double last_y = init_y;
    double last_theta = init_theta;

    double z_gy;

    float acc_z,acc_x,acc_y;
    SensorEventListener mSensorListenerAcc,mSensorListenerGyro;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);

         //setContentView(R.layout.activity_main);
         sm=(SensorManager)getSystemService(SENSOR_SERVICE);
         sm1=(SensorManager)getSystemService(SENSOR_SERVICE);

         mCustomDrawableView = new CustomDrawableView(this);
         setContentView(mCustomDrawableView);

         accelerometer=sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
         gyroscope=sm1.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
         sm.registerListener(this, accelerometer,     SensorManager.SENSOR_DELAY_NORMAL );
               sm1.registerListener(this,gyroscope,SensorManager.SENSOR_DELAY_NORMAL);
    //acceleration=(TextView)findViewById(R.id.acceleration);
    //rotation=(TextView)findViewById(R.id.rotation);
   // c_x=(TextView)findViewById(R.id.c_x);
    //c_y=(TextView)findViewById(R.id.c_y);
}
/*@Override
protected void onResume()
{
    super.onResume();
    //sm.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
    sm.registerListener(mSensorListenerAcc, accelerometer, SensorManager.SENSOR_DELAY_FASTEST);
    sm1.registerListener(mSensorListenerGyro, gyroscope,SensorManager.SENSOR_DELAY_FASTEST);
    //mLastUpdate=System.currentTimeMillis();
}

@Override
protected void onPause()
{
    sm.unregisterListener(this);
}*/




@Override
public void onSensorChanged(SensorEvent event) {
  /*  long actualTime = System.currentTimeMillis();
    if(actualTime-mLastUpdate > UPDATE_THRESHOLD){
        mLastUpdate=actualTime;

    }*/
    if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {

        /*rotation.setText("Xg: " + event.values[0] +
                "\nYg: " + event.values[1] +
                "\nZg: " + event.values[2]);*/
        z_gy= event.values[2];


    }

    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {



       /* acceleration.setText("X: " + event.values[0] +
                "\nY: " + event.values[1] +
                "\nZ: " + event.values[2]);*/
        acc_x=event.values[1];
        acc_y=event.values[2];
        acc_z = event.values[2];
        System.out.println("acc_z:" + Float.toString(acc_z));
        if (acc_z > GRAVITY_THRESH && one_step_freeze == 0) {
            System.out.println("entering1oop1");
            one_step_happend = 1;
            step_counter = step_counter + 1;
            System.out.println("stepcounter: " + Double.toString(step_counter) + "==========================");
            one_step_freeze = STEP_INTERVAL_THRESH / SENSOR_INTERVAL;
            /*System.out.println("onestepfreeze_in_firstloop_aft_div: " + Double.toString(one_step_freeze));
            System.out.println("exitingloop1");*/
        }

        if (one_step_freeze > 0) {
                System.out.println("stepcounterin 2 loop: " + Double.toString(step_counter) + "==========================");
                if ((System.currentTimeMillis() - lastSaved) > ACCE_FILTER_DATA_MIN_TIME) {
                    lastSaved = System.currentTimeMillis();
                    one_step_freeze = one_step_freeze - 1;
                   /* System.out.println("onestepfreeze2:" + Double.toString(one_step_freeze));
                    System.out.println("exitin 2loop");*/

                }
            }
        if(one_step_happend==1){
           // System.out.println("entered 3 loop:");
            last_theta=accumulated_rad+last_theta;
           // System.out.println("last_theta value: "+last_theta);
            current_x=last_x+STRIDE_LENGTH*Math.cos(last_theta);
            System.out.println("current_x value: " + current_x);
            current_y=last_y+STRIDE_LENGTH*Math.sin(last_theta);
            //System.out.println("current_y value: " + current_y);
           // System.out.println("processing c_x");
            //c_x.setText("c_x:" + current_x);
          //  System.out.println("processing c_y");
            //c_y.setText("c_y:" + current_y);
            last_x = current_x;
           // System.out.println("last_x value: " + last_x);

            last_y = current_y;
           // System.out.println("last_y value: "+last_y);
            accumulated_rad = 0;
            one_step_happend = 0;

        }else{
            accumulated_rad= accumulated_rad + z_gy * SENSOR_INTERVAL;
            System.out.println("accumulatedrad: "+accumulated_rad);
        }
        }




       /*if ((acc_z > GRAVITY_THRESH) && (one_step_freeze == 0)) {
           one_step_happend = 1;
           step_counter = step_counter + 1;
           System.out.println("stepcounter: " + Double.toString(step_counter) + "==========================");
           one_step_freeze = STEP_INTERVAL_THRESH / SENSOR_INTERVAL;
           //System.out.println("onestepfreeze2:"+Double.toString(one_step_freeze)+"==========================");
               /*spcounter.setText((int) step_counter);
       }*/
       /*if (one_step_freeze > 0) {
           if ((System.currentTimeMillis() - lastSaved) > ACCE_FILTER_DATA_MIN_TIME) {
               lastSaved = System.currentTimeMillis();
               one_step_freeze = one_step_freeze - 1;
               System.out.println("onestepfreeze2:" + Double.toString(one_step_freeze));
           }
       }
       if (one_step_happend == 1) {

           last_theta = accumulated_rad + last_theta;
           double current_x = last_x + STRIDE_LENGTH * Math.cos(last_theta);
           double current_y = last_y + STRIDE_LENGTH * Math.sin(last_theta);
           c_x.setText((int) current_x);
           c_y.setText((int)current_y);
                /*trace_x = [trace_x current_x];
                trace_y = [trace_y current_y];
           last_x = current_x;
           //System.out.println("last_x"+last_x);
           last_y = current_y;
           //System.out.println("last_y"+last_y);
           accumulated_rad = 0;
           one_step_happend = 0;
       } *//*else {
           accumulated_rad = accumulated_rad + z_gy * SENSOR_INTERVAL;
           //System.out.println(accumulated_rad);
              /*  calculate(accumulated_rad);

       }
   }

      

* /

}
@Override
protected void onResume()
{
    super.onResume();
    // Register this class as a listener for the accelerometer sensor
    sm.registerListener(this, sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
            SensorManager.SENSOR_DELAY_NORMAL);
    // ...and the orientation sensor
    sm1.registerListener(this, sm1.getDefaultSensor(Sensor.TYPE_ORIENTATION),
            SensorManager.SENSOR_DELAY_NORMAL);
}

@Override
protected void onStop()
{
    // Unregister the listener
    sm.unregisterListener(this);
    super.onStop();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {

}
public class CustomDrawableView extends View
{
    static final int width = 50;
    static final int height = 50;

    public CustomDrawableView(Context context)
    {
        super(context);

        mDrawable = new ShapeDrawable(new OvalShape());
        mDrawable.getPaint().setColor(0xff74AC23);
        mDrawable.setBounds((int) current_x, (int) current_y, (int) current_x + width, (int) current_y + height);
        //mDrawable.setBounds((int)acc_x, (int)acc_y, (int)acc_x + width,(int) acc_y + height);
    }

    protected void onDraw(Canvas canvas)
    {
       /* x= (int)current_x;
        y= (int)current_y;*/
        RectF oval = new RectF(MainActivity.x, MainActivity.y, MainActivity.x + width, MainActivity.y
                + height); // set bounds of rectangle
        Paint p = new Paint(); // set some paint options
        p.setColor(Color.BLUE);
        canvas.drawOval(oval, p);
        invalidate();
    }
}

      

}

+3


source to share





All Articles