[android] #2864 - improved compass update cycle, removed lowpassfilter

[android] #2864 changed currentTimeInMills with elapsedRealtime
This commit is contained in:
Tobrun
2015-10-29 16:59:43 +01:00
parent f2e5170693
commit 01274a5b40

View File

@@ -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);
}
}
}