在 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) &lt; 10m) // Hadle new location 哦,所以你想预测?对不起,我最初没有理解你的问题。卡尔曼滤波器最初是一个噪声滤波器(在原始问题中被描述为跳跃)。它消除了传感器噪声并平滑了传感器输出。要进行预测,您需要以任意较低的准确度向卡尔曼滤波器提供您的预测位置(如预测是一个单独的滤波器)。您不会提高预测的准确性,但可以减少位置更新之间的时间。你想这样做吗? 或者您也可以尝试使用其他传感器数据(如加速度计和指南针数据)预测位置,然后将此预测输入卡尔曼滤波器。如果做得好,这将提高定位精度。您如何预测新位置取决于您的实际用途(汽车、机器人、人类、自行车)。例如,人类会经常旋转设备,因此指南针数据不是很有用。 我知道,如果我有一个位置,卡尔曼滤波器会告诉我预测位置...使用来自卡尔曼滤波器的 predictLocation 和 if (predictedLocation.distanceTo(location) &lt; 10m) // Hadle new location 我得到的结果还不错,只是幸运?

以上是关于在 Android 中使用 Fusion Provider 实现卡尔曼滤波器以获取 GPS 位置的主要内容,如果未能解决你的问题,请参考以下文章

正如 Fusion Location Provider API 所声称的那样,位置更新在室内不起作用

使用 virtualbox 在 Fusion 360 中渲染 [关闭]

fusuon360怎么整体调整比例

fusion360怎么打开点云数据

在 Fusion360 文件夹中公开查看模型

fusion app自定义事件源码介绍(下)