package com.dronecontrol.perceptual.components.filters; import com.google.inject.Inject; import com.dronecontrol.perceptual.data.body.Coordinate; import java.util.Date; import static com.dronecontrol.perceptual.helpers.CoordinateHelper.add; import static com.dronecontrol.perceptual.helpers.CoordinateHelper.divide; public class SlidingFilter implements Filter { private static final long SLIDE_WINDOW_TIME = 4000; private KalmanFilterLinear2D activeFilter; private KalmanFilterLinear2D backgroundFilter; private long lastResetTimeStamp; @Inject public SlidingFilter(KalmanFilterLinear2D filter1, KalmanFilterLinear2D filter2) { activeFilter = filter1; backgroundFilter = filter2; lastResetTimeStamp = getCurrentTimeStamp(); } public Coordinate getFilteredCoordinate(Coordinate coordinate) { if (coordinate == null) { return activeFilter.updateAndGetCoordinate(coordinate); } swapCoordinatesIfNecessary(coordinate); return getCoordinate(backgroundFilter.updateAndGetCoordinate(coordinate), activeFilter.updateAndGetCoordinate(coordinate)); } private Coordinate getCoordinate(Coordinate coordinate1, Coordinate coordinate2) { return divide(add(coordinate1, coordinate2), 2.0f); } private void swapCoordinatesIfNecessary(Coordinate coordinate) { if (getTimeSinceLastReset() > SLIDE_WINDOW_TIME / 2) { lastResetTimeStamp = getCurrentTimeStamp(); swapFilters(); resetBackgroundFilter(coordinate); } } private long getTimeSinceLastReset() { return getCurrentTimeStamp() - lastResetTimeStamp; } private long getCurrentTimeStamp() { return new Date().getTime(); } private void swapFilters() { KalmanFilterLinear2D tempFilter = activeFilter; activeFilter = backgroundFilter; backgroundFilter = tempFilter; } private void resetBackgroundFilter(Coordinate coordinate) { backgroundFilter.resetFilter(coordinate); } }