从GPS点之间的距离计算速度时出现错误

时间:2019-09-06 12:16:37

标签: python gps kalman-filter

我正在使用卡尔曼滤波器来跟踪车辆的位置,并且为了进行测量,我有一个GPX文件(WGS84格式),其中包含有关GPS给出的每个点的纬度,经度,海拔和时间戳信息。使用此数据,我计算了GPS点之间的距离(使用测地距离和Vincenty公式),并且由于知道了时间戳信息,因此可以使用两点之间的时间差来计算时间增量。由于现在我们有了点之间的距离和时间增量,因此我们可以计算速度(=点之间的距离/时间增量),然后还可以将其用作卡尔曼的测量输入。

但是,我已经读到这只是平均速度,而不是任何给定点的瞬时速度。为了获得瞬时速度,建议人们必须取移动平均值,并且某些实现方式会考虑该点当前时间与第一个初始点之间的时间差来直接计算速度。对于在python中实现该方法需要使用哪种方法,我有些困惑。

  1. 首先,在我的实现中使用的这种方法是否正确计算速度? (我也了解了可以使用的多普勒频移,但可悲的是,我仅通过iPhone上正在运行的应用程序(Strava)收集GPS数据)

  2. 如何从我的实现中计算出每个GPS点的瞬时速度?(还需要方位信息吗?)

  3. 该计算出的速度将导致什么误差? (由于iPhone本身的位置误差可能约为10米,距离测量的误差约为1mm,并考虑到我希望焦点尽可能地准确)

当前实施

import gpxpy
import pandas as pd
import numpy as np
from geopy.distance import vincenty, geodesic
import matplotlib.pyplot as plt

"Import GPS Data"
with open('my_run_001.gpx') as fh:
    gpx_file = gpxpy.parse(fh)
    segment = gpx_file.tracks[0].segments[0]
    coords = pd.DataFrame([
    {'lat': p.latitude,
     'lon': p.longitude,
     'ele': p.elevation,
     } for p in segment.points])

"Compute delta between timestamps"
times = pd.Series([p.time for p in segment.points], name='time')
dt = np.diff(times.values) / np.timedelta64(1, 's')

"Find distance between points using Vincenty and Geodesic methods"
vx = []
for i in range(len(coords.lat)-1):
        if(i<=2425):
            vincenty_distance = vincenty([coords.lat[i], coords.lon[i]],[coords.lat[i+1], coords.lon[i+1]]).meters
            vx.append(vincenty_distance)
print(vx)

vy = []
for i in range(len(coords.lat)-1):
        if(i<=2425):
            geodesic_distance = geodesic([coords.lat[i], coords.lon[i]],[coords.lat[i+1], coords.lon[i+1]]).meters
            vy.append(geodesic_distance)
print(vy)

"Compute and plot velocity"
velocity = vx/dt
time = [i for i in range(len(dt))]
plt.plot(velocity,time)
plt.xlabel('time')
plt.ylabel('velocity')
plt.title('Plot of Velocity vs Time')
plt.show()

GPX数据参考: https://github.com/stevenvandorpe/testdata/blob/master/gps_coordinates/gpx/my_run_001.gpx

1 个答案:

答案 0 :(得分:0)

有趣的话题在这里

如果您打算使用独立的GPS位置输出来计算物体的速度,请准备好一些不确定的结果。如您所知,在整个过程中会有一定的传播延迟,因此您需要注意一些信息。

1。 基本上,获取距离和时间,然后基于这些增量计算速度是正确的方法,但是正如您所知道的,这是两次gps测量之间的平均速度,因为gps本质上具有一定的传播延迟。

2。 就像我们已经讲过的那样,这种计算方式使我们得到的平均速度是变化的时间和距离的函数,从本质上讲,我们不能改变它。我们可以做的是影响gps信号的采样频率,并以此来增加或减少系统的实时精度。

建议:如果希望获得更准确的实时速度数据,建议您使用手机的陀螺仪传感器并处理其输出。从GPS收集第一增量(平均)速度,然后检测陀螺仪变化将是继续您的想法的有趣方式。

3。 假设您正在使用设备行走(或超速运行:)。有一瞬间,设备正在发送GPS定位请求,但由于某些问题(可能是卫星连接不良),您获得了10秒钟延迟的数据响应。出于示例目的,让我们考虑您正在表面的绝对平坦部分上的绝对直线上行走:)从收到的最后一个请求开始1分钟后,您正在发送另一个gps定位请求,并且您收到了告诉您已经行走的数据距您先前的测量以北300m,延迟了2秒。如果从发送请求到发送另一个请求进行测量,则您的速度为300/70 = 4.28 m / s(相当惊人的速度),但是实际可能的情况之一是: -您没有走300m,而是走了270 m(gps错误) -两次测量之间的时间(收到)约为62s -您以270/62 = 4.84 m / s的速度甚至更快

使用电话,您无法衡量您何时实际在以太中发送请求或何时以毫秒为单位获得响应,而当您在硬件邻近层上操纵传感器时,这些事情很有可能实现。因此,您一定会失去一些准确性。