мое приложение основано на данных GPS, и для этого я использую Fused-location-provider
. Время от времени я видел, что есть дрожание GPS, и некоторые координаты GPS не соответствуют дороге. Это неприемлемо. Что я пытался сделать, так это реализовать Kalman filter
, и я сделал:
fun process(
newSpeed: Float,
newLatitude: Double,
newLongitude: Double,
newTimeStamp: Long,
newAccuracy: Float
) {
if (variance < 0) { // if variance < 0, object is unitialised, so initialise with current values
setState(newLatitude, newLongitude, newTimeStamp, newAccuracy)
} else { // else apply Kalman filter
val duration = newTimeStamp - timeStamp
if (duration > 0) { // time has moved on, so the uncertainty in the current position increases
variance += duration * newSpeed * newSpeed / 1000
timeStamp = newTimeStamp
}
val k = variance / (variance + newAccuracy * newAccuracy)
latitude += k * (newLatitude - latitude)
longitude += k * (newLongitude - longitude)
variance *= (1 - k)
retrieveLocation(newSpeed, longitude, latitude, duration, newAccuracy)
}
}
И я использую его всякий раз, когда получаю новое местоположение, как
KalmanFilter.process(
it.newSpeed,
it.newLatitude,
it.newLongitude,
it.newTimeStamp,
it.newAccuracy
)
Это помогло получить чуть более точные результаты, но все же - не устранило дрожание GPS вне дороги (см. изображение):
Вещи, которые я хочу знать:
- Правильно ли реализован мой фильтр Калмана? Есть ли способ улучшить текущее решение?
- Как избежать сценариев, где координаты находятся за пределами дороги? (Что-то похожее на функцию привязки к дорогам, но как алгоритм внутри приложения)