[android] #2864 - improved compass update cycle, removed lowpassfilter
[android] #2864 changed currentTimeInMills with elapsedRealtime
This commit is contained in:
@@ -37,8 +37,6 @@ import com.mapzen.android.lost.api.LocationRequest;
|
||||
import com.mapzen.android.lost.api.LocationServices;
|
||||
import com.mapzen.android.lost.api.LostApiClient;
|
||||
|
||||
import java.util.ArrayDeque;
|
||||
|
||||
final class UserLocationView extends View {
|
||||
|
||||
private MapView mMapView;
|
||||
@@ -382,8 +380,7 @@ final class UserLocationView extends View {
|
||||
private GeomagneticField mGeomagneticField;
|
||||
|
||||
// Controls the sensor update rate in milliseconds
|
||||
private static final int UPDATE_RATE_MS = 500;
|
||||
private AngleLowPassFilter mLowPassFilter;
|
||||
private static final int UPDATE_RATE_MS = 300;
|
||||
|
||||
// Compass data
|
||||
private float mCompassBearing;
|
||||
@@ -392,12 +389,11 @@ final class UserLocationView extends View {
|
||||
public MyBearingListener(Context context) {
|
||||
mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
|
||||
mSensorRotationVector = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
|
||||
mLowPassFilter = new AngleLowPassFilter();
|
||||
}
|
||||
|
||||
public void onStart(Context context) {
|
||||
mRotationDevice = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
|
||||
mSensorManager.registerListener(this, mSensorRotationVector, UPDATE_RATE_MS * 1000);
|
||||
mSensorManager.registerListener(this, mSensorRotationVector, UPDATE_RATE_MS * 2500);
|
||||
}
|
||||
|
||||
public void onStop() {
|
||||
@@ -414,6 +410,11 @@ final class UserLocationView extends View {
|
||||
return;
|
||||
}
|
||||
|
||||
long currentTime = SystemClock.elapsedRealtime();
|
||||
if (currentTime < mCompassUpdateNextTimestamp) {
|
||||
return;
|
||||
}
|
||||
|
||||
switch (event.sensor.getType()) {
|
||||
case Sensor.TYPE_ROTATION_VECTOR:
|
||||
SensorManager.getRotationMatrixFromVector(mRotationMatrix, event.values);
|
||||
@@ -432,19 +433,13 @@ final class UserLocationView extends View {
|
||||
break;
|
||||
}
|
||||
|
||||
mLowPassFilter.add(mOrientation[0]);
|
||||
long currentTime = System.currentTimeMillis();
|
||||
if (currentTime < mCompassUpdateNextTimestamp) {
|
||||
return;
|
||||
}
|
||||
|
||||
mCompassUpdateNextTimestamp = currentTime + UPDATE_RATE_MS;
|
||||
mGeomagneticField = new GeomagneticField(
|
||||
(float) mUserLocation.getLatitude(),
|
||||
(float) mUserLocation.getLongitude(),
|
||||
(float) mUserLocation.getAltitude(),
|
||||
currentTime);
|
||||
mCompassBearing = (float) Math.toDegrees(mLowPassFilter.average()) + mGeomagneticField.getDeclination();
|
||||
mCompassBearing = (float) Math.toDegrees(mOrientation[0] + mGeomagneticField.getDeclination());
|
||||
setCompass(mCompassBearing);
|
||||
}
|
||||
|
||||
@@ -452,32 +447,6 @@ final class UserLocationView extends View {
|
||||
public void onAccuracyChanged(Sensor sensor, int accuracy) {
|
||||
// TODO add accuracy to the equiation
|
||||
}
|
||||
|
||||
private class AngleLowPassFilter {
|
||||
|
||||
private final int LENGTH = 5;
|
||||
|
||||
private float sumSin, sumCos;
|
||||
|
||||
private ArrayDeque<Float> queue = new ArrayDeque<>();
|
||||
|
||||
public void add(float radians) {
|
||||
sumSin += (float) Math.sin(radians);
|
||||
sumCos += (float) Math.cos(radians);
|
||||
queue.add(radians);
|
||||
|
||||
if (queue.size() > LENGTH) {
|
||||
float old = queue.poll();
|
||||
sumSin -= Math.sin(old);
|
||||
sumCos -= Math.cos(old);
|
||||
}
|
||||
}
|
||||
|
||||
public float average() {
|
||||
int size = queue.size();
|
||||
return (float) Math.atan2(sumSin / size, sumCos / size);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user