Search code examples
androidcanvasandroid-sensors

How to convert Yaw,Roll & Pitch values to (x,y) coordinates?


Hi In my app I need to create an gyroscope.So for this I am using following code.

public class AccessGyroscope extends Activity implements SensorEventListener
{
    private TextView tv;
    private SensorManager sManager;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        tv = (TextView) findViewById(R.id.tv);
        sManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    }

    @Override
    protected void onResume() 
    {
        super.onResume();
        sManager.registerListener(this, sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_FASTEST);
    }

    @Override
    protected void onStop() 
    {
        sManager.unregisterListener(this);
        super.onStop();
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1) 
    {
    }

    @Override
    public void onSensorChanged(SensorEvent event) 
    {
        if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE)
        {
            return;
        }

        tv.setText("Orientation X (Roll) :"+ Float.toString(event.values[2]) +"\n"+
                   "Orientation Y (Pitch) :"+ Float.toString(event.values[1]) +"\n"+
                   "Orientation Z (Yaw) :"+ Float.toString(event.values[0]));
    }
}

I can get the Yaw,Roll & Pitch values but I want to show this in 2d plane. Basically I want view like this Gyroscope View.

The red dot should move according to the orientation of device. I can work on canvas to prepare that view.But what I really want is those coordinates related to Yaw,Roll & Pitch values.

Please help


Solution

  • Finally I found the answer.

    First instead of using TYPE_ORIENTATION I used TYPE_GRAVITY.

    Here is my Complete code.

    Code for my custom view is..

    public class GyroscopeView extends View
    {
        private final static String TAG = "GyroscopeView";
    
        private float bearing;
        float pitch = 0;
        float roll = 0;
    
        private Paint paintOuter;
        private Paint paintInner;
        private Paint paintDot;
    
        float pointX, pointY;
        float dotX, dotY;
        int radius;
    
        public GyroscopeView(Context context, AttributeSet attrs, int defStyle)
        {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
            initCompassView();
        }
    
        public GyroscopeView(Context context, AttributeSet attrs)
        {
            super(context, attrs);
            // TODO Auto-generated constructor stub
            initCompassView();
        }
    
        public GyroscopeView(Context context)
        {
            super(context);
            // TODO Auto-generated constructor stub
            initCompassView();
        }
    
        protected void initCompassView()
        {
            setFocusable(true);
    
            Resources r = this.getResources();
    
            paintOuter = new Paint(Paint.ANTI_ALIAS_FLAG);
            paintOuter.setColor(Color.WHITE);
            paintOuter.setStrokeWidth(1);
            paintOuter.setStyle(Paint.Style.FILL_AND_STROKE);
    
            paintInner = new Paint(Paint.ANTI_ALIAS_FLAG);
            paintInner.setColor(Color.BLUE);
            paintInner.setStrokeWidth(1);
            paintInner.setStyle(Paint.Style.STROKE);
    
            paintDot = new Paint(Paint.ANTI_ALIAS_FLAG);
            paintDot.setColor(Color.RED);
            paintDot.setStrokeWidth(1);
            paintDot.setStyle(Paint.Style.FILL_AND_STROKE);
    
        }
    
        @Override
        protected void onDraw(Canvas canvas)
        {
            // TODO Auto-generated method stub
            super.onDraw(canvas);
    
            int px = getMeasuredWidth() / 2;
            int py = getMeasuredHeight() / 2;
            radius = Math.min(px, py);
    
            pointX = px;
            pointY = py;
    
            canvas.drawCircle(pointX, pointY, radius, paintOuter);
    
            canvas.drawCircle(pointX, pointY, 40, paintInner);
            canvas.drawCircle(dotX, dotY, 5, paintDot);
    
        }
    
        void update(float z, float yy, float xx)
        {
    
            if (yy > 0)
            {
                dotY = pointY - ((1 - yy) * z);
            } else
            {
                dotY = pointY + ((1 - yy) * z);
            }
            if (xx > 0)
            {
                dotX = pointX - ((1 - xx) * z);
            } else
            {
                dotX = pointX + ((1 - xx) * z);
            }
            invalidate();
        }
    

    Here is my Activiy Code.

    public class GyroscopeActivity extends Activity
    {
        GyroscopeView gyroscopeView;
        SensorManager sensorManager;
    
        float[] gValues = new float[3];
    
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.gyroscope);
    
             gyroscopeView = (GyroscopeView) findViewById(R.id.gyroscope_view);
            initSensor();
        }
    
        void initSensor()
        {
            sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        }
    
        @Override
        protected void onResume()
        {
            super.onResume();
            Sensor sensorGyroscope = sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY);
            sensorManager.registerListener(sensorGyroListener, sensorGyroscope, SensorManager.SENSOR_DELAY_UI);
        }
    
        @Override
        protected void onStop()
        {
            sensorManager.unregisterListener(sensorGyroListener);
            super.onStop();
        }
    
        private final SensorEventListener sensorGyroListener = new SensorEventListener()
        {
            public void onSensorChanged(SensorEvent event)
            {
                if (event.sensor.getType() == Sensor.TYPE_GRAVITY)
                    gValues = event.values;
    
                gyroscopeView.update(gValues[0], gValues[1], gValues[2]);
            }
    
            public void onAccuracyChanged(Sensor sensor, int accuracy)
            {
            }
        };
    

    Hope this will help someone.