在 Android 中使用 Fusion Provider 实现卡尔曼滤波器以获取 GPS 位置
Posted
技术标签:
【中文标题】在 Android 中使用 Fusion Provider 实现卡尔曼滤波器以获取 GPS 位置【英文标题】:Implementing Kalman filter with Fusion Provider in Android for GPS positions 【发布时间】:2015-07-06 13:10:39 【问题描述】:我必须实施卡尔曼滤波器以获得更好的 GPS 位置精度...我使用随机解决方案 (Smooth GPS data)。在 ValidPosition 我有一些检查,如:
public boolean checkPosition(Location location)
if (( location != null ) &&
(distance != 0) &&
(distance > MINIMUM_DISTANCE) && // 10 metres
(location.hasSpeed()) &&
(location.getSpeed() > 0) &&
(averageTime < HUMANSPEED) &&
(location.hasAccuracy()) &&
(location.getAccuracy() < MINIMUM_ACCURACY) &&
(isBetterLocation(location, lastLocation)) // From Google example in http://developer.android.com/guide/topics/location/strategies.html#BestPerformance
return true;
return false;
现在,在我的 Location Fusion Provider 主课中,我有这个:
public static final int ACCURACY_DECAYS_TIME = 3; // Metres per second
private KalmanLatLong kalmanLatLong = new KalmanLatLong(ACCURACY_DECAYS_TIME);
private ValidPosition validPosition = new ValidPosition();
@Override
public void onLocationChanged(Location location)
if(validPosition.checkPosition(location))
kalmanLatLong.process(
location.getLatitude(),
location.getLongitude(),
location.getAccuracy(),
location.getTime());
mCallback.handleNewLocation(location);
`
现在呢?如何使用卡尔曼预测?我在这里用随机代码写了什么?
// TODO: USE VELOCITY INFORMATION HERE TO GET A BETTER ESTIMATE OF CURRENT POSITION
谢谢
【问题讨论】:
GPS芯片输出的GPS位置已经经过了严重的卡尔曼滤波,比离开芯片后的滤波输入信息要多得多。我怀疑在任何后期处理卡尔曼滤波器之后数据会变得更好。只需确保在位置或汽车静止时过滤位置即可。 嗨,用什么方法?当 getSpeed 为零时,我拒绝那些职位?例如,在没有过滤器的情况下,我得到了第一个 LatLng 坐标,但第二个 LatLng 距离第一个坐标 100 米,所以我猜用户不太可能在几秒钟内移动 100 米...... 【参考方案1】:您忘记从kalmanLatLong
对象返回处理结果。
你需要做这样的事情:
if(validPosition.checkPosition(location))
kalmanLatLong.process(
location.getLatitude(),
location.getLongitude(),
location.getAccuracy(),
location.getTime());
location.setLatitude(kalmanLatLong.get_lat());
location.setLongitude(kalmanLatLong.get_lng());
location.setAccuracy(kalmanLatLong.get_accuracy());
mCallback.handleNewLocation(location);
关于你的第二个问题,我认为这不是小事,应该更多地基于实验数据。在大多数情况下,线性衰减的简单假设效果很好。
【讨论】:
您好,感谢您的回复...卡尔曼滤波器是一种预测,对吧?如果我在您的代码中设置数据,这是预测吗?我必须检查我的位置是否是卡尔曼的有效位置。在这种情况下,我设置了一个预测,而不是真实的位置(或者没有?:P)另外,在 TODO 中我必须对速度做些什么?亲切的问候:) 这样的?if (predictedLocation.distanceTo(location) < 10m) // Hadle new location
哦,所以你想预测?对不起,我最初没有理解你的问题。卡尔曼滤波器最初是一个噪声滤波器(在原始问题中被描述为跳跃)。它消除了传感器噪声并平滑了传感器输出。要进行预测,您需要以任意较低的准确度向卡尔曼滤波器提供您的预测位置(如预测是一个单独的滤波器)。您不会提高预测的准确性,但可以减少位置更新之间的时间。你想这样做吗?
或者您也可以尝试使用其他传感器数据(如加速度计和指南针数据)预测位置,然后将此预测输入卡尔曼滤波器。如果做得好,这将提高定位精度。您如何预测新位置取决于您的实际用途(汽车、机器人、人类、自行车)。例如,人类会经常旋转设备,因此指南针数据不是很有用。
我知道,如果我有一个位置,卡尔曼滤波器会告诉我预测位置...使用来自卡尔曼滤波器的 predictLocation 和 if (predictedLocation.distanceTo(location) < 10m) // Hadle new location
我得到的结果还不错,只是幸运?以上是关于在 Android 中使用 Fusion Provider 实现卡尔曼滤波器以获取 GPS 位置的主要内容,如果未能解决你的问题,请参考以下文章
正如 Fusion Location Provider API 所声称的那样,位置更新在室内不起作用