【发布时间】:2019-11-21 11:24:40
【问题描述】:
我的应用程序基于 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 抖动(见图):
我想知道的事情:
- 我的卡尔曼滤波器是否正确实施?有没有办法改进当前的解决方案?
- 如何避免坐标在路外的场景? (类似于 snap-to-roads 功能,但作为应用程序内部的一种算法)
【问题讨论】:
-
接收器应该实现自己的卡尔曼滤波器,所以你的是多余的。尝试使用准确度值 - 当您的读数正确和不正确时检查准确度。我希望看到错误值的准确性较低。如果是这种情况 - 使用这些值过滤您的读数 - 如果它高于某个阈值 - 忽略该读数。
-
@TDG 感谢您的回复。我也过滤定位对象的精度,但精度只有 68%。还有什么我可以做的吗?
-
没有别的我能想到的,抱歉。
标签: android gps fusedlocationproviderapi