You have compass application already in android sample code.Have a look on that
On Sun, Jun 24, 2012 at 2:52 AM, axesh ajmera <[email protected]> wrote: > Hi Guys, > I need your help on developing an android compass > application.Here is the source code...I want to know if i am using correct > algorithm and sensors for developing the app and secondly I am unable to > understand why my compass jitters so much > > package com.android.compass.example > > import android.app.Activity; > import android.hardware.Sensor; > import android.hardware.SensorEvent; > import android.hardware.SensorEventListener; > import android.hardware.SensorManager; > import android.os.Bundle; > > public class CompassExample4Activity extends Activity implements > SensorEventListener{ > private SensorManager mSensorManager; > CompassView mCompassView; > Sensor accelerometer; > Sensor magnetometer; > float azimut; > float[] mGravity; > float[] mGeomagnetic; > static final float ALPHA = 0.2f; > double SmoothFactorCompass = 0.5; > double SmoothThresholdCompass = 30.0; > double oldCompass = 0.0; > int oldCompass2 = 0; > /** Called when the activity is first created. */ > @Override > public void onCreate(Bundle savedInstanceState) { > super.onCreate(savedInstanceState); > mCompassView = new CompassView(this); > //this.setRequestedOrientation(0); > setContentView(mCompassView); > > mSensorManager = (SensorManager)getSystemService(SENSOR_SERVICE); > accelerometer = > mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); > magnetometer = > mSensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD); > } > > @Override > public void onResume() { > super.onResume(); > mSensorManager.registerListener(this, accelerometer, > SensorManager.SENSOR_DELAY_UI); > mSensorManager.registerListener(this, magnetometer, > SensorManager.SENSOR_DELAY_UI); > } > @Override > public void onPause() { > super.onPause(); > mSensorManager.unregisterListener(this); > } > > @Override > public void onAccuracyChanged(Sensor sensor, int accuracy) { > // TODO Auto-generated method stub > } > > @Override > public void onSensorChanged(SensorEvent event) { > // TODO Auto-generated method stub > if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) > mGravity = lowPass(event.values, mGravity); > if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) > mGeomagnetic = lowPass(event.values, mGeomagnetic); > > if (mGravity != null && mGeomagnetic != null) { > float R[] = new float[9]; > float I[] = new float[9]; > boolean success = SensorManager.getRotationMatrix(R, I, mGravity, > mGeomagnetic); > // Correct if screen is in Landscape > SensorManager.remapCoordinateSystem(R, SensorManager.AXIS_X, > SensorManager.AXIS_Z, R); > > if (success) { > float orientation[] = new float[3]; > SensorManager.getOrientation(R, orientation); > float azimut = orientation[0]; // orientation contains: azimut, > pitch and roll > //float azimuth = (float) > Math.round((Math.toDegrees(orientation[0]))*7)/7; > //azimuth = ( azimuth + 360)%360; > > > > mCompassView.updateDirection((float)smoothnessFunction(azimut*360/(2*3.14159f))); > //mCompassView.updateDirection(azimuth); > } > } > } > protected float[] lowPass( float[] input, float[] output ) { > if ( output == null ) return input; > > for ( int i=0; i<input.length; i++ ) { > output[i] = output[i] + ALPHA * (input[i] - output[i]); > } > return output; > } > public double smoothnessFunction( double newCompass) { > if (Math.abs(newCompass - oldCompass) < 180) { > if (Math.abs(newCompass - oldCompass) > SmoothThresholdCompass) { > oldCompass = newCompass; > } > else { > oldCompass = oldCompass + SmoothFactorCompass * (newCompass - > oldCompass); > } > } else { > if (360.0 - Math.abs(newCompass - oldCompass) > > SmoothThresholdCompass) { > oldCompass = newCompass; > } else { > if (oldCompass > newCompass) { > oldCompass = (oldCompass + SmoothFactorCompass * ((360 + > newCompass - oldCompass) % 360) + 360) % 360; > } else { > oldCompass = (oldCompass - SmoothFactorCompass * ((360 - > newCompass + oldCompass) % 360) + 360) % 360; > } > } > } > return oldCompass; > } > public int smoothnessFunction2(double newCompass){ > if ((int)newCompass % 360 != oldCompass2) { > oldCompass2 = (int) newCompass; > } > return oldCompass2; > } > } > > -- > You received this message because you are subscribed to the Google > Groups "Android Developers" group. > To post to this group, send email to [email protected] > To unsubscribe from this group, send email to > [email protected] > For more options, visit this group at > http://groups.google.com/group/android-developers?hl=en -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/android-developers?hl=en

